use serde::{Deserialize, Serialize};
#[derive(
Debug,
Clone,
PartialEq,
Serialize,
Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
pub enum ArrayWalRecord {
ApplyOp {
array: String,
op_payload: Vec<u8>,
hlc_bytes: Vec<u8>,
},
SchemaUpdate {
array: String,
loro_snapshot: Vec<u8>,
schema_hlc_bytes: Vec<u8>,
},
Snapshot {
array: String,
snapshot_hlc_bytes: Vec<u8>,
coord_range_payload: Vec<u8>,
chunks: Vec<Vec<u8>>,
},
GcCollapse {
array: String,
collapsed_through_hlc_bytes: Vec<u8>,
},
}
#[cfg(test)]
mod tests {
use super::*;
fn zero_hlc() -> Vec<u8> {
vec![0u8; 18]
}
#[test]
fn apply_op_roundtrip() {
let record = ArrayWalRecord::ApplyOp {
array: "temperatures".into(),
op_payload: vec![1, 2, 3, 4],
hlc_bytes: zero_hlc(),
};
let encoded = zerompk::to_msgpack_vec(&record).expect("encode");
let decoded: ArrayWalRecord = zerompk::from_msgpack(&encoded).expect("decode");
assert_eq!(record, decoded);
}
#[test]
fn schema_update_roundtrip() {
let record = ArrayWalRecord::SchemaUpdate {
array: "metrics".into(),
loro_snapshot: vec![10, 20, 30],
schema_hlc_bytes: zero_hlc(),
};
let encoded = zerompk::to_msgpack_vec(&record).expect("encode");
let decoded: ArrayWalRecord = zerompk::from_msgpack(&encoded).expect("decode");
assert_eq!(record, decoded);
}
#[test]
fn snapshot_roundtrip() {
let record = ArrayWalRecord::Snapshot {
array: "coords".into(),
snapshot_hlc_bytes: zero_hlc(),
coord_range_payload: vec![5, 6, 7],
chunks: vec![vec![1, 2], vec![3, 4]],
};
let encoded = zerompk::to_msgpack_vec(&record).expect("encode");
let decoded: ArrayWalRecord = zerompk::from_msgpack(&encoded).expect("decode");
assert_eq!(record, decoded);
}
#[test]
fn gc_collapse_roundtrip() {
let record = ArrayWalRecord::GcCollapse {
array: "events".into(),
collapsed_through_hlc_bytes: zero_hlc(),
};
let encoded = zerompk::to_msgpack_vec(&record).expect("encode");
let decoded: ArrayWalRecord = zerompk::from_msgpack(&encoded).expect("decode");
assert_eq!(record, decoded);
}
#[test]
fn hlc_bytes_len_invariant() {
assert_eq!(zero_hlc().len(), 18);
}
}