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);