rateslib/curves/
serde.rs

1use crate::curves::curve_py::Curve;
2use crate::curves::{CurveDF, CurveInterpolation};
3use crate::json::JSON;
4use crate::scheduling::DateRoll;
5use serde::{Deserialize, Serialize};
6
7impl<T, U> JSON for CurveDF<T, U>
8where
9    T: CurveInterpolation + for<'a> Deserialize<'a> + Serialize,
10    U: DateRoll + for<'a> Deserialize<'a> + Serialize,
11{
12}
13
14impl JSON for Curve {}
15
16#[cfg(test)]
17mod tests {
18    use super::*;
19    use crate::curves::curve_py::CurveInterpolator;
20    use crate::curves::{
21        FlatBackwardInterpolator, FlatForwardInterpolator, LinearInterpolator,
22        LinearZeroRateInterpolator, LogLinearInterpolator, Modifier, Nodes,
23    };
24    use crate::scheduling::{ndt, Convention, NamedCal};
25    use indexmap::IndexMap;
26
27    fn curve_fixture<T: CurveInterpolation>(interpolator: T) -> CurveDF<T, NamedCal> {
28        let nodes = Nodes::F64(IndexMap::from_iter(vec![
29            (ndt(2000, 1, 1), 1.0_f64),
30            (ndt(2001, 1, 1), 0.99_f64),
31            (ndt(2002, 1, 1), 0.98_f64),
32        ]));
33        let convention = Convention::Act360;
34        let modifier = Modifier::ModF;
35        let cal = NamedCal::try_new("all").unwrap();
36        CurveDF::try_new(nodes, interpolator, "crv", convention, modifier, None, cal).unwrap()
37    }
38
39    #[test]
40    fn test_curve_json_all_interpolators() {
41        macro_rules! test_interpolator {
42            ($Variant: ident) => {
43                let interpolator = $Variant::new();
44                let curve = curve_fixture(interpolator);
45                let js = curve.to_json().unwrap();
46                let curve2 = CurveDF::from_json(&js).unwrap();
47                assert_eq!(curve, curve2);
48            };
49        }
50
51        test_interpolator!(FlatBackwardInterpolator);
52        test_interpolator!(FlatForwardInterpolator);
53        test_interpolator!(LogLinearInterpolator);
54        test_interpolator!(LinearInterpolator);
55        test_interpolator!(LinearZeroRateInterpolator);
56    }
57
58    #[test]
59    fn test_curve_json_py_enum() {
60        let interpolator = CurveInterpolator::Linear(LinearInterpolator::new());
61        let curve = curve_fixture(interpolator);
62        let js = curve.to_json().unwrap();
63        println!("{}", js);
64        let curve2 = CurveDF::from_json(&js).unwrap();
65        assert_eq!(curve, curve2);
66    }
67}