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); ```
Display
Eq
Ord
Hash
serde::Serialize
serde::Deserialize
Into
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