1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
use crate::blending::params::Value;
use crate::errors::PConvertError;
use crate::parallelism::ThreadPoolStatus;
use pyo3::conversion::FromPyObject;
use pyo3::exceptions::{
PyAttributeError, PyException, PyIOError, PyNotImplementedError, PyTypeError,
};
use pyo3::prelude::*;
use pyo3::types::{IntoPyDict, PyBool, PyDict, PyFloat, PyInt, PyLong, PyString};
use pyo3::PyErr;
impl From<PConvertError> for PyErr {
fn from(err: PConvertError) -> PyErr {
match err {
PConvertError::ArgumentError(err) => PyAttributeError::new_err(err.to_string()),
PConvertError::ImageLibError(err) => PyException::new_err(err.to_string()),
PConvertError::UnsupportedImageTypeError => {
PyNotImplementedError::new_err(err.to_string())
}
PConvertError::IOError(err) => PyIOError::new_err(err.to_string()),
}
}
}
impl FromPyObject<'_> for Value {
fn extract(ob: &'_ PyAny) -> PyResult<Self> {
if let Ok(boolean) = ob.cast_as::<PyBool>() {
let boolean = boolean.is_true();
Ok(Value::Bool(boolean))
} else if let Ok(float) = ob.cast_as::<PyFloat>() {
let float = float.value();
Ok(Value::Float(float))
} else if let Ok(int) = ob.cast_as::<PyInt>() {
let int = int.extract::<i32>()?;
Ok(Value::Int(int))
} else if let Ok(long) = ob.cast_as::<PyLong>() {
let long = long.extract::<i64>()?;
Ok(Value::Long(long))
} else if let Ok(string) = ob.cast_as::<PyString>() {
let string = string.to_string();
Ok(Value::Str(string))
} else {
let msg = format!("Failure converting {}", ob);
Err(PyTypeError::new_err(msg))
}
}
}
impl IntoPyDict for ThreadPoolStatus {
fn into_py_dict(self, py: Python<'_>) -> &PyDict {
let py_dict = PyDict::new(py);
py_dict.set_item("size", self.size()).unwrap();
py_dict.set_item("queued", self.queued()).unwrap();
py_dict.set_item("active", self.active()).unwrap();
py_dict
}
}