#[derive(Debug)]
#[derive(Clone)]
#[derive(PartialEq, Eq)]
#[derive(PartialOrd, Ord)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "bincode", derive(bincode::Encode, bincode::Decode))]
pub enum Marked<D> {
Normal(D),
TombStone,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_marked_ord() {
let a = Marked::Normal(1u64);
let b = Marked::TombStone;
assert!(a < b);
assert!(b > a);
assert_eq!(a, a);
assert_eq!(b, b);
}
}
#[cfg(test)]
#[cfg(feature = "bincode")]
mod tests_bincode {
use super::*;
use crate::testing::bincode_config;
use crate::testing::test_bincode_decode;
#[test]
fn test_marked_bincode() {
let a = Marked::Normal(1u64);
let encoded = bincode::encode_to_vec(&a, bincode_config()).unwrap();
let (decoded, n): (Marked<u64>, usize) =
bincode::decode_from_slice(&encoded, bincode_config()).unwrap();
assert_eq!(n, 2);
assert_eq!(a, decoded);
}
#[test]
fn test_marked_bincode_decode_v010() -> anyhow::Result<()> {
let value = Marked::Normal(1u64);
let encoded = vec![0, 1];
test_bincode_decode(&encoded, &value)?;
let value = Marked::TombStone::<()>;
let encoded = vec![1];
test_bincode_decode(&encoded, &value)?;
Ok(())
}
}
#[cfg(test)]
#[cfg(feature = "serde")]
mod tests_serde {
use super::*;
use crate::testing::test_serde_decode;
#[test]
fn test_marked_serde() {
let a = Marked::Normal(1u64);
let encoded = serde_json::to_string(&a).unwrap();
let decoded: Marked<u64> = serde_json::from_str(&encoded).unwrap();
assert_eq!(a, decoded);
}
#[test]
fn test_marked_serde_decode_v010() -> anyhow::Result<()> {
let value = Marked::Normal(1u64);
let encoded = r#"{"Normal":1}"#;
test_serde_decode(encoded, &value)?;
let value = Marked::TombStone::<()>;
let encoded = r#""TombStone""#;
test_serde_decode(encoded, &value)?;
Ok(())
}
}