1 /// Describes the timeout of a notification
2 #[derive(Debug, Copy, Clone, PartialEq, Eq)]
3 pub enum Timeout {
4     /// Expires according to server default.
5     ///
6     /// Whatever that might be...
7     Default,
8 
9     /// Do not expire, user will have to close this manually.
10     Never,
11 
12     /// Expire after n milliseconds.
13     Milliseconds(u32),
14 }
15 
16 impl Timeout {
17     #[cfg(all(feature = "zbus", not(feature = "dbus")))]
18     #[cfg(all(unix, not(target_os = "macos")))]
into_i32(self) -> i3219     pub(crate) fn into_i32(self) -> i32 {
20         self.into()
21     }
22 }
23 
24 impl Default for Timeout {
default() -> Self25     fn default() -> Self {
26         Timeout::Default
27     }
28 }
29 
30 #[test]
timeout_from_i32()31 fn timeout_from_i32() {
32     assert_eq!(Timeout::from(234), Timeout::Milliseconds(234));
33     assert_eq!(Timeout::from(-234), Timeout::Default);
34     assert_eq!(Timeout::from(0), Timeout::Never)
35 }
36 
37 impl From<i32> for Timeout {
from(int: i32) -> Timeout38     fn from(int: i32) -> Timeout {
39         use std::cmp::Ordering::*;
40         match int.cmp(&0) {
41             Greater => Timeout::Milliseconds(int as u32),
42             Less => Timeout::Default,
43             Equal => Timeout::Never,
44         }
45     }
46 }
47 
48 impl From<Timeout> for i32 {
from(timeout: Timeout) -> Self49     fn from(timeout: Timeout) -> Self {
50         match timeout {
51             Timeout::Default => -1,
52             Timeout::Never => 0,
53             Timeout::Milliseconds(ms) => ms as i32,
54         }
55     }
56 }
57 
58 pub struct TimeoutMessage(Timeout);
59 
60 impl From<Timeout> for TimeoutMessage {
from(hint: Timeout) -> Self61     fn from(hint: Timeout) -> Self {
62         TimeoutMessage(hint)
63     }
64 }
65 
66 impl std::ops::Deref for TimeoutMessage {
67     type Target = Timeout;
68 
deref(&self) -> &Self::Target69     fn deref(&self) -> &Self::Target {
70         &self.0
71     }
72 }
73 
74 #[cfg(all(feature = "dbus", unix, not(target_os = "macos")))]
75 use dbus::arg::messageitem::MessageItem;
76 
77 #[cfg(all(feature = "dbus", unix, not(target_os = "macos")))]
78 impl std::convert::TryFrom<&MessageItem> for TimeoutMessage {
79     type Error = ();
80 
try_from(mi: &MessageItem) -> Result<TimeoutMessage, ()>81     fn try_from(mi: &MessageItem) -> Result<TimeoutMessage, ()> {
82         mi.inner::<i32>().map(|i| TimeoutMessage(i.into()))
83     }
84 }
85