1use serde::{Deserialize, Serialize};
2
3#[derive(Serialize, Deserialize, Clone, PartialEq)]
4pub struct Message {
5 pub from: String,
6 pub content: String,
7 pub ts: i64,
8}
9
10pub struct Buffer {
11 pub messages: Vec<Message>,
12}
13
14impl Buffer {
15 pub fn new(bytes: &[u8]) -> Self {
16 let mut messages: Vec<Message> = std::str::from_utf8(bytes)
17 .unwrap_or_default()
18 .lines()
19 .filter_map(|line| serde_json::from_str(line).ok())
20 .collect();
21 messages.sort_by_key(|m| m.ts);
22 Self { messages }
23 }
24
25 pub fn merge(base: &[u8], local: &[u8], remote: &[u8]) -> Vec<u8> {
26 let base = Self::new(base);
27 let mut local = Self::new(local);
28 let remote = Self::new(remote);
29
30 for msg in &remote.messages {
31 if !base.messages.contains(msg) && !local.messages.contains(msg) {
32 local.messages.push(msg.clone());
33 }
34 }
35
36 local
37 .messages
38 .retain(|msg| !base.messages.contains(msg) || remote.messages.contains(msg));
39
40 local.messages.sort_by_key(|m| m.ts);
41 local.serialize()
42 }
43
44 pub fn serialize(&self) -> Vec<u8> {
45 let mut out = self
46 .messages
47 .iter()
48 .filter_map(|m| serde_json::to_string(m).ok())
49 .collect::<Vec<_>>()
50 .join("\n");
51 if !out.is_empty() {
52 out.push('\n');
53 }
54 out.into_bytes()
55 }
56}