| //! 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<io::Error> for Format { |
| fn from(err: io::Error) -> Self { |
| Self::StdIo(err) |
| } |
| } |
| |
| impl TryFrom<Format> for io::Error { |
| type Error = error::DifferentVariant; |
| |
| fn try_from(err: Format) -> Result<Self, Self::Error> { |
| 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<Format> for crate::Error { |
| fn from(original: Format) -> Self { |
| Self::Format(original) |
| } |
| } |
| |
| impl TryFrom<crate::Error> for Format { |
| type Error = error::DifferentVariant; |
| |
| fn try_from(err: crate::Error) -> Result<Self, Self::Error> { |
| 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<S: serde::Serializer>(self) -> S::Error { |
| use serde::ser::Error; |
| S::Error::custom(self) |
| } |
| } |