1 #![allow(dead_code, unused_imports)]
3 extern crate derive_more
;
5 use std
::path
::PathBuf
;
7 // Here just to make sure that this doesn't conflict with
8 // the derives in some way
11 #[derive(Display, Octal, Binary)]
21 #[display(fmt = "({}, {})", x, y)]
28 #[display(fmt = "{}", "self.sign()")]
29 struct PositiveOrNegative
{
33 impl PositiveOrNegative
{
34 fn sign(&self) -> &str {
44 #[display(fmt = "{}", message)]
46 message
: &'
static str,
51 fn new(message
: &'
static str) -> Self {
62 #[display(fmt = "I am B {:b}", i)]
66 #[display(fmt = "I am C {}", "_0.display()")]
71 #[display(fmt = "Java EE")]
78 #[display(fmt = "Hello there!")]
88 #[upper_hex(fmt = "UpperHex")]
91 #[derive(DebugCustom)]
92 #[debug(fmt = "MyDebug")]
105 #[display(fmt = "Generic")]
106 struct Generic
<T
>(T
);
109 #[display(fmt = "Here's a prefix for {} and a suffix")]
112 #[display(fmt = "{} -- {}", wat, stuff)]
119 #[derive(Debug, Display)]
120 #[display(fmt = "{:?}", self)]
121 struct DebugStructAsDisplay
;
125 assert_eq
!(MyInt(-2).to_string(), "-2");
126 assert_eq
!(format
!("{:b}", MyInt(9)), "1001");
127 assert_eq
!(format
!("{:#b}", MyInt(9)), "0b1001");
128 assert_eq
!(format
!("{:o}", MyInt(9)), "11");
129 assert_eq
!(format
!("{:X}", IntEnum
::I8(-1)), "FF");
130 assert_eq
!(format
!("{:#X}", IntEnum
::U8(255)), "0xFF");
131 assert_eq
!(Point2D { x: 3, y: 4 }
.to_string(), "(3, 4)");
132 assert_eq
!(PositiveOrNegative { x: 123 }
.to_string(), "Positive");
133 assert_eq
!(PositiveOrNegative { x: 0 }
.to_string(), "Positive");
134 assert_eq
!(PositiveOrNegative { x: -465 }
.to_string(), "Negative");
135 assert_eq
!(Error
::new("Error").to_string(), "Error");
136 assert_eq
!(E
::Uint(2).to_string(), "2");
137 assert_eq
!(E
::Binary { i: -2 }
.to_string(), "I am B 11111110");
138 assert_eq
!(E
::Path("abc".into()).to_string(), "I am C abc");
139 assert_eq
!(EE
::A
.to_string(), "Java EE");
140 assert_eq
!(EE
::B
.to_string(), "Java EE");
141 assert_eq
!(U { i: 2 }
.to_string(), "Hello there!");
142 assert_eq
!(format
!("{:o}", S
), "7");
143 assert_eq
!(format
!("{:X}", UH
), "UpperHex");
144 assert_eq
!(format
!("{:?}", D
), "MyDebug");
145 assert_eq
!(Unit
.to_string(), "Unit");
146 assert_eq
!(UnitStruct {}
.to_string(), "UnitStruct");
147 assert_eq
!(Generic(()).to_string(), "Generic");
149 Affix
::A(2).to_string(),
150 "Here's a prefix for 2 and a suffix"
154 wat
: "things".to_owned(),
158 "Here's a prefix for things -- false and a suffix"
160 assert_eq
!(DebugStructAsDisplay
.to_string(), "DebugStructAsDisplay");
165 #[display(fmt = "Generic {}", field)]
166 struct NamedGenericStruct
<T
> {
170 fn named_generic_struct() {
171 assert_eq
!(NamedGenericStruct { field: 1 }
.to_string(), "Generic 1");
175 struct AutoNamedGenericStruct
<T
> {
179 fn auto_named_generic_struct() {
180 assert_eq
!(AutoNamedGenericStruct { field: 1 }
.to_string(), "1");
184 #[display(fmt = "Generic {}", "_0")]
185 struct UnnamedGenericStruct
<T
>(T
);
187 fn unnamed_generic_struct() {
188 assert_eq
!(UnnamedGenericStruct(2).to_string(), "Generic 2");
192 struct AutoUnnamedGenericStruct
<T
>(T
);
194 fn auto_unnamed_generic_struct() {
195 assert_eq
!(AutoUnnamedGenericStruct(2).to_string(), "2");
199 enum GenericEnum
<A
, B
> {
200 #[display(fmt = "Gen::A {}", field)]
202 #[display(fmt = "Gen::B {}", "_0")]
207 assert_eq
!(GenericEnum
::A
::<_
, u8> { field: 1 }
.to_string(), "Gen::A 1");
208 assert_eq
!(GenericEnum
::B
::<u8, _
>(2).to_string(), "Gen::B 2");
212 enum AutoGenericEnum
<A
, B
> {
217 fn auto_generic_enum() {
218 assert_eq
!(AutoGenericEnum
::A
::<_
, u8> { field: 1 }
.to_string(), "1");
219 assert_eq
!(AutoGenericEnum
::B
::<u8, _
>(2).to_string(), "2");
223 #[display(fmt = "{} {} <-> {0:o} {1:#x} <-> {0:?} {1:X?}", a, b)]
224 struct MultiTraitNamedGenericStruct
<A
, B
> {
229 fn multi_trait_named_generic_struct() {
230 let s
= MultiTraitNamedGenericStruct { a: 8u8, b: 255 }
;
231 assert_eq
!(s
.to_string(), "8 255 <-> 10 0xff <-> 8 FF");
235 #[display(fmt = "{} {} {{}} {0:o} {1:#x} - {0:>4?} {1:^4X?}", "_0", "_1")]
236 struct MultiTraitUnnamedGenericStruct
<A
, B
>(A
, B
);
238 fn multi_trait_unnamed_generic_struct() {
239 let s
= MultiTraitUnnamedGenericStruct(8u8, 255);
240 assert_eq
!(s
.to_string(), "8 255 {} 10 0xff - 8 FF ");
244 #[display(fmt = "{}", "3 * 4")]
245 struct UnusedGenericStruct
<T
>(T
);
247 fn unused_generic_struct() {
248 let s
= UnusedGenericStruct(());
249 assert_eq
!(s
.to_string(), "12");
252 mod associated_type_field_enumerator
{
261 impl Trait
for Struct
{
266 fn auto_generic_named_struct_associated() {
268 struct AutoGenericNamedStructAssociated
<T
: Trait
> {
269 field
: <T
as Trait
>::Type
,
272 let s
= AutoGenericNamedStructAssociated
::<Struct
> { field: 10 }
;
273 assert_eq
!(s
.to_string(), "10");
277 fn auto_generic_unnamed_struct_associated() {
279 struct AutoGenericUnnamedStructAssociated
<T
: Trait
>(<T
as Trait
>::Type
);
281 let s
= AutoGenericUnnamedStructAssociated
::<Struct
>(10);
282 assert_eq
!(s
.to_string(), "10");
286 fn auto_generic_enum_associated() {
288 enum AutoGenericEnumAssociated
<T
: Trait
> {
289 Enumerator(<T
as Trait
>::Type
),
292 let e
= AutoGenericEnumAssociated
::<Struct
>::Enumerator(10);
293 assert_eq
!(e
.to_string(), "10");
297 mod complex_type_field_enumerator
{
304 fn auto_generic_named_struct_complex() {
306 struct AutoGenericNamedStructComplex
<T
> {
310 let s
= AutoGenericNamedStructComplex { field: Struct(10) }
;
311 assert_eq
!(s
.to_string(), "10");
315 fn auto_generic_unnamed_struct_complex() {
317 struct AutoGenericUnnamedStructComplex
<T
>(Struct
<T
>);
319 let s
= AutoGenericUnnamedStructComplex(Struct(10));
320 assert_eq
!(s
.to_string(), "10");
324 fn auto_generic_enum_complex() {
326 enum AutoGenericEnumComplex
<T
> {
327 Enumerator(Struct
<T
>),
330 let e
= AutoGenericEnumComplex
::Enumerator(Struct(10));
331 assert_eq
!(e
.to_string(), "10")
339 fn auto_generic_reference() {
341 struct AutoGenericReference
<'a
, T
>(&'a T
);
343 let s
= AutoGenericReference(&10);
344 assert_eq
!(s
.to_string(), "10");
348 fn auto_generic_static_reference() {
350 struct AutoGenericStaticReference
<T
: '
static>(&'
static T
);
352 let s
= AutoGenericStaticReference(&10);
353 assert_eq
!(s
.to_string(), "10");
364 fn auto_generic_indirect() {
366 struct AutoGenericIndirect
<T
: '
static>(Struct
<&'
static T
>);
369 let s
= AutoGenericIndirect(Struct(&V
));
370 assert_eq
!(s
.to_string(), "10");
380 #[display(fmt = "{} {}", _0, _1)]
381 struct Struct
<T1
, T2
>(T1
, T2
);
383 let s
= Struct(10, 20);
384 assert_eq
!(s
.to_string(), "10 20");
390 #[display(bound = "T1: ::core::fmt::Display, T2: ::core::fmt::Display")]
391 #[display(fmt = "{} {}", _0, _1)]
392 struct Struct
<T1
, T2
>(T1
, T2
);
394 let s
= Struct(10, 20);
395 assert_eq
!(s
.to_string(), "10 20");
401 fn function1(&self) -> &'
static str;
405 fn function2(&self) -> &'
static str;
408 impl Trait1
for i32 {
409 fn function1(&self) -> &'
static str {
414 impl Trait2
for i32 {
415 fn function2(&self) -> &'
static str {
421 #[display(bound = "T1: Trait1 + Trait2, T2: Trait1 + Trait2")]
422 #[display(fmt = "{} {} {} {}", "_0.function1()", _0, "_1.function2()", _1)]
423 struct Struct
<T1
, T2
>(T1
, T2
);
425 let s
= Struct(10, 20);
426 assert_eq
!(s
.to_string(), "WHAT 10 EVER 20");