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>
impl<'de, C, Inner> SchemaRead<'de, C> for Discard<Inner>
type Dst = <Inner as SchemaRead<'de, C>>::Dst
Source§fn read(
reader: impl Reader<'de>,
dst: &mut MaybeUninit<Self::Dst>,
) -> ReadResult<()>
fn read( reader: impl Reader<'de>, dst: &mut MaybeUninit<Self::Dst>, ) -> ReadResult<()>
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> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<'de, T, C> Deserialize<'de, C> for Twhere
C: Config,
T: SchemaRead<'de, C>,
impl<'de, T, C> Deserialize<'de, C> for Twhere
C: Config,
T: SchemaRead<'de, C>,
Source§fn deserialize(src: &'de [u8], config: C) -> ReadResult<Self::Dst>
fn deserialize(src: &'de [u8], config: C) -> ReadResult<Self::Dst>
Self::Dst.Source§fn deserialize_into(
src: &'de [u8],
dst: &mut MaybeUninit<Self::Dst>,
config: C,
) -> ReadResult<()>
fn deserialize_into( src: &'de [u8], dst: &mut MaybeUninit<Self::Dst>, config: C, ) -> ReadResult<()>
dst.Source§impl<'de, T> Deserialize<'de> for Twhere
T: SchemaRead<'de, Configuration>,
impl<'de, T> Deserialize<'de> for Twhere
T: SchemaRead<'de, Configuration>,
Source§fn deserialize(src: &'de [u8]) -> ReadResult<Self::Dst>
fn deserialize(src: &'de [u8]) -> ReadResult<Self::Dst>
src bytes into a new Self::Dst.Source§fn deserialize_into(
src: &'de [u8],
dst: &mut MaybeUninit<Self::Dst>,
) -> ReadResult<()>
fn deserialize_into( src: &'de [u8], dst: &mut MaybeUninit<Self::Dst>, ) -> ReadResult<()>
src bytes into dst.Source§impl<T> DeserializeOwned for Twhere
T: SchemaReadOwned<Configuration>,
impl<T> DeserializeOwned for Twhere
T: SchemaReadOwned<Configuration>,
Source§fn deserialize_from<'de>(
src: impl Reader<'de>,
) -> ReadResult<<Self as SchemaRead<'de, DefaultConfig>>::Dst>
fn deserialize_from<'de>( src: impl Reader<'de>, ) -> ReadResult<<Self as SchemaRead<'de, DefaultConfig>>::Dst>
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<()>
fn deserialize_from_into<'de>( src: impl Reader<'de>, dst: &mut MaybeUninit<<Self as SchemaRead<'de, DefaultConfig>>::Dst>, ) -> ReadResult<()>
Reader into dst.Source§impl<T, C> DeserializeOwned<C> for Twhere
C: Config,
T: SchemaReadOwned<C>,
impl<T, C> DeserializeOwned<C> for Twhere
C: Config,
T: SchemaReadOwned<C>,
Source§fn deserialize_from<'de>(
src: impl Reader<'de>,
) -> ReadResult<<Self as SchemaRead<'de, C>>::Dst>
fn deserialize_from<'de>( src: impl Reader<'de>, ) -> ReadResult<<Self as SchemaRead<'de, C>>::Dst>
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<()>
fn deserialize_from_into<'de>( src: impl Reader<'de>, dst: &mut MaybeUninit<<Self as SchemaRead<'de, C>>::Dst>, ) -> ReadResult<()>
Reader into dst.impl<T, C> SchemaReadOwned<C> for Twhere
C: ConfigCore,
T: for<'de> SchemaRead<'de, C>,
Source§impl<T> Serialize for T
impl<T> Serialize for T
Source§fn serialize(src: &Self::Src) -> WriteResult<Vec<u8>>
fn serialize(src: &Self::Src) -> WriteResult<Vec<u8>>
Vec of bytes.Source§fn serialize_into(dst: impl Writer, src: &Self::Src) -> WriteResult<()>
fn serialize_into(dst: impl Writer, src: &Self::Src) -> WriteResult<()>
Source§fn serialized_size(src: &Self::Src) -> WriteResult<u64>
fn serialized_size(src: &Self::Src) -> WriteResult<u64>
Source§impl<T, C> Serialize<C> for T
impl<T, C> Serialize<C> for T
Source§fn serialize(src: &Self::Src, config: C) -> WriteResult<Vec<u8>>
fn serialize(src: &Self::Src, config: C) -> WriteResult<Vec<u8>>
Vec of bytes.Source§fn serialize_into(
dst: impl Writer,
src: &Self::Src,
config: C,
) -> WriteResult<()>
fn serialize_into( dst: impl Writer, src: &Self::Src, config: C, ) -> WriteResult<()>
Source§fn serialized_size(src: &Self::Src, config: C) -> WriteResult<u64>
fn serialized_size(src: &Self::Src, config: C) -> WriteResult<u64>
Source§impl<T, Target, C> TagEncoding<C> for Twhere
C: ConfigCore,
T: for<'de> SchemaRead<'de, C, Dst = Target> + SchemaWrite<C, Src = Target> + 'static,
Target: TryFrom<u32>,
u32: TryFrom<Target>,
impl<T, Target, C> TagEncoding<C> for Twhere
C: ConfigCore,
T: for<'de> SchemaRead<'de, C, Dst = Target> + SchemaWrite<C, Src = Target> + 'static,
Target: TryFrom<u32>,
u32: TryFrom<Target>,
type Target = Target
Source§fn try_from_u32(
value: u32,
) -> Result<<T as TagEncoding<C>>::Target, TagEncodingOverflow>
fn try_from_u32( value: u32, ) -> Result<<T as TagEncoding<C>>::Target, TagEncodingOverflow>
u32 to the encoding target.Source§fn try_into_u32(
x: <T as TagEncoding<C>>::Target,
) -> Result<u32, TagEncodingOverflow>
fn try_into_u32( x: <T as TagEncoding<C>>::Target, ) -> Result<u32, TagEncodingOverflow>
u32.Source§fn size_of_from_u32(value: u32) -> WriteResult<usize>
fn size_of_from_u32(value: u32) -> WriteResult<usize>
u32. Read more