kpdb/types/
icon.rs

1// Copyright (c) 2016-2017 Martijn Rijkeboer <mrr@sru-systems.com>
2//
3// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
4// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
5// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
6// option. This file may not be copied, modified, or distributed
7// except according to those terms.
8
9use std::error;
10use std::fmt;
11use std::result::Result;
12
13/// The icon of an entry or group.
14#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, PartialOrd, Ord)]
15pub enum Icon {
16    /// The key icon.
17    Key,
18
19    /// The world icon.
20    World,
21
22    /// The warning icon.
23    Warning,
24
25    /// The server icon.
26    Server,
27
28    /// The marked directory icon.
29    MarkedDirectory,
30
31    /// The user communication icon.
32    UserCommunication,
33
34    /// The parts icon.
35    Parts,
36
37    /// The notepad icon.
38    Notepad,
39
40    /// The world with socket icon.
41    WorldSocket,
42
43    /// The identity icon.
44    Identity,
45
46    /// The paper ready icon.
47    PaperReady,
48
49    /// The digicam icon.
50    Digicam,
51
52    /// The infrared communication icon.
53    IRCommunication,
54
55    /// The multiple keys icon.
56    MultipleKeys,
57
58    /// The energy icon.
59    Energy,
60
61    /// The scanner icon.
62    Scanner,
63
64    /// The world with star icon.
65    WorldStar,
66
67    /// The CD-ROM icon.
68    CDRom,
69
70    /// The monitor icon.
71    Monitor,
72
73    /// The email icon.
74    Email,
75
76    /// The configuration icon.
77    Configuration,
78
79    /// The clipboard ready icon.
80    ClipboardReady,
81
82    /// The new paper icon.
83    PaperNew,
84
85    /// The screen icon.
86    Screen,
87
88    /// The energy careful icon.
89    EnergyCareful,
90
91    /// The inbox icon.
92    Inbox,
93
94    /// The disk icon.
95    Disk,
96
97    /// The drive icon.
98    Drive,
99
100    /// The QuickTime icon.
101    QuickTime,
102
103    /// The encrypted terminal icon.
104    EncryptedTerminal,
105
106    /// The console icon.
107    Console,
108
109    /// The printer icon.
110    Printer,
111
112    /// The icons icon.
113    Icons,
114
115    /// The run icon.
116    Run,
117
118    /// The settings icon.
119    Settings,
120
121    /// The world with a computer icon.
122    WorldComputer,
123
124    /// The archive icon.
125    Archive,
126
127    /// The banking icon.
128    Banking,
129
130    /// The SMB icon (Windows networking).
131    Smb,
132
133    /// The clock icon.
134    Clock,
135
136    /// The email search icon.
137    EmailSearch,
138
139    /// The paper with flag icon.
140    PaperFlag,
141
142    /// The memory icon.
143    Memory,
144
145    /// The recycle bin icon.
146    RecycleBin,
147
148    /// The note icon.
149    Note,
150
151    /// The expired icon.
152    Expired,
153
154    /// The info icon.
155    Info,
156
157    /// The package icon.
158    Package,
159
160    /// The folder icon.
161    Folder,
162
163    /// The open folder icon.
164    FolderOpen,
165
166    /// The packaged folder icon.
167    FolderPackage,
168
169    /// The open lock icon.
170    LockOpen,
171
172    /// The paper with lock icon.
173    PaperLocked,
174
175    /// The checked icon.
176    Checked,
177
178    /// The pen icon.
179    Pen,
180
181    /// The thumbnail icon.
182    Thumbnail,
183
184    /// The book icon.
185    Book,
186
187    /// The listing icon.
188    Listing,
189
190    /// The user's key icon.
191    UserKey,
192
193    /// The tool icon.
194    Tool,
195
196    /// The home icon.
197    Home,
198
199    /// The star icon.
200    Star,
201
202    /// The Tux logo.
203    Tux,
204
205    /// The feather icon.
206    Feather,
207
208    /// The Apple logo.
209    Apple,
210
211    /// The Wikipedia logo.
212    Wikipedia,
213
214    /// The money icon.
215    Money,
216
217    /// The certificate icon.
218    Certificate,
219
220    /// The phone icon.
221    Phone,
222}
223
224impl Icon {
225    /// Attempts to convert an identifier to an icon.
226    ///
227    /// # Examples
228    ///
229    /// ```rust
230    /// use kpdb::Icon;
231    /// # use kpdb::IconError;
232    ///
233    /// # fn from_i32_example() -> Result<Icon, IconError> {
234    /// let icon = Icon::from_i32(0)?;
235    /// # Ok(icon)
236    /// # }
237    /// ```
238    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    /// Gets the icon's identifier.
314    ///
315    /// # Examples
316    ///
317    /// ```rust
318    /// use kpdb::Icon;
319    ///
320    /// let icon = Icon::Key;
321    /// let icon_id = icon.to_i32();
322    /// ```
323    pub fn to_i32(self) -> i32 {
324        self as i32
325    }
326}
327
328/// Error type for icon conversion errors.
329#[derive(Debug, PartialEq)]
330pub enum IconError {
331    /// Invalid icon identifier.
332    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}