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} */