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