//! Error formatting a struct use core::fmt; use std::io; use crate::error; /// An error occurred when formatting. #[non_exhaustive] #[allow(missing_copy_implementations)] #[derive(Debug)] pub enum Format { /// The type being formatted does not contain sufficient information to format a component. #[non_exhaustive] InsufficientTypeInformation, /// The component named has a value that cannot be formatted into the requested format. /// /// This variant is only returned when using well-known formats. InvalidComponent(&'static str), /// A value of `std::io::Error` was returned internally. StdIo(io::Error), } impl fmt::Display for Format { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { Self::InsufficientTypeInformation => f.write_str( "The type being formatted does not contain sufficient information to format a \ component.", ), Self::InvalidComponent(component) => write!( f, "The {component} component cannot be formatted into the requested format." ), Self::StdIo(err) => err.fmt(f), } } } impl From for Format { fn from(err: io::Error) -> Self { Self::StdIo(err) } } impl TryFrom for io::Error { type Error = error::DifferentVariant; fn try_from(err: Format) -> Result { match err { Format::StdIo(err) => Ok(err), _ => Err(error::DifferentVariant), } } } #[cfg(feature = "std")] impl std::error::Error for Format { fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { match *self { Self::InsufficientTypeInformation | Self::InvalidComponent(_) => None, Self::StdIo(ref err) => Some(err), } } } impl From for crate::Error { fn from(original: Format) -> Self { Self::Format(original) } } impl TryFrom for Format { type Error = error::DifferentVariant; fn try_from(err: crate::Error) -> Result { match err { crate::Error::Format(err) => Ok(err), _ => Err(error::DifferentVariant), } } } #[cfg(feature = "serde")] impl Format { /// Obtain an error type for the serializer. #[doc(hidden)] // Exposed only for the `declare_format_string` macro pub fn into_invalid_serde_value(self) -> S::Error { use serde::ser::Error; S::Error::custom(self) } }