Skip to main content

FromInto

Struct FromInto 

Source
pub struct FromInto<Wire, Target>(/* private fields */);
Expand description

Serialize a Target by going through an intermediate wire representation using the standard library From/Into conversions.

Wire is a schema (any SchemaWrite/SchemaRead implementor), and the intermediate value is the type that schema serializes — its SchemaWrite::Src on write and SchemaRead::Dst on read. On write the Target is converted into that value (via From<&Target>) and serialized with Wire; on read the value is deserialized with Wire and converted back into the Target (via Target: From<…>).

Because Wire is a schema rather than the value itself, the wire side may be:

The Target is the type of the annotated field. Use the _ inference token to have it filled in automatically from the field type:

// Our in-memory type with a layout we don't want to serialize directly.
#[derive(Debug, PartialEq, Clone, Copy)]
struct Celsius(f64);

// The on-the-wire representation: hundredths of a degree as an integer.
impl From<&Celsius> for i64 {
    fn from(c: &Celsius) -> i64 {
        (c.0 * 100.0) as i64
    }
}
impl From<i64> for Celsius {
    fn from(raw: i64) -> Celsius {
        Celsius(raw as f64 / 100.0)
    }
}

#[derive(SchemaWrite, SchemaRead, Debug, PartialEq)]
struct Reading {
    #[wincode(with = "FromInto<i64, _>")]
    temp: Celsius,
}

let reading = Reading { temp: Celsius(21.5) };
let bytes = wincode::serialize(&reading).unwrap();
assert_eq!(reading, wincode::deserialize(&bytes).unwrap());

Trait Implementations§

Source§

impl<'de, C, Wire, Target> SchemaRead<'de, C> for FromInto<Wire, Target>
where C: ConfigCore, Wire: SchemaRead<'de, C>, Target: From<Wire::Dst>,

Source§

const TYPE_META: TypeMeta

Metadata about the type’s serialization. Read more
Source§

type Dst = Target

Source§

