|  | #![allow(clippy::needless_late_init, clippy::uninlined_format_args)] | 
|  |  | 
|  | use std::fmt::{self, Debug, Display}; | 
|  | use thiserror::Error; | 
|  |  | 
|  | pub struct NoFormat; | 
|  |  | 
|  | #[derive(Debug)] | 
|  | pub struct DebugOnly; | 
|  |  | 
|  | pub struct DisplayOnly; | 
|  |  | 
|  | impl Display for DisplayOnly { | 
|  | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | 
|  | f.write_str("display only") | 
|  | } | 
|  | } | 
|  |  | 
|  | #[derive(Debug)] | 
|  | pub struct DebugAndDisplay; | 
|  |  | 
|  | impl Display for DebugAndDisplay { | 
|  | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | 
|  | f.write_str("debug and display") | 
|  | } | 
|  | } | 
|  |  | 
|  | // Should expand to: | 
|  | // | 
|  | //     impl<E> Display for EnumDebugField<E> | 
|  | //     where | 
|  | //         E: Debug; | 
|  | // | 
|  | //     impl<E> Error for EnumDebugField<E> | 
|  | //     where | 
|  | //         Self: Debug + Display; | 
|  | // | 
|  | #[derive(Error, Debug)] | 
|  | pub enum EnumDebugGeneric<E> { | 
|  | #[error("{0:?}")] | 
|  | FatalError(E), | 
|  | } | 
|  |  | 
|  | // Should expand to: | 
|  | // | 
|  | //     impl<E> Display for EnumFromGeneric<E>; | 
|  | // | 
|  | //     impl<E> Error for EnumFromGeneric<E> | 
|  | //     where | 
|  | //         EnumDebugGeneric<E>: Error + 'static, | 
|  | //         Self: Debug + Display; | 
|  | // | 
|  | #[derive(Error, Debug)] | 
|  | pub enum EnumFromGeneric<E> { | 
|  | #[error("enum from generic")] | 
|  | Source(#[from] EnumDebugGeneric<E>), | 
|  | } | 
|  |  | 
|  | // Should expand to: | 
|  | // | 
|  | //     impl<HasDisplay, HasDebug, HasNeither> Display | 
|  | //         for EnumCompound<HasDisplay, HasDebug, HasNeither> | 
|  | //     where | 
|  | //         HasDisplay: Display, | 
|  | //         HasDebug: Debug; | 
|  | // | 
|  | //     impl<HasDisplay, HasDebug, HasNeither> Error | 
|  | //         for EnumCompound<HasDisplay, HasDebug, HasNeither> | 
|  | //     where | 
|  | //         Self: Debug + Display; | 
|  | // | 
|  | #[derive(Error)] | 
|  | pub enum EnumCompound<HasDisplay, HasDebug, HasNeither> { | 
|  | #[error("{0} {1:?}")] | 
|  | DisplayDebug(HasDisplay, HasDebug), | 
|  | #[error("{0}")] | 
|  | Display(HasDisplay, HasNeither), | 
|  | #[error("{1:?}")] | 
|  | Debug(HasNeither, HasDebug), | 
|  | } | 
|  |  | 
|  | impl<HasDisplay, HasDebug, HasNeither> Debug for EnumCompound<HasDisplay, HasDebug, HasNeither> { | 
|  | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | 
|  | f.write_str("EnumCompound") | 
|  | } | 
|  | } | 
|  |  | 
|  | #[test] | 
|  | fn test_display_enum_compound() { | 
|  | let mut instance: EnumCompound<DisplayOnly, DebugOnly, NoFormat>; | 
|  |  | 
|  | instance = EnumCompound::DisplayDebug(DisplayOnly, DebugOnly); | 
|  | assert_eq!(format!("{}", instance), "display only DebugOnly"); | 
|  |  | 
|  | instance = EnumCompound::Display(DisplayOnly, NoFormat); | 
|  | assert_eq!(format!("{}", instance), "display only"); | 
|  |  | 
|  | instance = EnumCompound::Debug(NoFormat, DebugOnly); | 
|  | assert_eq!(format!("{}", instance), "DebugOnly"); | 
|  | } | 
|  |  | 
|  | // Should expand to: | 
|  | // | 
|  | //     impl<E> Display for EnumTransparentGeneric<E> | 
|  | //     where | 
|  | //         E: Display; | 
|  | // | 
|  | //     impl<E> Error for EnumTransparentGeneric<E> | 
|  | //     where | 
|  | //         E: Error, | 
|  | //         Self: Debug + Display; | 
|  | // | 
|  | #[derive(Error, Debug)] | 
|  | pub enum EnumTransparentGeneric<E> { | 
|  | #[error(transparent)] | 
|  | Other(E), | 
|  | } | 
|  |  | 
|  | // Should expand to: | 
|  | // | 
|  | //     impl<E> Display for StructDebugGeneric<E> | 
|  | //     where | 
|  | //         E: Debug; | 
|  | // | 
|  | //     impl<E> Error for StructDebugGeneric<E> | 
|  | //     where | 
|  | //         Self: Debug + Display; | 
|  | // | 
|  | #[derive(Error, Debug)] | 
|  | #[error("{underlying:?}")] | 
|  | pub struct StructDebugGeneric<E> { | 
|  | pub underlying: E, | 
|  | } | 
|  |  | 
|  | // Should expand to: | 
|  | // | 
|  | //     impl<E> Error for StructFromGeneric<E> | 
|  | //     where | 
|  | //         StructDebugGeneric<E>: Error + 'static, | 
|  | //         Self: Debug + Display; | 
|  | // | 
|  | #[derive(Error, Debug)] | 
|  | pub struct StructFromGeneric<E> { | 
|  | #[from] | 
|  | pub source: StructDebugGeneric<E>, | 
|  | } | 
|  |  | 
|  | // Should expand to: | 
|  | // | 
|  | //     impl<E> Display for StructTransparentGeneric<E> | 
|  | //     where | 
|  | //         E: Display; | 
|  | // | 
|  | //     impl<E> Error for StructTransparentGeneric<E> | 
|  | //     where | 
|  | //         E: Error, | 
|  | //         Self: Debug + Display; | 
|  | // | 
|  | #[derive(Error, Debug)] | 
|  | #[error(transparent)] | 
|  | pub struct StructTransparentGeneric<E>(E); |