• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use std::time::Duration;
2 
3 /// PollTimeout argument for polling.
4 #[derive(Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd)]
5 pub struct PollTimeout(i32);
6 
7 impl PollTimeout {
8     /// Blocks indefinitely.
9     ///
10     /// > Specifying a negative value in timeout means an infinite timeout.
11     pub const NONE: Self = Self(-1);
12     /// Returns immediately.
13     ///
14     /// > Specifying a timeout of zero causes poll() to return immediately, even if no file
15     /// > descriptors are ready.
16     pub const ZERO: Self = Self(0);
17     /// Blocks for at most [`i32::MAX`] milliseconds.
18     pub const MAX: Self = Self(i32::MAX);
19     /// Returns if `self` equals [`PollTimeout::NONE`].
is_none(&self) -> bool20     pub fn is_none(&self) -> bool {
21         // > Specifying a negative value in timeout means an infinite timeout.
22         *self <= Self::NONE
23     }
24     /// Returns if `self` does not equal [`PollTimeout::NONE`].
is_some(&self) -> bool25     pub fn is_some(&self) -> bool {
26         !self.is_none()
27     }
28     /// Returns the timeout in milliseconds if there is some, otherwise returns `None`.
as_millis(&self) -> Option<u32>29     pub fn as_millis(&self) -> Option<u32> {
30         self.is_some().then_some(u32::try_from(self.0).unwrap())
31     }
32     /// Returns the timeout as a `Duration` if there is some, otherwise returns `None`.
duration(&self) -> Option<Duration>33     pub fn duration(&self) -> Option<Duration> {
34         self.as_millis()
35             .map(|x| Duration::from_millis(u64::from(x)))
36     }
37 }
38 
39 /// Error type for integer conversions into `PollTimeout`.
40 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
41 pub enum PollTimeoutTryFromError {
42     /// Passing a value less than -1 is invalid on some systems, see
43     /// <https://man.freebsd.org/cgi/man.cgi?poll#end>.
44     TooNegative,
45     /// Passing a value greater than `i32::MAX` is invalid.
46     TooPositive,
47 }
48 
49 impl std::fmt::Display for PollTimeoutTryFromError {
fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result50     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
51         match self {
52             Self::TooNegative => write!(f, "Passed a negative timeout less than -1."),
53             Self::TooPositive => write!(f, "Passed a positive timeout greater than `i32::MAX` milliseconds.")
54         }
55     }
56 }
57 
58 impl std::error::Error for PollTimeoutTryFromError {}
59 
60 impl<T: Into<PollTimeout>> From<Option<T>> for PollTimeout {
from(x: Option<T>) -> Self61     fn from(x: Option<T>) -> Self {
62         x.map_or(Self::NONE, |x| x.into())
63     }
64 }
65 impl TryFrom<Duration> for PollTimeout {
66     type Error = PollTimeoutTryFromError;
try_from(x: Duration) -> std::result::Result<Self, Self::Error>67     fn try_from(x: Duration) -> std::result::Result<Self, Self::Error> {
68         Ok(Self(
69             i32::try_from(x.as_millis())
70                 .map_err(|_| PollTimeoutTryFromError::TooPositive)?,
71         ))
72     }
73 }
74 impl TryFrom<u128> for PollTimeout {
75     type Error = PollTimeoutTryFromError;
try_from(x: u128) -> std::result::Result<Self, Self::Error>76     fn try_from(x: u128) -> std::result::Result<Self, Self::Error> {
77         Ok(Self(
78             i32::try_from(x)
79                 .map_err(|_| PollTimeoutTryFromError::TooPositive)?,
80         ))
81     }
82 }
83 impl TryFrom<u64> for PollTimeout {
84     type Error = PollTimeoutTryFromError;
try_from(x: u64) -> std::result::Result<Self, Self::Error>85     fn try_from(x: u64) -> std::result::Result<Self, Self::Error> {
86         Ok(Self(
87             i32::try_from(x)
88                 .map_err(|_| PollTimeoutTryFromError::TooPositive)?,
89         ))
90     }
91 }
92 impl TryFrom<u32> for PollTimeout {
93     type Error = PollTimeoutTryFromError;
try_from(x: u32) -> std::result::Result<Self, Self::Error>94     fn try_from(x: u32) -> std::result::Result<Self, Self::Error> {
95         Ok(Self(
96             i32::try_from(x)
97                 .map_err(|_| PollTimeoutTryFromError::TooPositive)?,
98         ))
99     }
100 }
101 impl From<u16> for PollTimeout {
from(x: u16) -> Self102     fn from(x: u16) -> Self {
103         Self(i32::from(x))
104     }
105 }
106 impl From<u8> for PollTimeout {
from(x: u8) -> Self107     fn from(x: u8) -> Self {
108         Self(i32::from(x))
109     }
110 }
111 impl TryFrom<i128> for PollTimeout {
112     type Error = PollTimeoutTryFromError;
try_from(x: i128) -> std::result::Result<Self, Self::Error>113     fn try_from(x: i128) -> std::result::Result<Self, Self::Error> {
114         match x {
115             ..=-2 => Err(PollTimeoutTryFromError::TooNegative),
116             -1.. => Ok(Self(
117                 i32::try_from(x)
118                     .map_err(|_| PollTimeoutTryFromError::TooPositive)?,
119             )),
120         }
121     }
122 }
123 impl TryFrom<i64> for PollTimeout {
124     type Error = PollTimeoutTryFromError;
try_from(x: i64) -> std::result::Result<Self, Self::Error>125     fn try_from(x: i64) -> std::result::Result<Self, Self::Error> {
126         match x {
127             ..=-2 => Err(PollTimeoutTryFromError::TooNegative),
128             -1.. => Ok(Self(
129                 i32::try_from(x)
130                     .map_err(|_| PollTimeoutTryFromError::TooPositive)?,
131             )),
132         }
133     }
134 }
135 impl TryFrom<i32> for PollTimeout {
136     type Error = PollTimeoutTryFromError;
try_from(x: i32) -> std::result::Result<Self, Self::Error>137     fn try_from(x: i32) -> std::result::Result<Self, Self::Error> {
138         match x {
139             ..=-2 => Err(PollTimeoutTryFromError::TooNegative),
140             -1.. => Ok(Self(x)),
141         }
142     }
143 }
144 impl TryFrom<i16> for PollTimeout {
145     type Error = PollTimeoutTryFromError;
try_from(x: i16) -> std::result::Result<Self, Self::Error>146     fn try_from(x: i16) -> std::result::Result<Self, Self::Error> {
147         match x {
148             ..=-2 => Err(PollTimeoutTryFromError::TooNegative),
149             -1.. => Ok(Self(i32::from(x))),
150         }
151     }
152 }
153 impl TryFrom<i8> for PollTimeout {
154     type Error = PollTimeoutTryFromError;
try_from(x: i8) -> std::result::Result<Self, Self::Error>155     fn try_from(x: i8) -> std::result::Result<Self, Self::Error> {
156         match x {
157             ..=-2 => Err(PollTimeoutTryFromError::TooNegative),
158             -1.. => Ok(Self(i32::from(x))),
159         }
160     }
161 }
162 impl TryFrom<PollTimeout> for Duration {
163     type Error = ();
try_from(x: PollTimeout) -> std::result::Result<Self, ()>164     fn try_from(x: PollTimeout) -> std::result::Result<Self, ()> {
165         x.duration().ok_or(())
166     }
167 }
168 impl TryFrom<PollTimeout> for u128 {
169     type Error = <Self as TryFrom<i32>>::Error;
try_from(x: PollTimeout) -> std::result::Result<Self, Self::Error>170     fn try_from(x: PollTimeout) -> std::result::Result<Self, Self::Error> {
171         Self::try_from(x.0)
172     }
173 }
174 impl TryFrom<PollTimeout> for u64 {
175     type Error = <Self as TryFrom<i32>>::Error;
try_from(x: PollTimeout) -> std::result::Result<Self, Self::Error>176     fn try_from(x: PollTimeout) -> std::result::Result<Self, Self::Error> {
177         Self::try_from(x.0)
178     }
179 }
180 impl TryFrom<PollTimeout> for u32 {
181     type Error = <Self as TryFrom<i32>>::Error;
try_from(x: PollTimeout) -> std::result::Result<Self, Self::Error>182     fn try_from(x: PollTimeout) -> std::result::Result<Self, Self::Error> {
183         Self::try_from(x.0)
184     }
185 }
186 impl TryFrom<PollTimeout> for u16 {
187     type Error = <Self as TryFrom<i32>>::Error;
try_from(x: PollTimeout) -> std::result::Result<Self, Self::Error>188     fn try_from(x: PollTimeout) -> std::result::Result<Self, Self::Error> {
189         Self::try_from(x.0)
190     }
191 }
192 impl TryFrom<PollTimeout> for u8 {
193     type Error = <Self as TryFrom<i32>>::Error;
try_from(x: PollTimeout) -> std::result::Result<Self, Self::Error>194     fn try_from(x: PollTimeout) -> std::result::Result<Self, Self::Error> {
195         Self::try_from(x.0)
196     }
197 }
198 impl From<PollTimeout> for i128 {
from(x: PollTimeout) -> Self199     fn from(x: PollTimeout) -> Self {
200         Self::from(x.0)
201     }
202 }
203 impl From<PollTimeout> for i64 {
from(x: PollTimeout) -> Self204     fn from(x: PollTimeout) -> Self {
205         Self::from(x.0)
206     }
207 }
208 impl From<PollTimeout> for i32 {
from(x: PollTimeout) -> Self209     fn from(x: PollTimeout) -> Self {
210         x.0
211     }
212 }
213 impl TryFrom<PollTimeout> for i16 {
214     type Error = <Self as TryFrom<i32>>::Error;
try_from(x: PollTimeout) -> std::result::Result<Self, Self::Error>215     fn try_from(x: PollTimeout) -> std::result::Result<Self, Self::Error> {
216         Self::try_from(x.0)
217     }
218 }
219 impl TryFrom<PollTimeout> for i8 {
220     type Error = <Self as TryFrom<i32>>::Error;
try_from(x: PollTimeout) -> std::result::Result<Self, Self::Error>221     fn try_from(x: PollTimeout) -> std::result::Result<Self, Self::Error> {
222         Self::try_from(x.0)
223     }
224 }
225