Macro sp_runtime::morph_types
source · macro_rules! morph_types {
(
@DECL $( #[doc = $doc:expr] )* $vq:vis $name:ident ()
) => { ... };
(
@DECL $( #[doc = $doc:expr] )* $vq:vis $name:ident ( $( $bound_id:ident ),+ )
) => { ... };
(
@IMPL $name:ty : ( $( $bounds:tt )* ) ( $( $where:tt )* )
= |$var:ident: $var_type:ty| -> $outcome:ty { $( $ex:expr )* }
) => { ... };
(
@IMPL_TRY $name:ty : ( $( $bounds:tt )* ) ( $( $where:tt )* )
= |$var:ident: $var_type:ty| -> $outcome:ty { $( $ex:expr )* }
) => { ... };
(
@IMPL $name:ty : () ( $( $where:tt )* )
= |$var:ident: $var_type:ty| -> $outcome:ty { $( $ex:expr )* }
) => { ... };
(
@IMPL_TRY $name:ty : () ( $( $where:tt )* )
= |$var:ident: $var_type:ty| -> $outcome:ty { $( $ex:expr )* }
) => { ... };
(
@IMPL_BOTH $name:ty : ( $( $bounds:tt )* ) ( $( $where:tt )* )
= |$var:ident: $var_type:ty| -> $outcome:ty { $( $ex:expr )* }
) => { ... };
(
$( #[doc = $doc:expr] )* $vq:vis type $name:ident
$( < $( $bound_id:ident $( : $bound_head:path $( | $bound_tail:path )* )? ),+ > )?
$(: $type:tt)?
= |_| -> $outcome:ty { $( $ex:expr )* };
$( $rest:tt )*
) => { ... };
(
$( #[doc = $doc:expr] )* $vq:vis type $name:ident
$( < $( $bound_id:ident $( : $bound_head:path $( | $bound_tail:path )* )? ),+ > )?
$( EXTRA_GENERIC ($extra:ident) )?
= |$var:ident: $var_type:ty| -> $outcome:ty { $( $ex:expr )* }
$( where $( $where_path:ty : $where_bound_head:path $( | $where_bound_tail:path )* ),* )?;
$( $rest:tt )*
) => { ... };
(
$( #[doc = $doc:expr] )* $vq:vis type $name:ident
$( < $( $bound_id:ident $( : $bound_head:path $( | $bound_tail:path )* )? ),+ > )?
$( EXTRA_GENERIC ($extra:ident) )?
: Morph
= |$var:ident: $var_type:ty| -> $outcome:ty { $( $ex:expr )* }
$( where $( $where_path:ty : $where_bound_head:path $( | $where_bound_tail:path )* ),* )?;
$( $rest:tt )*
) => { ... };
(
$( #[doc = $doc:expr] )* $vq:vis type $name:ident
$( < $( $bound_id:ident $( : $bound_head:path $( | $bound_tail:path )* )? ),+ > )?
$( EXTRA_GENERIC ($extra:ident) )?
: TryMorph
= |$var:ident: $var_type:ty| -> Result<$outcome:ty, ()> { $( $ex:expr )* }
$( where $( $where_path:ty : $where_bound_head:path $( | $where_bound_tail:path )* ),* )?;
$( $rest:tt )*
) => { ... };
() => { ... };
}
Expand description
Create a Morph
and/or TryMorph
impls with a simple closure-like expression.
Examples
morph_types! {
/// Replace by some other value; produce both `Morph` and `TryMorph` implementations
pub type Replace<V: TypedGet> = |_| -> V::Type { V::get() };
/// A private `Morph` implementation to reduce a `u32` by 10.
type ReduceU32ByTen: Morph = |r: u32| -> u32 { r - 10 };
/// A `TryMorph` implementation to reduce a scalar by a particular amount, checking for
/// underflow.
pub type CheckedReduceBy<N: TypedGet>: TryMorph = |r: N::Type| -> Result<N::Type, ()> {
r.checked_sub(&N::get()).ok_or(())
} where N::Type: CheckedSub;
}
trait Config {
type TestMorph1: Morph<u32>;
type TestTryMorph1: TryMorph<u32>;
type TestMorph2: Morph<u32>;
type TestTryMorph2: TryMorph<u32>;
}
struct Runtime;
impl Config for Runtime {
type TestMorph1 = Replace<ConstU32<42>>;
type TestTryMorph1 = Replace<ConstU32<42>>;
type TestMorph2 = ReduceU32ByTen;
type TestTryMorph2 = CheckedReduceBy<ConstU32<10>>;
}