use crate::std::fmt; /// An error that can occur while parsing a [`Uuid`] string. /// /// [`Uuid`]: ../struct.Uuid.html #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] #[allow(clippy::enum_variant_names)] pub(crate) enum Error { /// Invalid character in the [`Uuid`] string. /// /// [`Uuid`]: ../struct.Uuid.html InvalidCharacter { /// The expected characters. expected: &'static str, /// The invalid character found. found: char, /// The invalid character position. index: usize, /// Indicates the [`Uuid`] starts with `urn:uuid:`. /// /// This is a special case for [`Urn`] adapter parsing. /// /// [`Uuid`]: ../Uuid.html urn: UrnPrefix, }, /// Invalid number of segments in the [`Uuid`] string. /// /// [`Uuid`]: ../struct.Uuid.html InvalidGroupCount { /// The expected number of segments. // TODO: explain multiple segment count. // BODY: Parsers can expect a range of Uuid segment count. // This needs to be expanded on. expected: ExpectedLength, /// The number of segments found. found: usize, }, /// Invalid length of a segment in a [`Uuid`] string. /// /// [`Uuid`]: ../struct.Uuid.html InvalidGroupLength { /// The expected length of the segment. expected: ExpectedLength, /// The length of segment found. found: usize, /// The segment with invalid length. group: usize, }, /// Invalid length of the [`Uuid`] string. /// /// [`Uuid`]: ../struct.Uuid.html InvalidLength { /// The expected length(s). // TODO: explain multiple lengths. // BODY: Parsers can expect a range of Uuid lenghts. // This needs to be expanded on. expected: ExpectedLength, /// The invalid length found. found: usize, }, } /// The expected length. #[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)] pub(crate) enum ExpectedLength { /// Expected any one of the given values. Any(&'static [usize]), /// Expected the given value. Exact(usize), } /// Urn prefix value. #[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)] pub(crate) enum UrnPrefix { /// The `urn:uuid:` prefix should optionally provided. Optional, } impl Error { fn _description(&self) -> &str { match *self { Error::InvalidCharacter { .. } => "invalid character", Error::InvalidGroupCount { .. } => "invalid number of groups", Error::InvalidGroupLength { .. } => "invalid group length", Error::InvalidLength { .. } => "invalid length", } } } impl fmt::Display for ExpectedLength { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match *self { ExpectedLength::Any(crits) => write!(f, "one of {:?}", crits), ExpectedLength::Exact(crit) => write!(f, "{}", crit), } } } impl fmt::Display for Error { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{}: ", self._description())?; match *self { Error::InvalidCharacter { expected, found, index, urn, } => { let urn_str = match urn { UrnPrefix::Optional => { " an optional prefix of `urn:uuid:` followed by" } }; write!( f, "expected{} {}, found {} at {}", urn_str, expected, found, index ) } Error::InvalidGroupCount { ref expected, found, } => write!(f, "expected {}, found {}", expected, found), Error::InvalidGroupLength { ref expected, found, group, } => write!( f, "expected {}, found {} in group {}", expected, found, group, ), Error::InvalidLength { ref expected, found, } => write!(f, "expected {}, found {}", expected, found), } } } #[cfg(feature = "std")] mod std_support { use super::*; use crate::std::error; impl error::Error for Error {} }