1use chrono::{DateTime, Utc};
10use super::custom_icon_uuid::CustomIconUuid;
11use super::entry_uuid::EntryUuid;
12use super::group_uuid::GroupUuid;
13use super::icon::Icon;
14use super::times::Times;
15
16#[derive(Clone, Debug, PartialEq)]
18pub struct Group {
19 pub creation_time: DateTime<Utc>,
21
22 pub custom_icon_uuid: Option<CustomIconUuid>,
24
25 pub def_auto_type_sequence: String,
27
28 pub enable_auto_type: Option<bool>,
30
31 pub enable_searching: Option<bool>,
33
34 pub entries: Vec<EntryUuid>,
36
37 pub expires: bool,
39
40 pub expiry_time: DateTime<Utc>,
42
43 pub groups: Vec<GroupUuid>,
45
46 pub icon: Icon,
48
49 pub is_expanded: bool,
51
52 pub last_accessed: DateTime<Utc>,
54
55 pub last_modified: DateTime<Utc>,
57
58 pub last_top_visible_entry: EntryUuid,
60
61 pub location_changed: DateTime<Utc>,
63
64 pub name: String,
66
67 pub notes: String,
69
70 pub usage_count: i32,
72
73 pub uuid: GroupUuid,
75}
76
77impl Group {
78 pub fn new<S: Into<String>>(name: S) -> Group {
88 let mut group = Group::default();
89 group.name = name.into();
90 group.uuid = GroupUuid::new_random();
91 group
92 }
93}
94
95impl Default for Group {
96 fn default() -> Group {
97 let now = Utc::now();
98 Group {
99 creation_time: now,
100 custom_icon_uuid: Default::default(),
101 def_auto_type_sequence: Default::default(),
102 enable_auto_type: Default::default(),
103 enable_searching: Default::default(),
104 entries: Default::default(),
105 expires: false,
106 expiry_time: now,
107 groups: Default::default(),
108 icon: Icon::Folder,
109 is_expanded: true,
110 last_accessed: now,
111 last_modified: now,
112 last_top_visible_entry: Default::default(),
113 location_changed: now,
114 name: Default::default(),
115 notes: Default::default(),
116 usage_count: Default::default(),
117 uuid: Default::default(),
118 }
119 }
120}
121
122impl Times for Group {
123 fn creation_time(&self) -> DateTime<Utc> {
124 self.creation_time
125 }
126
127 fn expires(&self) -> bool {
128 self.expires
129 }
130
131 fn expiry_time(&self) -> DateTime<Utc> {
132 self.expiry_time
133 }
134
135 fn last_accessed(&self) -> DateTime<Utc> {
136 self.last_accessed
137 }
138
139 fn last_modified(&self) -> DateTime<Utc> {
140 self.last_modified
141 }
142
143 fn location_changed(&self) -> DateTime<Utc> {
144 self.location_changed
145 }
146
147 fn usage_count(&self) -> i32 {
148 self.usage_count
149 }
150
151 fn set_creation_time(&mut self, val: DateTime<Utc>) {
152 self.creation_time = val;
153 }
154
155 fn set_expires(&mut self, val: bool) {
156 self.expires = val;
157 }
158
159 fn set_expiry_time(&mut self, val: DateTime<Utc>) {
160 self.expiry_time = val;
161 }
162
163 fn set_last_accessed(&mut self, val: DateTime<Utc>) {
164 self.last_accessed = val;
165 }
166
167 fn set_last_modified(&mut self, val: DateTime<Utc>) {
168 self.last_modified = val;
169 }
170
171 fn set_location_changed(&mut self, val: DateTime<Utc>) {
172 self.location_changed = val;
173 }
174
175 fn set_usage_count(&mut self, val: i32) {
176 self.usage_count = val;
177 }
178}
179
180#[cfg(test)]
181mod tests {
182
183 use chrono::Utc;
184 use super::*;
185 use types::EntryUuid;
186 use types::GroupUuid;
187 use types::Icon;
188 use utils::test::approx_equal_datetime;
189
190 #[test]
191 fn test_new_returns_correct_instance() {
192 let now = Utc::now();
193 let name = "Root";
194 let group = Group::new(name.clone());
195 assert!(approx_equal_datetime(group.creation_time, now));
196 assert_eq!(group.custom_icon_uuid, None);
197 assert_eq!(group.def_auto_type_sequence, "");
198 assert_eq!(group.enable_auto_type, None);
199 assert_eq!(group.enable_searching, None);
200 assert_eq!(group.entries, Vec::new());
201 assert_eq!(group.expires, false);
202 assert!(approx_equal_datetime(group.expiry_time, now));
203 assert_eq!(group.groups, Vec::new());
204 assert_eq!(group.icon, Icon::Folder);
205 assert_eq!(group.is_expanded, true);
206 assert!(approx_equal_datetime(group.last_accessed, now));
207 assert!(approx_equal_datetime(group.last_modified, now));
208 assert_eq!(group.last_top_visible_entry, EntryUuid::nil());
209 assert!(approx_equal_datetime(group.location_changed, now));
210 assert_eq!(group.name, name);
211 assert_eq!(group.notes, "");
212 assert_eq!(group.usage_count, 0);
213 assert!(group.uuid != GroupUuid::nil());
214 }
215
216 #[test]
217 fn test_default_returns_correct_instance() {
218 let now = Utc::now();
219 let group = Group::default();
220 assert!(approx_equal_datetime(group.creation_time, now));
221 assert_eq!(group.custom_icon_uuid, None);
222 assert_eq!(group.def_auto_type_sequence, "");
223 assert_eq!(group.enable_auto_type, None);
224 assert_eq!(group.enable_searching, None);
225 assert_eq!(group.entries, Vec::new());
226 assert_eq!(group.expires, false);
227 assert!(approx_equal_datetime(group.expiry_time, now));
228 assert_eq!(group.groups, Vec::new());
229 assert_eq!(group.icon, Icon::Folder);
230 assert_eq!(group.is_expanded, true);
231 assert!(approx_equal_datetime(group.last_accessed, now));
232 assert!(approx_equal_datetime(group.last_modified, now));
233 assert_eq!(group.last_top_visible_entry, EntryUuid::nil());
234 assert!(approx_equal_datetime(group.location_changed, now));
235 assert_eq!(group.name, "");
236 assert_eq!(group.notes, "");
237 assert_eq!(group.usage_count, 0);
238 assert_eq!(group.uuid, GroupUuid::nil());
239 }
240}