summaryrefslogtreecommitdiff
path: root/vendor/time/src/error/component_range.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/time/src/error/component_range.rs')
-rw-r--r--vendor/time/src/error/component_range.rs114
1 files changed, 114 insertions, 0 deletions
diff --git a/vendor/time/src/error/component_range.rs b/vendor/time/src/error/component_range.rs
new file mode 100644
index 00000000..dc980234
--- /dev/null
+++ b/vendor/time/src/error/component_range.rs
@@ -0,0 +1,114 @@
+//! Component range error
+
+use core::{fmt, hash};
+
+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, Eq)]
+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_message: Option<&'static str>,
+}
+
+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_message.is_some()
+ }
+}
+
+impl PartialEq for ComponentRange {
+ fn eq(&self, other: &Self) -> bool {
+ self.name == other.name
+ && self.minimum == other.minimum
+ && self.maximum == other.maximum
+ && self.value == other.value
+ // Skip the contents of the message when comparing for equality.
+ && self.conditional_message.is_some() == other.conditional_message.is_some()
+ }
+}
+
+impl hash::Hash for ComponentRange {
+ fn hash<H: hash::Hasher>(&self, state: &mut H) {
+ self.name.hash(state);
+ self.minimum.hash(state);
+ self.maximum.hash(state);
+ self.value.hash(state);
+ // Skip the contents of the message when comparing for equality.
+ self.conditional_message.is_some().hash(state);
+ }
+}
+
+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 let Some(message) = self.conditional_message {
+ write!(f, " {message}")?;
+ }
+
+ 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 {}