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, 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 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 #[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}