use bytes::Bytes;
use serde::{Deserialize, Serialize};
use crate::error::Result;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Snapshot {
pub topic: String,
pub snapshot_id: String,
pub base_offset: i64,
pub schema: String,
pub payload: serde_json::Value,
pub created_at: i64,
pub expires_at: Option<i64>,
pub checksum: Option<String>,
}
pub fn encode_snapshot(s: &Snapshot) -> Result<Bytes> {
Ok(Bytes::from(serde_json::to_vec(s)?))
}
pub fn decode_snapshot(bytes: &[u8]) -> Result<Snapshot> {
Ok(serde_json::from_slice(bytes)?)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn round_trip() {
let s = Snapshot {
topic: "room/1".into(),
snapshot_id: "snap-1".into(),
base_offset: 42,
schema: "room.snapshot@1.0".into(),
payload: serde_json::json!({"messages": []}),
created_at: 1000,
expires_at: Some(2000),
checksum: None,
};
let bytes = encode_snapshot(&s).unwrap();
let back = decode_snapshot(&bytes).unwrap();
assert_eq!(back.base_offset, 42);
assert_eq!(back.snapshot_id, "snap-1");
}
}