Skip to main content

wincode/schema/
context.rs

1//! [`SchemaRead`](crate::SchemaRead) context newtypes.
2
3/// Length context.
4///
5/// Used for providing an already read or in-memory length value
6/// to a type that would otherwise read it from a [`Reader`](crate::io::Reader).
7///
8/// # Examples
9///
10/// ```
11/// # use wincode::{
12/// #     SchemaRead, SchemaReadContext, SchemaWrite, Deserialize,
13/// #     config::Config, context,
14/// #     io::{Writer, Reader}, WriteResult, ReadResult,
15/// # };
16/// # use core::mem::MaybeUninit;
17/// # #[derive(Debug, PartialEq)]
18/// struct Header {
19///     data_len: u8,
20/// }
21///
22/// # #[derive(Debug, PartialEq)]
23/// struct Data {
24///     header: Header,
25///     data: Vec<u8>,
26/// }
27///
28/// unsafe impl<C: Config> SchemaWrite<C> for Data {
29///     type Src = Self;
30///
31///     fn size_of(src: &Self::Src) -> WriteResult<usize> {
32///         Ok(1 + src.data.len())
33///     }
34///
35///     fn write(mut writer: impl Writer, src: &Self::Src) -> WriteResult<()> {
36///         writer.write(&[src.header.data_len])?;
37///         writer.write(&src.data)?;
38///         Ok(())
39///     }
40/// }
41///
42/// unsafe impl<'de, C: Config> SchemaRead<'de, C> for Data {
43///     type Dst = Self;
44///
45///     fn read(
46///         mut reader: impl Reader<'de>,
47///         dst: &mut MaybeUninit<Self::Dst>,
48///     ) -> ReadResult<()> {
49///         let len = reader.take_byte()?;
50///
51///         let data = <Vec<u8> as SchemaReadContext<C, _>>::get_with_context(
52///             context::Len(len as usize),
53///             reader
54///         )?;
55///
56///         dst.write(Self {
57///             header: Header { data_len: len },
58///             data,
59///         });
60///
61///         Ok(())
62///     }
63/// }
64///
65/// let data = Data {
66///     header: Header { data_len: 8},
67///     data: vec![0u8; 8],
68/// };
69/// let bytes = wincode::serialize(&data).unwrap();
70/// let deserialized = wincode::deserialize(&bytes).unwrap();
71/// assert_eq!(data, deserialized);
72/// ```
73#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
74pub struct Len(pub usize);