diff options
Diffstat (limited to 'third_party/rust/nix/src/poll_timeout.rs')
-rw-r--r-- | third_party/rust/nix/src/poll_timeout.rs | 224 |
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) + } +} |