summaryrefslogtreecommitdiffstats
path: root/third_party/rust/nix/src/poll_timeout.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/nix/src/poll_timeout.rs')
-rw-r--r--third_party/rust/nix/src/poll_timeout.rs224
1 files changed, 224 insertions, 0 deletions
diff --git a/third_party/rust/nix/src/poll_timeout.rs b/third_party/rust/nix/src/poll_timeout.rs
new file mode 100644
index 0000000000..f7d9015f56
--- /dev/null
+++ b/third_party/rust/nix/src/poll_timeout.rs
@@ -0,0 +1,224 @@
+use std::time::Duration;
+
+/// PollTimeout argument for polling.
+#[derive(Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd)]
+pub struct PollTimeout(i32);
+
+impl PollTimeout {
+ /// Blocks indefinitely.
+ ///
+ /// > Specifying a negative value in timeout means an infinite timeout.
+ pub const NONE: Self = Self(-1);
+ /// Returns immediately.
+ ///
+ /// > Specifying a timeout of zero causes poll() to return immediately, even if no file
+ /// > descriptors are ready.
+ pub const ZERO: Self = Self(0);
+ /// Blocks for at most [`i32::MAX`] milliseconds.
+ pub const MAX: Self = Self(i32::MAX);
+ /// Returns if `self` equals [`PollTimeout::NONE`].
+ pub fn is_none(&self) -> bool {
+ // > Specifying a negative value in timeout means an infinite timeout.
+ *self <= Self::NONE
+ }
+ /// Returns if `self` does not equal [`PollTimeout::NONE`].
+ pub fn is_some(&self) -> bool {
+ !self.is_none()
+ }
+ /// Returns the timeout in milliseconds if there is some, otherwise returns `None`.
+ pub fn as_millis(&self) -> Option<u32> {
+ self.is_some().then_some(u32::try_from(self.0).unwrap())
+ }
+ /// Returns the timeout as a `Duration` if there is some, otherwise returns `None`.
+ pub fn duration(&self) -> Option<Duration> {
+ self.as_millis()
+ .map(|x| Duration::from_millis(u64::from(x)))
+ }
+}
+
+/// Error type for integer conversions into `PollTimeout`.
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+pub enum PollTimeoutTryFromError {
+ /// Passing a value less than -1 is invalid on some systems, see
+ /// <https://man.freebsd.org/cgi/man.cgi?poll#end>.
+ TooNegative,
+ /// Passing a value greater than `i32::MAX` is invalid.
+ TooPositive,
+}
+
+impl std::fmt::Display for PollTimeoutTryFromError {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ match self {
+ Self::TooNegative => write!(f, "Passed a negative timeout less than -1."),
+ Self::TooPositive => write!(f, "Passed a positive timeout greater than `i32::MAX` milliseconds.")
+ }
+ }
+}
+
+impl std::error::Error for PollTimeoutTryFromError {}
+
+impl<T: Into<PollTimeout>> From<Option<T>> for PollTimeout {
+ fn from(x: Option<T>) -> Self {
+ x.map_or(Self::NONE, |x| x.into())
+ }
+}
+impl TryFrom<Duration> for PollTimeout {
+ type Error = PollTimeoutTryFromError;
+ fn try_from(x: Duration) -> std::result::Result<Self, Self::Error> {
+ Ok(Self(
+ i32::try_from(x.as_millis())
+ .map_err(|_| PollTimeoutTryFromError::TooPositive)?,
+ ))
+ }
+}
+impl TryFrom<u128> for PollTimeout {
+ type Error = PollTimeoutTryFromError;
+ fn try_from(x: u128) -> std::result::Result<Self, Self::Error> {
+ Ok(Self(
+ i32::try_from(x)
+ .map_err(|_| PollTimeoutTryFromError::TooPositive)?,
+ ))
+ }
+}
+impl TryFrom<u64> for PollTimeout {
+ type Error = PollTimeoutTryFromError;
+ fn try_from(x: u64) -> std::result::Result<Self, Self::Error> {
+ Ok(Self(
+ i32::try_from(x)
+ .map_err(|_| PollTimeoutTryFromError::TooPositive)?,
+ ))
+ }
+}
+impl TryFrom<u32> for PollTimeout {
+ type Error = PollTimeoutTryFromError;
+ fn try_from(x: u32) -> std::result::Result<Self, Self::Error> {
+ Ok(Self(
+ i32::try_from(x)
+ .map_err(|_| PollTimeoutTryFromError::TooPositive)?,
+ ))
+ }
+}
+impl From<u16> for PollTimeout {
+ fn from(x: u16) -> Self {
+ Self(i32::from(x))
+ }
+}
+impl From<u8> for PollTimeout {
+ fn from(x: u8) -> Self {
+ Self(i32::from(x))
+ }
+}
+impl TryFrom<i128> for PollTimeout {
+ type Error = PollTimeoutTryFromError;
+ fn try_from(x: i128) -> std::result::Result<Self, Self::Error> {
+ match x {
+ ..=-2 => Err(PollTimeoutTryFromError::TooNegative),
+ -1.. => Ok(Self(
+ i32::try_from(x)
+ .map_err(|_| PollTimeoutTryFromError::TooPositive)?,
+ )),
+ }
+ }
+}
+impl TryFrom<i64> for PollTimeout {
+ type Error = PollTimeoutTryFromError;
+ fn try_from(x: i64) -> std::result::Result<Self, Self::Error> {
+ match x {
+ ..=-2 => Err(PollTimeoutTryFromError::TooNegative),
+ -1.. => Ok(Self(
+ i32::try_from(x)
+ .map_err(|_| PollTimeoutTryFromError::TooPositive)?,
+ )),
+ }
+ }
+}
+impl TryFrom<i32> for PollTimeout {
+ type Error = PollTimeoutTryFromError;
+ fn try_from(x: i32) -> std::result::Result<Self, Self::Error> {
+ match x {
+ ..=-2 => Err(PollTimeoutTryFromError::TooNegative),
+ -1.. => Ok(Self(x)),
+ }
+ }
+}
+impl TryFrom<i16> for PollTimeout {
+ type Error = PollTimeoutTryFromError;
+ fn try_from(x: i16) -> std::result::Result<Self, Self::Error> {
+ match x {
+ ..=-2 => Err(PollTimeoutTryFromError::TooNegative),
+ -1.. => Ok(Self(i32::from(x))),
+ }
+ }
+}
+impl TryFrom<i8> for PollTimeout {
+ type Error = PollTimeoutTryFromError;
+ fn try_from(x: i8) -> std::result::Result<Self, Self::Error> {
+ match x {
+ ..=-2 => Err(PollTimeoutTryFromError::TooNegative),
+ -1.. => Ok(Self(i32::from(x))),
+ }
+ }
+}
+impl TryFrom<PollTimeout> for Duration {
+ type Error = ();
+ fn try_from(x: PollTimeout) -> std::result::Result<Self, ()> {
+ x.duration().ok_or(())
+ }
+}
+impl TryFrom<PollTimeout> for u128 {
+ type Error = <Self as TryFrom<i32>>::Error;
+ fn try_from(x: PollTimeout) -> std::result::Result<Self, Self::Error> {
+ Self::try_from(x.0)
+ }
+}
+impl TryFrom<PollTimeout> for u64 {
+ type Error = <Self as TryFrom<i32>>::Error;
+ fn try_from(x: PollTimeout) -> std::result::Result<Self, Self::Error> {
+ Self::try_from(x.0)
+ }
+}
+impl TryFrom<PollTimeout> for u32 {
+ type Error = <Self as TryFrom<i32>>::Error;
+ fn try_from(x: PollTimeout) -> std::result::Result<Self, Self::Error> {
+ Self::try_from(x.0)
+ }
+}
+impl TryFrom<PollTimeout> for u16 {
+ type Error = <Self as TryFrom<i32>>::Error;
+ fn try_from(x: PollTimeout) -> std::result::Result<Self, Self::Error> {
+ Self::try_from(x.0)
+ }
+}
+impl TryFrom<PollTimeout> for u8 {
+ type Error = <Self as TryFrom<i32>>::Error;
+ fn try_from(x: PollTimeout) -> std::result::Result<Self, Self::Error> {
+ Self::try_from(x.0)
+ }
+}
+impl From<PollTimeout> for i128 {
+ fn from(x: PollTimeout) -> Self {
+ Self::from(x.0)
+ }
+}
+impl From<PollTimeout> for i64 {
+ fn from(x: PollTimeout) -> Self {
+ Self::from(x.0)
+ }
+}
+impl From<PollTimeout> for i32 {
+ fn from(x: PollTimeout) -> Self {
+ x.0
+ }
+}
+impl TryFrom<PollTimeout> for i16 {
+ type Error = <Self as TryFrom<i32>>::Error;
+ fn try_from(x: PollTimeout) -> std::result::Result<Self, Self::Error> {
+ Self::try_from(x.0)
+ }
+}
+impl TryFrom<PollTimeout> for i8 {
+ type Error = <Self as TryFrom<i32>>::Error;
+ fn try_from(x: PollTimeout) -> std::result::Result<Self, Self::Error> {
+ Self::try_from(x.0)
+ }
+}