seq_marked/seq_marked/
impl_seq_value.rs

1use crate::SeqMarked;
2use crate::SeqValue;
3
4/// [`SeqMarked`] is a superset of [`SeqValue`].
5impl<M, T> SeqValue<M, T> for SeqMarked<(Option<M>, T)> {
6    fn seq(&self) -> u64 {
7        self.user_seq()
8    }
9
10    fn value(&self) -> Option<&T> {
11        self.data_ref().map(|(_meta, value)| value)
12    }
13
14    fn into_value(self) -> Option<T> {
15        self.into_data().map(|(_meta, value)| value)
16    }
17
18    fn meta(&self) -> Option<&M> {
19        self.data_ref().and_then(|(meta, _value)| meta.as_ref())
20    }
21}
22
23#[cfg(test)]
24mod tests {
25    use super::*;
26
27    #[test]
28    fn test_seq_value_with_meta() {
29        let sv = SeqMarked::new_normal(42, (Some("metadata"), 100u64));
30
31        assert_eq!(sv.seq(), 42);
32        assert_eq!(sv.value(), Some(&100));
33        assert_eq!(sv.meta(), Some(&"metadata"));
34
35        let (seq, value) = sv.unpack();
36        assert_eq!(seq, 42);
37        assert_eq!(value, Some(100));
38    }
39
40    #[test]
41    fn test_seq_value_without_meta() {
42        let sv = SeqMarked::new_normal(10, (None::<String>, 200u64));
43
44        assert_eq!(sv.seq(), 10);
45        assert_eq!(sv.value(), Some(&200));
46        assert_eq!(sv.meta(), None);
47
48        let (seq, value) = sv.unpack();
49        assert_eq!(seq, 10);
50        assert_eq!(value, Some(200));
51    }
52
53    #[test]
54    fn test_seq_value_tombstone() {
55        let sv = SeqMarked::<(Option<String>, u64)>::new_tombstone(5);
56
57        assert_eq!(sv.seq(), 0);
58        assert_eq!(sv.value(), None);
59        assert_eq!(sv.meta(), None);
60
61        let (seq, value) = sv.unpack();
62        assert_eq!(seq, 0);
63        assert_eq!(value, None);
64    }
65}