use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use crate::sync::shape::ShapeDefinition;
#[derive(
Debug, Clone, Serialize, Deserialize, zerompk::ToMessagePack, zerompk::FromMessagePack,
)]
pub struct ShapeSubscribeMsg {
pub shape: ShapeDefinition,
}
#[derive(
Debug, Clone, Serialize, Deserialize, zerompk::ToMessagePack, zerompk::FromMessagePack,
)]
pub struct ShapeSnapshotMsg {
pub shape_id: String,
pub data: Vec<u8>,
pub snapshot_lsn: u64,
pub doc_count: usize,
}
#[derive(
Debug, Clone, Serialize, Deserialize, zerompk::ToMessagePack, zerompk::FromMessagePack,
)]
pub struct ShapeDeltaMsg {
pub shape_id: String,
pub collection: String,
pub document_id: String,
pub operation: String,
pub delta: Vec<u8>,
pub lsn: u64,
}
#[derive(
Debug, Clone, Serialize, Deserialize, zerompk::ToMessagePack, zerompk::FromMessagePack,
)]
pub struct ShapeUnsubscribeMsg {
pub shape_id: String,
}
#[derive(
Debug, Clone, Serialize, Deserialize, zerompk::ToMessagePack, zerompk::FromMessagePack,
)]
pub struct VectorClockSyncMsg {
pub clocks: HashMap<String, u64>,
pub sender_id: u64,
}
#[cfg(test)]
mod tests {
use super::*;
use crate::sync::shape::ShapeType;
use crate::sync::wire::{SyncFrame, SyncMessageType};
#[test]
fn shape_subscribe_roundtrip() {
let msg = ShapeSubscribeMsg {
shape: ShapeDefinition {
shape_id: "s1".into(),
tenant_id: 1,
shape_type: ShapeType::Vector {
collection: "embeddings".into(),
field_name: None,
},
description: "all embeddings".into(),
field_filter: vec![],
},
};
let frame = SyncFrame::new_msgpack(SyncMessageType::ShapeSubscribe, &msg).unwrap();
let decoded: ShapeSubscribeMsg = SyncFrame::from_bytes(&frame.to_bytes())
.unwrap()
.decode_body()
.unwrap();
assert_eq!(decoded.shape.shape_id, "s1");
}
}