rateslib/scheduling/py/
rollday.rs1use 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 #[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}