#![allow(dead_code)] #[cfg(feature = "use_core")] extern crate core; #[macro_use] extern crate derivative; use std::marker::PhantomData; #[derive(Derivative)] #[derivative(Debug)] struct Foo { foo: T, #[derivative(Debug="ignore")] bar: U, } #[derive(Derivative)] #[derivative(Debug)] struct Bar ( T, #[derivative(Debug="ignore")] U, ); #[derive(Derivative)] #[derivative(Debug)] enum C { V1(T), V2(#[derivative(Debug="ignore")] U), V3(String), } #[derive(Derivative)] #[derivative(Debug)] enum D { V1 { #[derivative(Debug="ignore")] a: U } } #[derive(Derivative)] #[derivative(Debug)] struct F(#[derivative(Debug="ignore")] U); #[derive(Derivative)] #[derivative(Debug)] struct G(isize, #[derivative(Debug="ignore")] U); #[derive(Derivative)] #[derivative(Debug)] struct J(#[derivative(Debug="ignore")] U); struct NoDebug; trait ToDebug { fn to_show(&self) -> String; } impl ToDebug for T { fn to_show(&self) -> String { format!("{:?}", self) } } #[derive(Derivative)] #[derivative(Debug)] struct PhantomField { foo: PhantomData, } #[derive(Derivative)] #[derivative(Debug)] struct PhantomTuple { foo: PhantomData<(T,)>, } #[test] fn main() { assert_eq!(Foo { foo: 42, bar: NoDebug }.to_show(), "Foo { foo: 42 }".to_string()); assert_eq!(Bar(42, NoDebug).to_show(), "Bar(42)".to_string()); assert_eq!(C::V1::(12).to_show(), "V1(12)".to_string()); assert_eq!(C::V2::(NoDebug).to_show(), "V2".to_string()); assert_eq!(C::V3::("foo".to_string()).to_show(), "V3(\"foo\")".to_string()); assert_eq!(D::V1 { a: NoDebug }.to_show(), "V1".to_string()); assert_eq!(F(NoDebug).to_show(), "F".to_string()); assert_eq!(G(42, NoDebug).to_show(), "G(42)".to_string()); assert_eq!(J(NoDebug).to_show(), "J".to_string()); assert_eq!(&format!("{:?}", PhantomField:: { foo: Default::default() }), "PhantomField { foo: PhantomData }"); assert_eq!(&format!("{:?}", PhantomTuple:: { foo: Default::default() }), "PhantomTuple { foo: PhantomData }"); }