blob: 3a9c7bc0d5212c1a7df2c5d3321852f94700d7ef [file] [log] [blame]
#[cfg(feature = "use_core")]
extern crate core;
#[macro_use]
extern crate derivative;
use std::fmt::{Formatter, Result as FmtResult};
#[derive(Derivative)]
#[derivative(Debug)]
struct Foo<T, U> {
foo: T,
#[derivative(Debug(format_with="MyDebug::my_fmt", bound="U: MyDebug"))]
bar: U,
}
#[derive(Derivative)]
#[derivative(Debug(bound="T: std::fmt::Debug, U:MyDebug"))]
struct Foo2<T, U> {
foo: T,
#[derivative(Debug(format_with="MyDebug::my_fmt"))]
bar: U,
}
#[derive(Derivative)]
#[derivative(Debug)]
struct Bar<T, U> (
T,
#[derivative(Debug(format_with="MyDebug::my_fmt", bound="U: MyDebug"))]
U,
);
#[derive(Derivative)]
#[derivative(Debug(bound="T: std::fmt::Debug, U:MyDebug"))]
struct Bar2<T, U> (
T,
#[derivative(Debug(format_with="MyDebug::my_fmt"))]
U,
);
struct NoDebug;
struct GenericNeedsNoDebug<T>(T);
impl<T> std::fmt::Debug for GenericNeedsNoDebug<T> {
fn fmt(&self, f: &mut std::fmt::Formatter) -> FmtResult {
f.write_str("GenericNeedsNoDebug")
}
}
#[derive(Derivative)]
#[derivative(Debug)]
struct TestUnneededBound<T>( // Test that we don't add T: Debug
#[derivative(Debug(bound=""))] GenericNeedsNoDebug<T>,
);
trait MyDebug {
fn my_fmt(&self, f: &mut Formatter) -> FmtResult {
f.write_str("MyDebug")
}
}
impl MyDebug for i32 { }
impl<'a, T> MyDebug for &'a T { }
trait ToDebug {
fn to_show(&self) -> String;
}
impl<T: std::fmt::Debug> ToDebug for T {
fn to_show(&self) -> String {
format!("{:?}", self)
}
}
#[test]
fn main() {
assert_eq!(Foo { foo: 42, bar: 0 }.to_show(), "Foo { foo: 42, bar: MyDebug }".to_string());
assert_eq!(Foo2 { foo: 42, bar: 0 }.to_show(), "Foo2 { foo: 42, bar: MyDebug }".to_string());
assert_eq!(Bar(42, 0).to_show(), "Bar(42, MyDebug)".to_string());
assert_eq!(Bar2(42, 0).to_show(), "Bar2(42, MyDebug)".to_string());
assert_eq!(TestUnneededBound(GenericNeedsNoDebug(NoDebug)).to_show(), "TestUnneededBound(GenericNeedsNoDebug)".to_string());
}