rateslib/scheduling/py/
schedule.rs

1use crate::json::{DeserializedObj, JSON};
2use crate::scheduling::{Calendar, Frequency, PyAdjuster, Schedule, StubInference};
3
4use chrono::prelude::*;
5use pyo3::exceptions::PyValueError;
6use pyo3::prelude::*;
7
8#[pymethods]
9impl StubInference {
10    // Pickling
11    #[new]
12    fn new_py(item: usize) -> StubInference {
13        match item {
14            _ if item == StubInference::ShortFront as usize => StubInference::ShortFront,
15            _ if item == StubInference::ShortBack as usize => StubInference::ShortBack,
16            _ if item == StubInference::LongFront as usize => StubInference::LongFront,
17            _ if item == StubInference::LongBack as usize => StubInference::LongBack,
18            _ => panic!("Reportable issue: must map this enum variant for serialization."),
19        }
20    }
21    fn __getnewargs__<'py>(&self) -> PyResult<(usize,)> {
22        Ok((*self as usize,))
23    }
24    fn __repr__(&self) -> String {
25        format!("<rl.StubInference.{:?} at {:p}>", self, self)
26    }
27    // JSON
28    /// Return a JSON representation of the object.
29    ///
30    /// Returns
31    /// -------
32    /// str
33    #[pyo3(name = "to_json")]
34    fn to_json_py(&self) -> PyResult<String> {
35        match DeserializedObj::StubInference(self.clone()).to_json() {
36            Ok(v) => Ok(v),
37            Err(_) => Err(PyValueError::new_err(
38                "Failed to serialize `StubInference` to JSON.",
39            )),
40        }
41    }
42}
43
44#[pymethods]
45impl Schedule {
46    #[new]
47    #[pyo3(signature = (effective, termination, frequency, calendar, accrual_adjuster, payment_adjuster, eom, front_stub=None, back_stub=None, stub_inference=None))]
48    fn new_py(
49        effective: NaiveDateTime,
50        termination: NaiveDateTime,
51        frequency: Frequency,
52        calendar: Calendar,
53        accrual_adjuster: PyAdjuster,
54        payment_adjuster: PyAdjuster,
55        eom: bool,
56        front_stub: Option<NaiveDateTime>,
57        back_stub: Option<NaiveDateTime>,
58        stub_inference: Option<StubInference>,
59    ) -> PyResult<Self> {
60        Schedule::try_new_inferred(
61            effective,
62            termination,
63            frequency,
64            front_stub,
65            back_stub,
66            calendar,
67            accrual_adjuster.into(),
68            payment_adjuster.into(),
69            eom,
70            stub_inference,
71        )
72    }
73
74    #[pyo3(name = "is_regular")]
75    fn is_regular_py(&self) -> bool {
76        self.is_regular()
77    }
78
79    #[getter]
80    #[pyo3(name = "ueffective")]
81    fn ueffective_py(&self) -> NaiveDateTime {
82        self.ueffective
83    }
84
85    #[getter]
86    #[pyo3(name = "utermination")]
87    fn utermination_py(&self) -> NaiveDateTime {
88        self.utermination
89    }
90
91    #[getter]
92    #[pyo3(name = "frequency")]
93    fn frequency_py(&self) -> Frequency {
94        self.frequency.clone()
95    }
96
97    #[getter]
98    #[pyo3(name = "accrual_adjuster")]
99    fn accrual_adjuster_py(&self) -> PyAdjuster {
100        self.accrual_adjuster.into()
101    }
102
103    #[getter]
104    #[pyo3(name = "calendar")]
105    fn calendar_py(&self) -> Calendar {
106        self.calendar.clone()
107    }
108
109    #[getter]
110    #[pyo3(name = "payment_adjuster")]
111    fn payment_adjuster_py(&self) -> PyAdjuster {
112        self.payment_adjuster.into()
113    }
114
115    #[getter]
116    #[pyo3(name = "ufront_stub")]
117    fn ufront_stub_py(&self) -> Option<NaiveDateTime> {
118        self.ufront_stub
119    }
120
121    #[getter]
122    #[pyo3(name = "uback_stub")]
123    fn uback_stub_py(&self) -> Option<NaiveDateTime> {
124        self.uback_stub
125    }
126
127    #[getter]
128    #[pyo3(name = "uschedule")]
129    fn uschedule_py(&self) -> Vec<NaiveDateTime> {
130        self.uschedule.clone()
131    }
132
133    #[getter]
134    #[pyo3(name = "aschedule")]
135    fn aschedule_py(&self) -> Vec<NaiveDateTime> {
136        self.aschedule.clone()
137    }
138
139    #[getter]
140    #[pyo3(name = "pschedule")]
141    fn pschedule_py(&self) -> Vec<NaiveDateTime> {
142        self.pschedule.clone()
143    }
144
145    // Pickling
146    fn __getnewargs__(
147        &self,
148    ) -> PyResult<(
149        NaiveDateTime,
150        NaiveDateTime,
151        Frequency,
152        Calendar,
153        PyAdjuster,
154        PyAdjuster,
155        bool,
156        Option<NaiveDateTime>,
157        Option<NaiveDateTime>,
158        Option<StubInference>,
159    )> {
160        Ok((
161            self.ueffective,
162            self.utermination,
163            self.frequency.clone(),
164            self.calendar.clone(),
165            self.accrual_adjuster.into(),
166            self.payment_adjuster.into(),
167            false,
168            self.ufront_stub,
169            self.uback_stub,
170            None,
171        ))
172    }
173
174    /// Return a JSON representation of the object.
175    ///
176    /// Returns
177    /// -------
178    /// str
179    #[pyo3(name = "to_json")]
180    fn to_json_py(&self) -> PyResult<String> {
181        match DeserializedObj::Schedule(self.clone()).to_json() {
182            Ok(v) => Ok(v),
183            Err(_) => Err(PyValueError::new_err(
184                "Failed to serialize `Schedule` to JSON.",
185            )),
186        }
187    }
188
189    fn __repr__(&self) -> String {
190        format!("<rl.Schedule at {:p}>", self)
191    }
192}