use serde::{Deserialize, Serialize};
use crate::author::Author;
use crate::session::SessionOp;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OpLogEntry {
pub revision: u64,
#[serde(default)]
pub author: Author,
pub ops: Vec<SessionOp>,
#[serde(default)]
pub timestamp_ms: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub parent: Option<String>,
}
pub fn encode_line(entry: &OpLogEntry) -> Result<String, serde_json::Error> {
serde_json::to_string(entry)
}
pub fn decode_line(line: &str) -> Result<OpLogEntry, serde_json::Error> {
serde_json::from_str(line)
}
#[cfg(test)]
mod tests {
use super::*;
use crate as wt;
#[test]
fn entry_roundtrip() {
let entry = OpLogEntry {
revision: 7,
author: Author {
peer: Some(3),
name: "maya".into(),
},
ops: vec![SessionOp::Edit(Box::new(wt::EditOp::spawn(
wt::WorldEntity::new(1, "lighthouse"),
)))],
timestamp_ms: 1_700_000_000_000,
id: None,
parent: None,
};
let line = encode_line(&entry).unwrap();
assert!(!line.contains('\n'));
let back = decode_line(&line).unwrap();
assert_eq!(back.revision, 7);
assert_eq!(back.author.name, "maya");
assert_eq!(back.ops.len(), 1);
}
}