seq_marked/seqv/
impl_seq_value.rs

1//! Implement [`SeqValue`] for [`SeqV`]
2
3use super::SeqV;
4use crate::SeqValue;
5
6impl<M, V> SeqValue<M, V> for SeqV<M, V> {
7    fn seq(&self) -> u64 {
8        self.seq
9    }
10
11    fn value(&self) -> Option<&V> {
12        Some(&self.data)
13    }
14
15    fn into_value(self) -> Option<V> {
16        Some(self.data)
17    }
18
19    fn meta(&self) -> Option<&M> {
20        self.meta.as_ref()
21    }
22}
23
24impl<M, V> SeqValue<M, V> for Option<SeqV<M, V>> {
25    fn seq(&self) -> u64 {
26        self.as_ref().map(|v| v.seq()).unwrap_or(0)
27    }
28
29    fn value(&self) -> Option<&V> {
30        self.as_ref().and_then(|v| v.value())
31    }
32
33    fn into_value(self) -> Option<V> {
34        self.map(|v| v.data)
35    }
36
37    fn meta(&self) -> Option<&M> {
38        self.as_ref().and_then(|v| v.meta())
39    }
40}
41
42#[cfg(test)]
43mod tests {
44    use super::*;
45
46    #[test]
47    fn test_seqv_with_meta() {
48        let sv = SeqV {
49            seq: 42,
50            meta: Some("metadata"),
51            data: 100u64,
52        };
53
54        assert_eq!(sv.seq(), 42);
55        assert_eq!(sv.value(), Some(&100));
56        assert_eq!(sv.meta(), Some(&"metadata"));
57
58        let (seq, value) = sv.unpack();
59        assert_eq!(seq, 42);
60        assert_eq!(value, Some(100));
61    }
62
63    #[test]
64    fn test_seqv_without_meta() {
65        let sv = SeqV {
66            seq: 10,
67            meta: None::<String>,
68            data: 200u64,
69        };
70
71        assert_eq!(sv.seq(), 10);
72        assert_eq!(sv.value(), Some(&200));
73        assert_eq!(sv.meta(), None);
74
75        let (seq, value) = sv.unpack();
76        assert_eq!(seq, 10);
77        assert_eq!(value, Some(200));
78    }
79
80    #[test]
81    fn test_option_seqv_some() {
82        let sv = Some(SeqV {
83            seq: 5,
84            meta: Some("test"),
85            data: 300u64,
86        });
87
88        assert_eq!(sv.seq(), 5);
89        assert_eq!(sv.value(), Some(&300));
90        assert_eq!(sv.meta(), Some(&"test"));
91
92        let (seq, value) = sv.unpack();
93        assert_eq!(seq, 5);
94        assert_eq!(value, Some(300));
95    }
96
97    #[test]
98    fn test_option_seqv_none() {
99        let sv = None::<SeqV<String, u64>>;
100
101        assert_eq!(sv.seq(), 0);
102        assert_eq!(sv.value(), None);
103        assert_eq!(sv.meta(), None);
104
105        let (seq, value) = sv.unpack();
106        assert_eq!(seq, 0);
107        assert_eq!(value, None);
108    }
109}