deriving_via
This library is a slightly more convenient version of derive_more for newtype pattern.
=> Deriving via
Basic Usage
#[derive(DerivingVia)] and then write the #[deriving] attribute on struct and list the trait you want to derive in it.
simple
Derives From<i32> for D and Display for D.
;
with generics
;
with newtype pattern
If you have more than one field, specify #[underlying] for one.
Note that the other fields require default initialisation by the Default trait.
;
Syntax
Derive DerivingVia and list the traits you want to derive in the #[deriving] attribute.
;
The syntax of <Derive> is defined as follows.
Derive := <Trait> | <Trait>(via: <Type>)
Deriving Via
Using the deriving via feature, it is possible to generate derives from the impl of a base of a multi-layered wrapped 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.
Example
use DerivingVia;
;
;
;
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.
Some trait require #[transitive] attribute (see Available Derives section).
Example
use Display;
use DerivingVia;
;
;
;
Available Derives
;
;
- fmt
Display- requires:
Base: Displayor(via = <Type>) and Type: Display
- requires:
- ops
Eq- requires:
Base: Eqor(via = <Type>) and Type: Eq
- requires:
Ord- requires:
Base: Ordor(via = <Type>) and Type: Ord
- requires:
Add-lile (Add, Sub)- requires:
Base: From<Underlying> - limitations: one hop or
#[transitive]
- requires:
Mul-like (Mul, Div)- requires:
Base: From<Underlying> - limitations: one hop or
#[transitive]
- requires:
Arithmetic(Add, Sub, Mul, Div)- requires:
Base: From<Underlying> - limitations: one hop or
#[transitive]
- requires:
Index- requires:
Base: Indexor(via = <Type>) and Type: Index
- requires:
IndexMut- requires:
Base: IndexMutor(via = <Type>) and Type: IndexMut
- requires:
DerefMut- requires:
Base: DerefMutor(via = <Type>) and Type: DerefMut
- requires:
- hash
Hash- requires:
Base: Hashor(via = <Type>) and Type: Hash
- requires:
- serde
Serialize- requires:
Base: Serializeor(via = <Type>) and Type: Serialize
- requires:
Deserialize- requires:
Base: Deserializeor(via = <Type>) and Type: Deserialize
- requires:
- convert
AsRefAsMutFromIterator- requires:
(via: <ItemType>)
- requires:
IntoIterator- requires:
Base: IntoIteratoror(via: <Type>), Type: IntoIterator
- requires:
Into- requires:
Base: Into<Underlying> - limitations: one hop or
#[transitive]
- requires:
From- limitations: one hop or
#[transitive]
- limitations: one hop or
TryFrom- requires:
Base: From<Underlying> - limitations: one hop or
#[transitive]
- requires:
FromStr- requires:
Base: From<Underlying> - limitations: one hop or
#[transitive]
- requires:
- impls
- Iter
- requires:
Base: IntoIterator and Base dereferenceable to sliceor(via: <Type>), Type: IntoIterator and Type dereferenceable to slice
- requires:
- Iter
Caveat
DerivingVia using transitive case of Type Coercion. According to rumours, transitive Type Coercion is not fully supported yet.
See: https://doc.rust-lang.org/reference/type-coercions.html#coercion-types