mirror of
https://git.proxmox.com/git/rustc
synced 2026-03-27 08:11:45 +00:00
93 lines
2.6 KiB
Rust
93 lines
2.6 KiB
Rust
//! Component range error
|
|
|
|
use core::fmt;
|
|
|
|
use crate::error;
|
|
|
|
/// An error type indicating that a component provided to a method was out of range, causing a
|
|
/// failure.
|
|
// i64 is the narrowest type fitting all use cases. This eliminates the need for a type parameter.
|
|
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
|
pub struct ComponentRange {
|
|
/// Name of the component.
|
|
pub(crate) name: &'static str,
|
|
/// Minimum allowed value, inclusive.
|
|
pub(crate) minimum: i64,
|
|
/// Maximum allowed value, inclusive.
|
|
pub(crate) maximum: i64,
|
|
/// Value that was provided.
|
|
pub(crate) value: i64,
|
|
/// The minimum and/or maximum value is conditional on the value of other
|
|
/// parameters.
|
|
pub(crate) conditional_range: bool,
|
|
}
|
|
|
|
impl ComponentRange {
|
|
/// Obtain the name of the component whose value was out of range.
|
|
pub const fn name(self) -> &'static str {
|
|
self.name
|
|
}
|
|
|
|
/// Whether the value's permitted range is conditional, i.e. whether an input with this
|
|
/// value could have succeeded if the values of other components were different.
|
|
pub const fn is_conditional(self) -> bool {
|
|
self.conditional_range
|
|
}
|
|
}
|
|
|
|
impl fmt::Display for ComponentRange {
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
write!(
|
|
f,
|
|
"{} must be in the range {}..={}",
|
|
self.name, self.minimum, self.maximum
|
|
)?;
|
|
|
|
if self.conditional_range {
|
|
f.write_str(", given values of other parameters")?;
|
|
}
|
|
|
|
Ok(())
|
|
}
|
|
}
|
|
|
|
impl From<ComponentRange> for crate::Error {
|
|
fn from(original: ComponentRange) -> Self {
|
|
Self::ComponentRange(original)
|
|
}
|
|
}
|
|
|
|
impl TryFrom<crate::Error> for ComponentRange {
|
|
type Error = error::DifferentVariant;
|
|
|
|
fn try_from(err: crate::Error) -> Result<Self, Self::Error> {
|
|
match err {
|
|
crate::Error::ComponentRange(err) => Ok(err),
|
|
_ => Err(error::DifferentVariant),
|
|
}
|
|
}
|
|
}
|
|
|
|
/// **This trait implementation is deprecated and will be removed in a future breaking release.**
|
|
#[cfg(feature = "serde")]
|
|
impl serde::de::Expected for ComponentRange {
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
write!(
|
|
f,
|
|
"a value in the range {}..={}",
|
|
self.minimum, self.maximum
|
|
)
|
|
}
|
|
}
|
|
|
|
#[cfg(feature = "serde")]
|
|
impl ComponentRange {
|
|
/// Convert the error to a deserialization error.
|
|
pub(crate) fn into_de_error<E: serde::de::Error>(self) -> E {
|
|
E::invalid_value(serde::de::Unexpected::Signed(self.value), &self)
|
|
}
|
|
}
|
|
|
|
#[cfg(feature = "std")]
|
|
impl std::error::Error for ComponentRange {}
|