ratatui_toolkit/widgets/ai_chat/state/
message.rs

1use ratatui::style::{Color, Modifier, Style};
2
3/// Role of a message sender.
4#[derive(Debug, Clone, Copy, PartialEq, Eq)]
5pub enum MessageRole {
6    /// Message from user
7    User,
8    /// Message from AI
9    Assistant,
10}
11
12/// A single chat message.
13#[derive(Debug, Clone)]
14pub struct Message {
15    /// Role of sender
16    pub role: MessageRole,
17    /// Message content
18    pub content: String,
19    /// Optional file attachments
20    pub attachments: Vec<String>,
21    /// Timestamp
22    pub timestamp: std::time::SystemTime,
23}
24
25impl Message {
26    /// Create a new user message.
27    pub fn user(content: String) -> Self {
28        Self {
29            role: MessageRole::User,
30            content,
31            attachments: Vec::new(),
32            timestamp: std::time::SystemTime::now(),
33        }
34    }
35
36    /// Create a new AI message.
37    pub fn assistant(content: String) -> Self {
38        Self {
39            role: MessageRole::Assistant,
40            content,
41            attachments: Vec::new(),
42            timestamp: std::time::SystemTime::now(),
43        }
44    }
45
46    /// Add file attachment.
47    pub fn with_attachment(mut self, file: String) -> Self {
48        self.attachments.push(file);
49        self
50    }
51}
52
53/// Store for chat message history.
54#[derive(Debug, Default, Clone)]
55pub struct MessageStore {
56    /// All messages in conversation
57    messages: Vec<Message>,
58}
59
60impl MessageStore {
61    /// Create a new empty message store.
62    pub fn new() -> Self {
63        Self::default()
64    }
65
66    /// Add a message to store.
67    pub fn add(&mut self, message: Message) {
68        self.messages.push(message);
69    }
70
71    /// Get all messages.
72    pub fn messages(&self) -> &[Message] {
73        &self.messages
74    }
75
76    /// Clear all messages.
77    pub fn clear(&mut self) {
78        self.messages.clear();
79    }
80
81    /// Get number of messages.
82    pub fn len(&self) -> usize {
83        self.messages.len()
84    }
85
86    /// Check if store is empty.
87    pub fn is_empty(&self) -> bool {
88        self.messages.is_empty()
89    }
90
91    /// Get last message.
92    pub fn last(&self) -> Option<&Message> {
93        self.messages.last()
94    }
95}