mithril_common/crypto_helper/cardano/kes/
kes_period.rs

1use std::fmt::{Display, Formatter};
2use std::num::TryFromIntError;
3use std::ops::{Deref, DerefMut, Sub};
4
5use serde::{Deserialize, Serialize};
6
7use crate::crypto_helper::KesEvolutions;
8use crate::entities::arithmetic_operation_wrapper::{
9    impl_add_to_wrapper, impl_partial_eq_to_wrapper,
10};
11
12/// KesPeriod represents the KES period used to check if the KES keys are expired
13#[derive(
14    Debug, Copy, Clone, Default, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize, Hash,
15)]
16pub struct KesPeriod(pub u64);
17
18impl Display for KesPeriod {
19    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
20        write!(f, "{}", self.0)
21    }
22}
23
24impl Deref for KesPeriod {
25    type Target = u64;
26
27    fn deref(&self) -> &Self::Target {
28        &self.0
29    }
30}
31
32impl DerefMut for KesPeriod {
33    fn deref_mut(&mut self) -> &mut Self::Target {
34        &mut self.0
35    }
36}
37
38// Useful for conversion to sqlite number (that uses i64)
39impl TryFrom<KesPeriod> for i64 {
40    type Error = TryFromIntError;
41
42    fn try_from(value: KesPeriod) -> Result<Self, Self::Error> {
43        i64::try_from(value.0)
44    }
45}
46
47impl TryFrom<i64> for KesPeriod {
48    type Error = TryFromIntError;
49
50    fn try_from(value: i64) -> Result<Self, Self::Error> {
51        Ok(KesPeriod(u64::try_from(value)?))
52    }
53}
54
55impl From<KesPeriod> for u64 {
56    fn from(value: KesPeriod) -> Self {
57        value.0
58    }
59}
60
61impl Add<KesEvolutions> for KesPeriod {
62    type Output = Self;
63
64    fn add(self, rhs: KesEvolutions) -> Self::Output {
65        self + *rhs
66    }
67}
68
69impl Sub<KesPeriod> for KesPeriod {
70    type Output = KesEvolutions;
71
72    fn sub(self, rhs: KesPeriod) -> Self::Output {
73        KesEvolutions((*self).saturating_sub(*rhs))
74    }
75}
76
77impl_add_to_wrapper!(KesPeriod, u64);
78impl_partial_eq_to_wrapper!(KesPeriod, u64);
79
80#[cfg(test)]
81mod tests {
82    use crate::entities::arithmetic_operation_wrapper::tests::test_op_assign;
83
84    use super::*;
85
86    #[test]
87    fn test_display() {
88        assert_eq!(format!("{}", KesPeriod(72)), "72");
89        assert_eq!(format!("{}", &KesPeriod(13224)), "13224");
90    }
91
92    #[test]
93    fn test_serialize() {
94        assert_eq!(serde_json::to_string(&KesPeriod(72)).unwrap(), "72");
95    }
96
97    #[test]
98    fn test_deserialize() {
99        let kes_period: KesPeriod = serde_json::from_str("13224").unwrap();
100        assert_eq!(kes_period, KesPeriod(13224));
101    }
102
103    #[test]
104    #[allow(clippy::op_ref)]
105    fn test_add() {
106        assert_eq!(KesPeriod(4), KesPeriod(1) + KesPeriod(3));
107        assert_eq!(KesPeriod(4), KesPeriod(1) + 3_u64);
108        assert_eq!(KesPeriod(4), KesPeriod(1) + &3_u64);
109
110        assert_eq!(KesPeriod(4), 3_u64 + KesPeriod(1));
111        assert_eq!(KesPeriod(4), 3_u64 + &KesPeriod(1));
112        assert_eq!(KesPeriod(4), &3_u64 + KesPeriod(1));
113        assert_eq!(KesPeriod(4), &3_u64 + &KesPeriod(1));
114
115        test_op_assign!(KesPeriod(1), +=, KesPeriod(3) => KesPeriod(4));
116        test_op_assign!(KesPeriod(1), +=, 3_u64 => KesPeriod(4));
117        test_op_assign!(KesPeriod(1), +=, &3_u64 => KesPeriod(4));
118
119        test_op_assign!(1_u64, +=, KesPeriod(3) => 4_u64);
120        test_op_assign!(1_u64, +=, &KesPeriod(3) => 4_u64);
121
122        assert_eq!(KesPeriod(4), KesPeriod(1) + KesEvolutions(3));
123    }
124
125    #[test]
126    #[allow(clippy::op_ref)]
127    fn test_sub() {
128        assert_eq!(KesEvolutions(8), KesPeriod(14) - KesPeriod(6));
129    }
130
131    #[test]
132    fn saturating_sub() {
133        assert_eq!(KesEvolutions(0), KesPeriod(1) - KesPeriod(5));
134    }
135
136    #[test]
137    fn test_eq() {
138        assert_eq!(KesPeriod(1), KesPeriod(1));
139        assert_eq!(KesPeriod(2), &KesPeriod(2));
140        assert_eq!(&KesPeriod(3), KesPeriod(3));
141        assert_eq!(&KesPeriod(4), &KesPeriod(4));
142
143        assert_eq!(KesPeriod(5), 5);
144        assert_eq!(KesPeriod(6), &6);
145        assert_eq!(&KesPeriod(7), 7);
146        assert_eq!(&KesPeriod(8), &8);
147
148        assert_eq!(9, KesPeriod(9));
149        assert_eq!(10, &KesPeriod(10));
150        assert_eq!(&11, KesPeriod(11));
151        assert_eq!(&12, &KesPeriod(12));
152    }
153}