1 use super::message::{Message, MessageFlag};
2 use std::sync::{Arc, Mutex};
3
4 #[derive(Debug, Clone)]
5 pub struct Mailbox {
6 pub name: String,
7 pub messages: Arc<Mutex<Vec<Message>>>,
8 next_uid: Arc<Mutex<u32>>,
9 }
10
11 impl Mailbox {
12 pub fn new(name: String) -> Self {
13 Mailbox {
14 name,
15 messages: Arc::new(Mutex::new(Vec::new())),
16 next_uid: Arc::new(Mutex::new(1)),
17 }
18 }
19
20 pub fn add_message(&self, from: String, to: Vec<String>, raw_content: String) -> u32 {
21 let mut messages = self.messages.lock().unwrap();
22 let mut next_uid = self.next_uid.lock().unwrap();
23
24 let uid = *next_uid;
25 *next_uid += 1;
26
27 let sequence_number = messages.len() as u32 + 1;
28 let message = Message::new(uid, sequence_number, from, to, raw_content);
29 messages.push(message);
30
31 uid
32 }
33
34 pub fn get_message_by_sequence(&self, seq: u32) -> Option<Message> {
35 let messages = self.messages.lock().unwrap();
36 messages.iter()
37 .find(|m| m.sequence_number == seq)
38 .cloned()
39 }
40
41 pub fn get_message_by_uid(&self, uid: u32) -> Option<Message> {
42 let messages = self.messages.lock().unwrap();
43 messages.iter()
44 .find(|m| m.uid == uid)
45 .cloned()
46 }
47
48 pub fn get_messages(&self) -> Vec<Message> {
49 let messages = self.messages.lock().unwrap();
50 messages.clone()
51 }
52
53 pub fn exists(&self) -> u32 {
54 let messages = self.messages.lock().unwrap();
55 messages.len() as u32
56 }
57
58 pub fn recent(&self) -> u32 {
59 let messages = self.messages.lock().unwrap();
60 messages.iter()
61 .filter(|m| m.has_flag(&MessageFlag::Recent))
62 .count() as u32
63 }
64
65 pub fn unseen(&self) -> u32 {
66 let messages = self.messages.lock().unwrap();
67 messages.iter()
68 .filter(|m| !m.has_flag(&MessageFlag::Seen))
69 .count() as u32
70 }
71
72 pub fn uidnext(&self) -> u32 {
73 let next_uid = self.next_uid.lock().unwrap();
74 *next_uid
75 }
76
77 pub fn uidvalidity(&self) -> u32 {
78 // For simplicity, using a fixed value
79 // In a real implementation, this should be persistent and unique per mailbox
80 1
81 }
82 }
83
84 #[derive(Debug, Clone)]
85 pub struct MailboxStore {
86 mailboxes: Arc<Mutex<Vec<Mailbox>>>,
87 }
88
89 impl MailboxStore {
90 pub fn new() -> Self {
91 let store = MailboxStore {
92 mailboxes: Arc::new(Mutex::new(Vec::new())),
93 };
94
95 // Create default mailboxes
96 store.create_mailbox("INBOX".to_string());
97 store.create_mailbox("Sent".to_string());
98 store.create_mailbox("Drafts".to_string());
99 store.create_mailbox("Trash".to_string());
100
101 store
102 }
103
104 pub fn create_mailbox(&self, name: String) -> bool {
105 let mut mailboxes = self.mailboxes.lock().unwrap();
106
107 // Check if mailbox already exists
108 if mailboxes.iter().any(|m| m.name == name) {
109 return false;
110 }
111
112 mailboxes.push(Mailbox::new(name));
113 true
114 }
115
116 pub fn get_mailbox(&self, name: &str) -> Option<Mailbox> {
117 let mailboxes = self.mailboxes.lock().unwrap();
118 mailboxes.iter()
119 .find(|m| m.name.eq_ignore_ascii_case(name))
120 .cloned()
121 }
122
123 pub fn list_mailboxes(&self) -> Vec<String> {
124 let mailboxes = self.mailboxes.lock().unwrap();
125 mailboxes.iter()
126 .map(|m| m.name.clone())
127 .collect()
128 }
129
130 pub fn delete_mailbox(&self, name: &str) -> bool {
131 let mut mailboxes = self.mailboxes.lock().unwrap();
132 if let Some(pos) = mailboxes.iter().position(|m| m.name == name) {
133 mailboxes.remove(pos);
134 return true;
135 }
136 false
137 }
138 }
139
140 impl Default for MailboxStore {
141 fn default() -> Self {
142 Self::new()
143 }
144 }