use crate::std::fmt; use crate::{builder, parser}; /// A general error that can occur when working with UUIDs. // TODO: improve the doc // BODY: This detail should be fine for initial merge #[derive(Clone, Debug, Eq, Hash, PartialEq)] pub struct Error(Inner); // TODO: write tests for Error // BODY: not immediately blocking, but should be covered for 1.0 #[derive(Clone, Debug, Eq, Hash, PartialEq)] enum Inner { /// An error occurred while handling [`Uuid`] bytes. /// /// See [`BytesError`] /// /// [`BytesError`]: struct.BytesError.html /// [`Uuid`]: struct.Uuid.html Build(builder::Error), /// An error occurred while parsing a [`Uuid`] string. /// /// See [`parser::ParseError`] /// /// [`parser::ParseError`]: parser/enum.ParseError.html /// [`Uuid`]: struct.Uuid.html Parser(parser::Error), } impl From for Error { fn from(err: builder::Error) -> Self { Error(Inner::Build(err)) } } impl From for Error { fn from(err: parser::Error) -> Self { Error(Inner::Parser(err)) } } impl fmt::Display for Error { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self.0 { Inner::Build(ref err) => fmt::Display::fmt(&err, f), Inner::Parser(ref err) => fmt::Display::fmt(&err, f), } } } #[cfg(feature = "std")] mod std_support { use super::*; use crate::std::error; impl error::Error for Error { fn source(&self) -> Option<&(dyn error::Error + 'static)> { match self.0 { Inner::Build(ref err) => Some(err), Inner::Parser(ref err) => Some(err), } } } } #[cfg(test)] mod test_util { use super::*; impl Error { pub(crate) fn expect_parser(self) -> parser::Error { match self.0 { Inner::Parser(err) => err, _ => panic!("expected a `parser::Error` variant"), } } } }