This library is a slightly more convenient version of derive_more.
Derive DerivingVia and list the traits you want to derive in the #[deriving] attribute.
```rust
struct Target(Base); ```
The syntax of <Derive> is defined as follows.
text
Derive := <Trait> | <Trait>(via = <Type>)
DerivingVia uses transitive type coercion for type conversion.
All newtypes must be dereferenceable to the underlying type.
Therefore, DerivingVia automatically generates a Deref trait.
Deref trait works transitive, but how we re-constructs a Self type?
Unfortunately, no convenience mechanism exists in the language,
so it is necessary to teach how to revert using the #[transitive] attribute.
```rust use std::fmt::Display;
use deriving_via::DerivingVia;
pub struct A(i32);
pub struct B(A);
pub struct C(B);
pub struct D
fn main() { let c = C(B(A(42))) + C(B(A(42))); println!("{c}");
let d = D("foo".to_owned()); println!("{d}"); } ```
```rust struct Base(Underlying);
struct Target(Base); ```
DisplayEqOrdHashserde::Serializeserde::DeserializeInto
Base: Into<Underlying>#[transitive]From
Base: From<Underlying>#[transitive]TryFrom
Base: From<Underlying>#[transitive]FromStr
Base: From<Underlying>#[transitive]Add-lile (Add, Sub)
Base: From<Underlying>#[transitive]Mul-like (Mul, Div)
Base: From<Underlying>#[transitive]Arithmetic (Add, Sub, Mul, Div)
Base: From<Underlying>#[transitive]DerivingVia using transitive case of Type Coercion. Note that this is not fully supported yet.
See: https://doc.rust-lang.org/reference/type-coercions.html#coercion-types