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