fn read( reader: impl Reader<'de>, dst: &mut MaybeUninit<Self::Dst>, ) -> ReadResult<()>

Read into dst from reader. Read more
Source§

fn get(reader: impl Reader<'de>) -> ReadResult<Self::Dst>

Read Self::Dst from reader into a new Self::Dst.
Source§

impl<C, Wire, Target> SchemaWrite<C> for FromInto<Wire, Target>
where C: ConfigCore, Wire: SchemaWrite<C>, Wire::Src: Sized + for<'a> From<&'a Target>,

Source§

const TYPE_META: TypeMeta

Metadata about the type’s serialization. Read more
Source§

type Src = Target

Source§

fn size_of(src: &Self::Src) -> WriteResult<usize>

Get the serialized size of Self::Src. Read more
Source§

fn write(writer: impl Writer, src: &Self::Src) -> WriteResult<()>

Write Self::Src to writer.

Auto Trait Implementations§

§

impl<Wire, Target> Freeze for FromInto<Wire, Target>
where PhantomData<Wire>: Freeze, PhantomData<Target>: Freeze,

§

impl<Wire, Target> RefUnwindSafe for FromInto<Wire, Target>

§

impl<Wire, Target> Send for FromInto<Wire, Target>
where PhantomData<Wire>: Send, PhantomData<Target>: Send,

§

impl<Wire, Target> Sync for FromInto<Wire, Target>
where PhantomData<Wire>: Sync, PhantomData<Target>: Sync,

§

impl<Wire, Target> Unpin for FromInto<Wire, Target>
where PhantomData<Wire>: Unpin, PhantomData<Target>: Unpin,

§

impl<Wire, Target> UnsafeUnpin for FromInto<Wire, Target>

§

impl<Wire, Target> UnwindSafe for FromInto<Wire, Target>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<'de, T, C> Deserialize<'de, C> for T
where C: Config, T: SchemaRead<'de, C>,

Source§

fn deserialize(src: &'de [u8], config: C) -> ReadResult<Self::Dst>

Deserialize the input bytes into a new Self::Dst.
Source§

fn deserialize_into( src: &'de [u8], dst: &mut MaybeUninit<Self::Dst>, config: C, ) -> ReadResult<()>

Deserialize the input bytes into dst.
Source§

impl<'de, T> Deserialize<'de> for T
where T: SchemaRead<'de, Configuration>,

Source§

fn deserialize(src: &'de [u8]) -> ReadResult<Self::Dst>

Deserialize the input src bytes into a new Self::Dst.
Source§

fn deserialize_into( src: &'de [u8], dst: &mut MaybeUninit<Self::Dst>, ) -> ReadResult<()>

Deserialize the input src bytes into dst.
Source§

impl<T> DeserializeOwned for T

Source§

fn deserialize_from<'de>( src: impl Reader<'de>, ) -> ReadResult<<Self as SchemaRead<'de, DefaultConfig>>::Dst>

Deserialize from the given Reader into a new Self::Dst.
Source§

fn deserialize_from_into<'de>( src: impl Reader<'de>, dst: &mut MaybeUninit<<Self as SchemaRead<'de, DefaultConfig>>::Dst>, ) -> ReadResult<()>

Deserialize from the given Reader into dst.
Source§

impl<T, C> DeserializeOwned<C> for T
where C: Config, T: SchemaReadOwned<C>,

Source§

fn deserialize_from<'de>( src: impl Reader<'de>, ) -> ReadResult<<Self as SchemaRead<'de, C>>::Dst>

Deserialize from the given Reader into a new Self::Dst.
Source§

fn deserialize_from_into<'de>( src: impl Reader<'de>, dst: &mut MaybeUninit<<Self as SchemaRead<'de, C>>::Dst>, ) -> ReadResult<()>

Deserialize from the given Reader into dst.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, C> SchemaReadOwned<C> for T
where C: ConfigCore, T: for<'de> SchemaRead<'de, C>,

Source§

impl<T> Serialize for T

Source§

fn serialize(src: &Self::Src) -> WriteResult<Vec<u8>>

Serialize a serializable type into a Vec of bytes.
Source§

fn serialize_into(dst: impl Writer, src: &Self::Src) -> WriteResult<()>

Serialize a serializable type into the given byte buffer. Read more
Source§

fn serialized_size(src: &Self::Src) -> WriteResult<u64>

Get the size in bytes of the type when serialized.
Source§

impl<T, C> Serialize<C> for T
where C: Config, T: SchemaWrite<C> + ?Sized,

Source§

fn serialize(src: &Self::Src, config: C) -> WriteResult<Vec<u8>>

Serialize a serializable type into a Vec of bytes.
Source§

fn serialize_into( dst: impl Writer, src: &Self::Src, config: C, ) -> WriteResult<()>

Serialize a serializable type into the given Writer. Read more
Source§

fn serialized_size(src: &Self::Src, config: C) -> WriteResult<u64>

Get the size in bytes of the type when serialized.
Source§

impl<T, Target, C> TagEncoding<C> for T
where C: ConfigCore, T: for<'de> SchemaRead<'de, C, Dst = Target> + SchemaWrite<C, Src = Target> + 'static, Target: TryFrom<u32>, u32: TryFrom<Target>,

Source§

type Target = Target

Source§

fn try_from_u32( value: u32, ) -> Result<<T as TagEncoding<C>>::Target, TagEncodingOverflow>

Convert a u32 to the encoding target.
Source§

fn try_into_u32( x: <T as TagEncoding<C>>::Target, ) -> Result<u32, TagEncodingOverflow>

Convert the encoding target to a u32.
Source§

fn size_of_from_u32(value: u32) -> WriteResult<usize>

Get the size of the encoding target from the given u32. Read more
Source§

fn write_from_u32(writer: impl Writer, value: u32) -> WriteResult<()>

Write the encoding target from the given u32 to the given Writer. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.