Skip to main content

Discard

Struct Discard 

Source
pub struct Discard<Inner>(/* private fields */);
Expand description

Reads a value with the Inner schema purely to advance the reader, then throws it away and yields Default::default() instead.

Inner is a schema, its bytes are consumed exactly as Inner would consume them — including any validation Inner performs — so the surrounding stream stays in sync, but the decoded value is dropped and the field is filled with the Default of Inner’s SchemaRead::Dst.

It is meant for fields you don’t want to persist, such as a deprecated field kept only for wire compatibility. On read the encoded value is stepped over and reset to its Default; on write the value held in the instance is likewise ignored and Inner’s Default is serialized in its place. The two directions agree, so Discard works on types deriving both SchemaWrite and SchemaRead — with the caveat that the original value is not preserved across a round-trip: a discarded field always reads back, and re-serializes, as the default.

For a length-prefixed sequence, prefer DiscardSeq, which steps over every element without allocating a backing buffer.

#[derive(SchemaWrite, SchemaRead, Debug, PartialEq)]
struct Full {
    ignored: u32,
    kept: u16,
}

#[derive(SchemaWrite, SchemaRead, Debug, PartialEq)]
struct Partial {
    #[wincode(with = "Discard<u32>")]
    ignored: u32,
    kept: u16,
}

// On read, `ignored` is stepped over and reset to its default.
let bytes = wincode::serialize(&Full { ignored: 7, kept: 9 }).unwrap();
assert_eq!(
    wincode::deserialize::<Partial>(&bytes).unwrap(),
    Partial { ignored: 0, kept: 9 },
);

// On write, the held value of `ignored` is discarded and its default is
// serialized, so the output matches a `Full` whose `ignored` is `0`.
let out = wincode::serialize(&Partial { ignored: 7, kept: 9 }).unwrap();
assert_eq!(out, wincode::serialize(&Full { ignored: 0, kept: 9 }).unwrap());

Trait Implementations§

Source§

impl<'de, C, Inner> SchemaRead<'de, C> for Discard<Inner>
where C: ConfigCore, Inner: SchemaRead<'de, C>, Inner::Dst: Default,

Source§

const TYPE_META: TypeMeta

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

type Dst = <Inner as SchemaRead<'de, C>>::Dst

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, Inner> SchemaWrite<C> for Discard<Inner>
where C: ConfigCore, Inner: SchemaWrite<C>, Inner::Src: Default,

Source§

const TYPE_META: TypeMeta

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

type Src = <Inner as SchemaWrite<C>>::Src

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<Inner> Freeze for Discard<Inner>
where PhantomData<Inner>: Freeze,

§

impl<Inner> RefUnwindSafe for Discard<Inner>
where PhantomData<Inner>: RefUnwindSafe,

§

impl<Inner> Send for Discard<Inner>
where PhantomData<Inner>: Send,

§

impl<Inner> Sync for Discard<Inner>
where PhantomData<Inner>: Sync,

§

impl<Inner> Unpin for Discard<Inner>
where PhantomData<Inner>: Unpin,

§

impl<Inner> UnsafeUnpin for Discard<Inner>
where PhantomData<Inner>: UnsafeUnpin,

§

impl<Inner> UnwindSafe for Discard<Inner>
where PhantomData<Inner>: UnwindSafe,

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.