use std::cmp::Ordering;
use bson::Document;
use bson::oid::ObjectId;
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
pub struct Record {
pub key: ObjectId,
pub value: Value<Document>,
}
impl PartialOrd for Record {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.key.cmp(&other.key))
}
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub enum Value<T> {
Data(T),
Tombstone,
}
impl Eq for Value<Document> {}
#[cfg(test)]
mod test {
use super::*;
use bson::doc;
use bson::oid::ObjectId;
#[test]
fn record_equality_basic() {
let r1 = Record {
key: ObjectId::new(),
value: Value::Data(doc! {
"msg": "Hello, World",
"num": 42,
})
};
let r2 = Record {
key: ObjectId::new(),
value: Value::Data(doc! {
"msg": "What's up",
"num": 0,
})
};
assert_ne!(r1, r2, "Different records, shouldn't match");
}
#[test]
fn record_equality_cloned() {
let r1 = Record {
key: ObjectId::new(),
value: Value::Data(doc! {
"msg": "Hello, World",
"num": 42,
})
};
let r2 = Record {
key: r1.key.clone(),
value: r1.value.clone(),
};
assert_eq!(r1, r2, "Records with cloned values, should match");
}
#[test]
fn record_equality_tombstone() {
let r1 = Record {
key: ObjectId::new(),
value: Value::Data(doc! {
"msg": "What's up",
"num": 0,
})
};
let r2 = Record {
key: r1.key.clone(),
value: Value::Tombstone,
};
assert_ne!(r1, r2, "Same key but different values, shouldn't match");
let r3 = Record {
key: r1.key.clone(),
value: Value::Tombstone,
};
assert_eq!(r2, r3, "Same key and same (tombstone) values, should match");
}
}