1use std::error;
10use std::fmt;
11use std::result::Result;
12
13#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, PartialOrd, Ord)]
15pub enum Icon {
16 Key,
18
19 World,
21
22 Warning,
24
25 Server,
27
28 MarkedDirectory,
30
31 UserCommunication,
33
34 Parts,
36
37 Notepad,
39
40 WorldSocket,
42
43 Identity,
45
46 PaperReady,
48
49 Digicam,
51
52 IRCommunication,
54
55 MultipleKeys,
57
58 Energy,
60
61 Scanner,
63
64 WorldStar,
66
67 CDRom,
69
70 Monitor,
72
73 Email,
75
76 Configuration,
78
79 ClipboardReady,
81
82 PaperNew,
84
85 Screen,
87
88 EnergyCareful,
90
91 Inbox,
93
94 Disk,
96
97 Drive,
99
100 QuickTime,
102
103 EncryptedTerminal,
105
106 Console,
108
109 Printer,
111
112 Icons,
114
115 Run,
117
118 Settings,
120
121 WorldComputer,
123
124 Archive,
126
127 Banking,
129
130 Smb,
132
133 Clock,
135
136 EmailSearch,
138
139 PaperFlag,
141
142 Memory,
144
145 RecycleBin,
147
148 Note,
150
151 Expired,
153
154 Info,
156
157 Package,
159
160 Folder,
162
163 FolderOpen,
165
166 FolderPackage,
168
169 LockOpen,
171
172 PaperLocked,
174
175 Checked,
177
178 Pen,
180
181 Thumbnail,
183
184 Book,
186
187 Listing,
189
190 UserKey,
192
193 Tool,
195
196 Home,
198
199 Star,
201
202 Tux,
204
205 Feather,
207
208 Apple,
210
211 Wikipedia,
213
214 Money,
216
217 Certificate,
219
220 Phone,
222}
223
224impl Icon {
225 pub fn from_i32(id: i32) -> Result<Icon, IconError> {
239 match id {
240 0 => Ok(Icon::Key),
241 1 => Ok(Icon::World),
242 2 => Ok(Icon::Warning),
243 3 => Ok(Icon::Server),
244 4 => Ok(Icon::MarkedDirectory),
245 5 => Ok(Icon::UserCommunication),
246 6 => Ok(Icon::Parts),
247 7 => Ok(Icon::Notepad),
248 8 => Ok(Icon::WorldSocket),
249 9 => Ok(Icon::Identity),
250 10 => Ok(Icon::PaperReady),
251 11 => Ok(Icon::Digicam),
252 12 => Ok(Icon::IRCommunication),
253 13 => Ok(Icon::MultipleKeys),
254 14 => Ok(Icon::Energy),
255 15 => Ok(Icon::Scanner),
256 16 => Ok(Icon::WorldStar),
257 17 => Ok(Icon::CDRom),
258 18 => Ok(Icon::Monitor),
259 19 => Ok(Icon::Email),
260 20 => Ok(Icon::Configuration),
261 21 => Ok(Icon::ClipboardReady),
262 22 => Ok(Icon::PaperNew),
263 23 => Ok(Icon::Screen),
264 24 => Ok(Icon::EnergyCareful),
265 25 => Ok(Icon::Inbox),
266 26 => Ok(Icon::Disk),
267 27 => Ok(Icon::Drive),
268 28 => Ok(Icon::QuickTime),
269 29 => Ok(Icon::EncryptedTerminal),
270 30 => Ok(Icon::Console),
271 31 => Ok(Icon::Printer),
272 32 => Ok(Icon::Icons),
273 33 => Ok(Icon::Run),
274 34 => Ok(Icon::Settings),
275 35 => Ok(Icon::WorldComputer),
276 36 => Ok(Icon::Archive),
277 37 => Ok(Icon::Banking),
278 38 => Ok(Icon::Smb),
279 39 => Ok(Icon::Clock),
280 40 => Ok(Icon::EmailSearch),
281 41 => Ok(Icon::PaperFlag),
282 42 => Ok(Icon::Memory),
283 43 => Ok(Icon::RecycleBin),
284 44 => Ok(Icon::Note),
285 45 => Ok(Icon::Expired),
286 46 => Ok(Icon::Info),
287 47 => Ok(Icon::Package),
288 48 => Ok(Icon::Folder),
289 49 => Ok(Icon::FolderOpen),
290 50 => Ok(Icon::FolderPackage),
291 51 => Ok(Icon::LockOpen),
292 52 => Ok(Icon::PaperLocked),
293 53 => Ok(Icon::Checked),
294 54 => Ok(Icon::Pen),
295 55 => Ok(Icon::Thumbnail),
296 56 => Ok(Icon::Book),
297 57 => Ok(Icon::Listing),
298 58 => Ok(Icon::UserKey),
299 59 => Ok(Icon::Tool),
300 60 => Ok(Icon::Home),
301 61 => Ok(Icon::Star),
302 62 => Ok(Icon::Tux),
303 63 => Ok(Icon::Feather),
304 64 => Ok(Icon::Apple),
305 65 => Ok(Icon::Wikipedia),
306 66 => Ok(Icon::Money),
307 67 => Ok(Icon::Certificate),
308 68 => Ok(Icon::Phone),
309 _ => Err(IconError::InvalidIconId),
310 }
311 }
312
313 pub fn to_i32(self) -> i32 {
324 self as i32
325 }
326}
327
328#[derive(Debug, PartialEq)]
330pub enum IconError {
331 InvalidIconId,
333}
334
335impl IconError {
336 fn msg(&self) -> &str {
337 match *self {
338 IconError::InvalidIconId => "invalid icon identifier",
339 }
340 }
341}
342
343impl fmt::Display for IconError {
344 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
345 match *self {
346 IconError::InvalidIconId => write!(f, "Icon error: {}", self.msg()),
347 }
348 }
349}
350
351impl error::Error for IconError {
352 fn description(&self) -> &str {
353 self.msg()
354 }
355
356 fn cause(&self) -> Option<&dyn error::Error> {
357 None
358 }
359}
360
361#[cfg(test)]
362mod tests {
363
364 use super::*;
365
366 #[test]
367 fn test_from_i32_with_valid_i32_returns_icon() {
368 assert_eq!(Icon::from_i32(0), Ok(Icon::Key));
369 assert_eq!(Icon::from_i32(68), Ok(Icon::Phone));
370 }
371
372 #[test]
373 fn test_from_i32_with_invalid_i32_returns_error() {
374 assert_eq!(Icon::from_i32(-1), Err(IconError::InvalidIconId));
375 assert_eq!(Icon::from_i32(69), Err(IconError::InvalidIconId));
376 }
377
378 #[test]
379 fn test_to_i32_returns_correct_i32() {
380 assert_eq!(Icon::Key.to_i32(), 0);
381 assert_eq!(Icon::Phone.to_i32(), 68);
382 }
383
384 #[test]
385 fn test_to_i32_inverses_from_i32() {
386 for i in 0..69 {
387 let icon = Icon::from_i32(i).unwrap();
388 let icon_id = icon.to_i32();
389 assert_eq!(icon_id, i);
390 }
391 }
392}