The Exchange trait
This library provides ExchangeFrom
/ExchangeInto
traits which is similar to
std From
/Into
but with extra phantom generic type.
#![allow(unused)] fn main() { pub trait ExchangeFrom<Src, Index> { fn exchange_from( src: Src ) -> Self; } pub trait ExchangeInto<Dest, Index> { fn exchange_into( self ) -> Dest; } }
Blanket implementations of ExchangeInto
are similar to Into
:
#![allow(unused)] fn main() { impl<Src, Dest, Index> ExchangeInto<Dest, Index> for Src where Dest: ExchangeFrom<Src, Index>, { fn exchange_into( self ) -> Dest { Dest::exchange_from( self ) } } }
Any enum in the form described below can derive these traits automatically, by
using #[derive( Exchange )]
.
#![allow(unused)] fn main() { use enumx::export::*; #[derive( Exchange )] enum Data { Bin( Vec<u8> ), Text( String ), } #[derive( Exchange )] enum Value { Bin( Vec<u8> ), Text( String ), Literial( &'static str ), } // use ExchangeFrom let data = Data::exchange_from( "foo".to_owned() ); let value = Value::exchange_from( data ); // use ExchangeInto let data: Data = "foo".to_owned().exchange_into(); let value: Value = data.exchange_into(); }
This library provides predefined enums that have implement
ExchangeFrom
/ExchangeInto
. The user can use enumx::predefined::*;
, and use
Enum!()
macro to denote types, as described in
Ad-hoc enum types.
Alternatively, the user is able to define their own ad-hoc enum types:
#![allow(unused)] fn main() { use enumx::export::*; // do not use enumx::predefined::*; def_impls! { #[derive( Exchange )] pub enum Enum![ 1..=16 ]; } }