[−][src]Crate educe
Educe
This crate provides procedural macros to help you implement Rust-build-in traits quickly.
Debug
Use #[derive(Educe)] and #[educe(Debug)] to implement the Debug trait for a struct, an enum, or a union. It supports to change the name of your types, variants and fields. You can also ignore some fields, or set a trait and/or a method to replace the Debug trait used as default. Also, you can even format a struct to a tuple, and vice versa.
Basic Usage
#[macro_use] extern crate educe; #[derive(Educe)] #[educe(Debug)] struct Struct { f1: u8 } #[derive(Educe)] #[educe(Debug)] enum Enum { V1, V2 { f1: u8, }, V3(u8), }
Union
A union will be formatted to a u8 slice, because we don't know it's field at runtime.
#[macro_use] extern crate educe; #[derive(Educe)] #[educe(Debug)] struct Union { f1: u8, f2: i32, }
Change the Name of a Type, a Variant or a Field
The name attribute can help you rename a type, a variant or a field.
#[macro_use] extern crate educe; #[derive(Educe)] #[educe(Debug(name = "Struct2"))] struct Struct { #[educe(Debug(name = "f"))] f1: u8 } #[derive(Educe)] #[educe(Debug(name = true))] enum Enum { #[educe(Debug(name = false))] V1, #[educe(Debug(name = "V"))] V2 { #[educe(Debug(name = "f"))] f1: u8, }, #[educe(Debug(name = false))] V3(u8), }
Ignore Fields
The ignore attribute can ignore specific fields.
#[macro_use] extern crate educe; #[derive(Educe)] #[educe(Debug)] struct Struct { #[educe(Debug(ignore))] f1: u8 } #[derive(Educe)] #[educe(Debug)] enum Enum { V1, V2 { #[educe(Debug(ignore))] f1: u8, }, V3( #[educe(Debug(ignore))] u8 ), }
Fake Structs and Tuples
With the named_field attribute, structs can be formatted as tuples and tuples can be formatted as structs.
#[macro_use] extern crate educe; #[derive(Educe)] #[educe(Debug(named_field = false))] struct Struct { f1: u8 } #[derive(Educe)] #[educe(Debug)] enum Enum { V1, #[educe(Debug(named_field = false))] V2 { f1: u8, }, #[educe(Debug(named_field = true))] V3( u8, #[educe(Debug(name = "value"))] i32 ), }
Use Another Method or Trait to Do the Format Thing
The format attribute has two parameters: trait and method. They can be used to replace the Debug trait on fields. If you only set the trait parameter, the method will be set to fmt automatically as default.
#[macro_use] extern crate educe; use std::fmt::{self, Formatter}; fn fmt(_s: &u8, f: &mut Formatter) -> fmt::Result { f.write_str("Hi") } trait A { fn fmt(&self, f: &mut Formatter) -> fmt::Result { f.write_str("Hi") } } impl A for i32 {}; impl A for u64 {}; #[derive(Educe)] #[educe(Debug)] enum Enum<T: A> { V1, V2 { #[educe(Debug(format(method = "fmt")))] f1: u8, }, V3( u8, #[educe(Debug(format(trait = "A")))] T ), }
Generaic Parameters Bound to the Debug trait or others
The #[educe(Debug(bound))] attribute can be used to add the Debug trait bound to all generaic parameters for the Debug implementation.
#[macro_use] extern crate educe; #[derive(Educe)] #[educe(Debug(bound))] enum Enum<T, K> { V1, V2 { f1: K, }, V3( T ), }
Or you can set the where predicates by yourself.
#[macro_use] extern crate educe; use std::fmt::{self, Formatter}; fn fmt(_s: &u8, f: &mut Formatter) -> fmt::Result { f.write_str("Hi") } trait A { fn fmt(&self, f: &mut Formatter) -> fmt::Result { f.write_str("Hi") } } impl A for i32 {}; impl A for u64 {}; #[derive(Educe)] #[educe(Debug(bound = "T: std::fmt::Debug, K: A"))] enum Enum<T, K> { V1, V2 { #[educe(Debug(format(trait = "A")))] f1: K, }, V3( T ), }
TODO
There is a lot of work to be done. Unimplemented traits are listed below:
DefaultCloneCopyHashPartialEqEqPartialOrdOrdFromIntoFromStrTryFromDerefDerefMut
Derive Macros
| Educe |