use serde::{Deserialize, Serialize};
use serde_json::Value as JsonValue;
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum ClientMessage {
Subscribe {
document_id: String,
map_key: String,
},
Unsubscribe {
document_id: String,
map_key: String,
},
GetFullState {
document_id: String,
map_key: String,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum ServerMessage {
FullState {
document_id: String,
map_key: String,
data: HashMap<String, JsonValue>,
},
MapChange {
document_id: String,
map_key: String,
change: Change,
},
BatchMapChange {
document_id: String,
map_key: String,
changes: Vec<Change>,
},
Error { message: String },
Ack { request_id: Option<String> },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "op")]
pub enum Change {
Insert { key: String, value: JsonValue },
Update {
key: String,
old_value: JsonValue,
new_value: JsonValue,
},
Remove { key: String, old_value: JsonValue },
}
#[derive(Debug, Clone)]
pub enum ChangeEvent {
Single(Change),
Batch(Vec<Change>),
}
pub fn encode_message<T: Serialize>(message: &T) -> crate::RdtResult<Vec<u8>> {
let json = serde_json::to_string(message)?;
let mut encoder = Vec::new();
lib0::encoding::Write::write_string(&mut encoder, &json);
Ok(encoder)
}
pub fn decode_message<T: for<'de> Deserialize<'de>>(data: &[u8]) -> crate::RdtResult<T> {
let mut decoder = lib0::decoding::Cursor::new(data);
let json =
lib0::decoding::Read::read_string(&mut decoder).map_err(|e| crate::RdtError::Protocol {
message: format!("Failed to decode lib0 string: {}", e),
})?;
let message = serde_json::from_str(json)?;
Ok(message)
}