Skip to main content

lb_rs/model/
chat.rs

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}