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, payment_adjuster2, eom, front_stub=None, back_stub=None, stub_inference=None, payment_adjuster3=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        payment_adjuster2: PyAdjuster,
56        eom: bool,
57        front_stub: Option<NaiveDateTime>,
58        back_stub: Option<NaiveDateTime>,
59        stub_inference: Option<StubInference>,
60        payment_adjuster3: Option<PyAdjuster>,
61    ) -> PyResult<Self> {
62        Schedule::try_new_inferred(
63            effective,
64            termination,
65            frequency,
66            front_stub,
67            back_stub,
68            calendar,
69            accrual_adjuster.into(),
70            payment_adjuster.into(),
71            payment_adjuster2.into(),
72            payment_adjuster3.map(Into::into),
73            eom,
74            stub_inference,
75        )
76    }
77
78    #[pyo3(name = "is_regular")]
79    fn is_regular_py(&self) -> bool {
80        self.is_regular()
81    }
82
83    #[getter]
84    #[pyo3(name = "ueffective")]
85    fn ueffective_py(&self) -> NaiveDateTime {
86        self.ueffective
87    }
88
89    #[getter]
90    #[pyo3(name = "utermination")]
91    fn utermination_py(&self) -> NaiveDateTime {
92        self.utermination
93    }
94
95    #[getter]
96    #[pyo3(name = "frequency")]
97    fn frequency_py(&self) -> Frequency {
98        self.frequency.clone()
99    }
100
101    #[getter]
102    #[pyo3(name = "accrual_adjuster")]
103    fn accrual_adjuster_py(&self) -> PyAdjuster {
104        self.accrual_adjuster.into()
105    }
106
107    #[getter]
108    #[pyo3(name = "calendar")]
109    fn calendar_py(&self) -> Calendar {
110        self.calendar.clone()
111    }
112
113    #[getter]
114    #[pyo3(name = "payment_adjuster")]
115    fn payment_adjuster_py(&self) -> PyAdjuster {
116        self.payment_adjuster.into()
117    }
118
119    #[getter]
120    #[pyo3(name = "payment_adjuster2")]
121    fn payment_adjuster2_py(&self) -> PyAdjuster {
122        self.payment_adjuster2.into()
123    }
124
125    #[getter]
126    #[pyo3(name = "payment_adjuster3")]
127    fn payment_adjuster3_py(&self) -> Option<PyAdjuster> {
128        self.payment_adjuster3.map(Into::into)
129    }
130
131    #[getter]
132    #[pyo3(name = "ufront_stub")]
133    fn ufront_stub_py(&self) -> Option<NaiveDateTime> {
134        self.ufront_stub
135    }
136
137    #[getter]
138    #[pyo3(name = "uback_stub")]
139    fn uback_stub_py(&self) -> Option<NaiveDateTime> {
140        self.uback_stub
141    }
142
143    #[getter]
144    #[pyo3(name = "uschedule")]
145    fn uschedule_py(&self) -> Vec<NaiveDateTime> {
146        self.uschedule.clone()
147    }
148
149    #[getter]
150    #[pyo3(name = "aschedule")]
151    fn aschedule_py(&self) -> Vec<NaiveDateTime> {
152        self.aschedule.clone()
153    }
154
155    #[getter]
156    #[pyo3(name = "pschedule")]
157    fn pschedule_py(&self) -> Vec<NaiveDateTime> {
158        self.pschedule.clone()
159    }
160
161    #[getter]
162    #[pyo3(name = "pschedule2")]
163    fn pschedule2_py(&self) -> Vec<NaiveDateTime> {
164        self.pschedule2.clone()
165    }
166
167    #[getter]
168    #[pyo3(name = "pschedule3")]
169    fn pschedule3_py(&self) -> Vec<NaiveDateTime> {
170        self.pschedule3.clone()
171    }
172
173    // Pickling
174    fn __getnewargs__(
175        &self,
176    ) -> PyResult<(
177        NaiveDateTime,
178        NaiveDateTime,
179        Frequency,
180        Calendar,
181        PyAdjuster,
182        PyAdjuster,
183        PyAdjuster,
184        bool,
185        Option<NaiveDateTime>,
186        Option<NaiveDateTime>,
187        Option<StubInference>,
188        Option<PyAdjuster>,
189    )> {
190        Ok((
191            self.ueffective,
192            self.utermination,
193            self.frequency.clone(),
194            self.calendar.clone(),
195            self.accrual_adjuster.into(),
196            self.payment_adjuster.into(),
197            self.payment_adjuster2.into(),
198            false,
199            self.ufront_stub,
200            self.uback_stub,
201            None,
202            self.payment_adjuster3.map(Into::into),
203        ))
204    }
205
206    /// Return a JSON representation of the object.
207    ///
208    /// Returns
209    /// -------
210    /// str
211    #[pyo3(name = "to_json")]
212    fn to_json_py(&self) -> PyResult<String> {
213        match DeserializedObj::Schedule(self.clone()).to_json() {
214            Ok(v) => Ok(v),
215            Err(_) => Err(PyValueError::new_err(
216                "Failed to serialize `Schedule` to JSON.",
217            )),
218        }
219    }
220
221    fn __repr__(&self) -> String {
222        format!("<rl.Schedule at {:p}>", self)
223    }
224}