your_llm_chat/
chat.rs

1use chrono::{DateTime, Local, Timelike};
2use serde::{Deserialize, Serialize};
3use std::fmt;
4#[derive(Serialize, Deserialize, Clone)]
5pub enum Sender {
6    User,
7    Model,
8}
9
10#[derive(Serialize, Deserialize, Clone)]
11pub struct ChatMessage {
12    pub sender: Sender,
13    pub content: String,
14    pub timestamp: DateTime<Local>,
15}
16
17impl ChatMessage {
18    pub fn new(sender: Sender, text: String) -> Self {
19        ChatMessage {
20            sender,
21            content: text,
22            timestamp: Local::now(),
23        }
24    }
25}
26
27impl fmt::Display for ChatMessage {
28    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
29        let time = self.timestamp.time();
30        write!(
31            f,
32            "[{:02}:{:02}:{:02}] {}: {}",
33            time.hour(),
34            time.minute(),
35            time.second(),
36            match self.sender {
37                Sender::User => "User",
38                Sender::Model => "Model",
39            },
40            self.content
41        )
42    }
43}
44#[derive(Serialize, Deserialize, Clone)]
45pub struct Chat {
46    pub id: usize,
47    pub model: String,
48    pub messages: Vec<ChatMessage>,
49    pub timestamp: DateTime<Local>,
50}
51
52impl Chat {
53    pub fn new(id: usize, model: String) -> Chat {
54        Chat {
55            id,
56            model,
57            messages: Vec::new(),
58            timestamp: Local::now(),
59        }
60    }
61
62    pub fn add_message(&mut self, msg: ChatMessage) {
63        self.messages.push(msg);
64    }
65
66    pub fn render(&self) {
67        for message in &self.messages {
68            println!("{}", message);
69        }
70    }
71}
72/*pub fn store(&self) -> HashMap<String(String, (String, String))> {
73    self.messages
74        .iter()
75        .map(|message| {
76            (
77                message.timestamp.to_rfc3339(),
78                (
79                    message.content.clone(),
80                    match message.sender {
81                        Sender::User => "User".to_string(),
82                        Sender::Model => self.model.to_string(),
83                    },
84                ),
85            )
86        })
87        .collect()
88}
89
90pub fn import(chat: &HashMap<String, (String, String)>) -> Chat {
91    let mut new_chat = Chat::new(chat.get("model").unwrap().0.to_string());
92    for (timestamp, (content, sender)) in chat {
93        new_chat.add_message(Message {
94            sender: match sender.as_str() {
95                "User" => Sender::User,
96                "Model" => Sender::Model,
97                _ => panic!("Invalid sender"),
98            },
99            content: content.to_string(),
100            timestamp: DateTime::parse_from_rfc3339(timestamp)
101                .unwrap()
102                .with_timezone(&Local),
103        })
104    }
105    new_chat
106} */