use std::sync::Arc; use pyo3::{exceptions::PyException, prelude::*}; use snafu::{ResultExt, Snafu}; #[derive(Debug, Clone, derive_more::Display)] pub struct UnexpectedState(pub Arc); #[derive(Debug, Snafu)] pub enum ExtractUnexpectedStateError { /// couldn't extract the object as a string ExtractStringError { source: PyErr }, } impl From for PyErr { fn from(error: ExtractUnexpectedStateError) -> Self { match &error { ExtractUnexpectedStateError::ExtractStringError { .. } => { PyException::new_err(error.to_string()) } } } } // TODO: replace with a derive(PyFromStr) (analogous to serde_with::DeserializeFromStr) once I make one impl<'a, 'py> FromPyObject<'a, 'py> for UnexpectedState { type Error = ExtractUnexpectedStateError; fn extract(ob: Borrowed<'a, 'py, PyAny>) -> Result { let s = ob.extract::().context(ExtractStringSnafu)?; let s = s.into(); Ok(UnexpectedState(s)) } }