| //! 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 {} |