use crate::types::Document;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum UpdateType {
Added,
Removed,
Modified,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum QueryUpdate {
Added(Document),
Removed(Document),
Modified { old: Document, new: Document },
}
impl QueryUpdate {
pub fn update_type(&self) -> UpdateType {
match self {
QueryUpdate::Added(_) => UpdateType::Added,
QueryUpdate::Removed(_) => UpdateType::Removed,
QueryUpdate::Modified { .. } => UpdateType::Modified,
}
}
pub fn document(&self) -> &Document {
match self {
QueryUpdate::Added(doc) => doc,
QueryUpdate::Removed(doc) => doc,
QueryUpdate::Modified { new, .. } => new,
}
}
pub fn id(&self) -> &str {
&self.document()._sid
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::types::Value;
use std::collections::HashMap;
#[test]
fn test_query_update_types() {
let mut data = HashMap::new();
data.insert("name".to_string(), Value::String("Test".into()));
let doc = Document {
_sid: "1".to_string(),
data: data.clone(),
};
let added = QueryUpdate::Added(doc.clone());
assert!(matches!(added.update_type(), UpdateType::Added));
assert_eq!(added.id(), "1");
let removed = QueryUpdate::Removed(doc.clone());
assert!(matches!(removed.update_type(), UpdateType::Removed));
let modified = QueryUpdate::Modified {
old: doc.clone(),
new: doc.clone(),
};
assert!(matches!(modified.update_type(), UpdateType::Modified));
}
}