rateslib/scheduling/py/
rollday.rs

1use crate::json::{DeserializedObj, JSON};
2use crate::scheduling::RollDay;
3use pyo3::exceptions::PyValueError;
4use pyo3::prelude::*;
5use pyo3::types::PyTuple;
6
7enum RollDayNewArgs {
8    U32(u32),
9    NoArgs(),
10}
11
12impl<'py> IntoPyObject<'py> for RollDayNewArgs {
13    type Target = PyTuple;
14    type Output = Bound<'py, Self::Target>;
15    type Error = std::convert::Infallible;
16
17    fn into_pyobject(self, py: Python<'py>) -> Result<Self::Output, Self::Error> {
18        match self {
19            RollDayNewArgs::U32(a) => Ok((a,).into_pyobject(py).unwrap()),
20            RollDayNewArgs::NoArgs() => Ok(PyTuple::empty(py)),
21        }
22    }
23}
24
25impl<'py> FromPyObject<'py, 'py> for RollDayNewArgs {
26    type Error = PyErr;
27
28    fn extract(obj: Borrowed<'_, 'py, PyAny>) -> Result<Self, Self::Error> {
29        let ext: PyResult<(u32,)> = obj.extract();
30        match ext {
31            Ok(v) => Ok(RollDayNewArgs::U32(v.0)),
32            Err(_) => Ok(RollDayNewArgs::NoArgs()),
33        }
34    }
35}
36
37#[pymethods]
38impl RollDay {
39    pub(crate) fn __str__(&self) -> String {
40        match self {
41            RollDay::Day(n) => format!("{n}"),
42            RollDay::IMM() => "IMM".to_string(),
43        }
44    }
45
46    fn __getnewargs__(&self) -> RollDayNewArgs {
47        match self {
48            RollDay::Day(n) => RollDayNewArgs::U32(*n),
49            RollDay::IMM() => RollDayNewArgs::NoArgs(),
50        }
51    }
52
53    #[new]
54    fn new_py(args: RollDayNewArgs) -> RollDay {
55        match args {
56            RollDayNewArgs::U32(n) => RollDay::Day(n),
57            RollDayNewArgs::NoArgs() => RollDay::IMM(),
58        }
59    }
60
61    /// Return a JSON representation of the object.
62    ///
63    /// Returns
64    /// -------
65    /// str
66    #[pyo3(name = "to_json")]
67    fn to_json_py(&self) -> PyResult<String> {
68        match DeserializedObj::RollDay(self.clone()).to_json() {
69            Ok(v) => Ok(v),
70            Err(_) => Err(PyValueError::new_err(
71                "Failed to serialize `RollDay` to JSON.",
72            )),
73        }
74    }
75
76    fn __repr__(&self) -> String {
77        format!("<rl.RollDay.{:?} at {:p}>", self, self)
78    }
79}