seq_marked/marked/
mod.rs

1mod impl_display;
2mod impl_try_from_meta_bytes;
3
4/// Data that can be marked as tombstone.
5///
6/// Tombstones are always greater than normal values for ordering.
7///
8/// ```rust
9/// use seq_marked::Marked;
10///
11/// let data = Marked::Normal("hello");
12/// let tombstone = Marked::<&str>::TombStone;
13/// assert!(tombstone > data);
14/// ```
15#[derive(Debug)]
16#[derive(Clone, Copy)]
17#[derive(PartialEq, Eq)]
18#[derive(PartialOrd, Ord)]
19#[cfg_attr(
20    feature = "seq-marked-serde",
21    derive(serde::Serialize, serde::Deserialize)
22)]
23#[cfg_attr(
24    feature = "seq-marked-bincode",
25    derive(bincode::Encode, bincode::Decode)
26)]
27pub enum Marked<D> {
28    /// Normal data.
29    // Keep `Normal` as the first variant so that `TombStone` is greater than `Normal`.
30    Normal(D),
31
32    /// Deletion marker.
33    TombStone,
34}
35
36#[cfg(test)]
37mod tests {
38
39    use super::*;
40
41    #[test]
42    fn test_marked_is_copy() {
43        let marked = Marked::Normal("data");
44        let marked_copy = marked;
45        assert_eq!(marked, marked_copy);
46    }
47
48    #[test]
49    fn test_marked_ord() {
50        let a = Marked::Normal(1u64);
51        let b = Marked::TombStone;
52
53        assert!(a < b);
54        assert!(b > a);
55        assert_eq!(a, a);
56        assert_eq!(b, b);
57    }
58}
59
60#[cfg(test)]
61#[cfg(feature = "seq-marked-bincode")]
62mod tests_bincode {
63
64    use super::*;
65    use crate::testing::bincode_config;
66    use crate::testing::test_bincode_decode;
67
68    #[test]
69    fn test_marked_bincode() {
70        let a = Marked::Normal(1u64);
71        let encoded = bincode::encode_to_vec(&a, bincode_config()).unwrap();
72        let (decoded, n): (Marked<u64>, usize) =
73            bincode::decode_from_slice(&encoded, bincode_config()).unwrap();
74        assert_eq!(n, 2);
75        assert_eq!(a, decoded);
76    }
77
78    #[test]
79    fn test_marked_bincode_decode_v010() -> anyhow::Result<()> {
80        let value = Marked::Normal(1u64);
81        let encoded = vec![0, 1];
82
83        test_bincode_decode(&encoded, &value)?;
84
85        let value = Marked::TombStone::<()>;
86        let encoded = vec![1];
87
88        test_bincode_decode(&encoded, &value)?;
89        Ok(())
90    }
91}
92
93#[cfg(test)]
94#[cfg(feature = "seq-marked-serde")]
95mod tests_serde {
96    use super::*;
97    use crate::testing::test_serde_decode;
98
99    #[test]
100    fn test_marked_serde() {
101        let a = Marked::Normal(1u64);
102        let encoded = serde_json::to_string(&a).unwrap();
103        let decoded: Marked<u64> = serde_json::from_str(&encoded).unwrap();
104        assert_eq!(a, decoded);
105    }
106
107    #[test]
108    fn test_marked_serde_decode_v010() -> anyhow::Result<()> {
109        let value = Marked::Normal(1u64);
110        let encoded = r#"{"Normal":1}"#;
111
112        test_serde_decode(encoded, &value)?;
113
114        let value = Marked::TombStone::<()>;
115        let encoded = r#""TombStone""#;
116
117        test_serde_decode(encoded, &value)?;
118        Ok(())
119    }
120}