nimble_wrapped_step/
lib.rs

1/*
2 * Copyright (c) Peter Bjorklund. All rights reserved. https://github.com/nimble-rust/nimble
3 * Licensed under the MIT License. See LICENSE in the project root for license information.
4 */
5
6use flood_rs::prelude::*;
7use std::fmt::{Debug, Display};
8use std::io;
9
10#[derive(Debug)]
11pub struct GenericOctetStep {
12    pub payload: Vec<u8>,
13}
14
15impl Serialize for GenericOctetStep {
16    fn serialize(&self, stream: &mut impl WriteOctetStream) -> io::Result<()>
17    where
18        Self: Sized,
19    {
20        stream.write_u8(self.payload.len() as u8)?;
21        stream.write(self.payload.as_slice())
22    }
23}
24
25impl Deserialize for GenericOctetStep {
26    fn deserialize(stream: &mut impl ReadOctetStream) -> io::Result<Self>
27    where
28        Self: Sized,
29    {
30        let len = stream.read_u8()? as usize;
31        let mut payload = vec![0u8; len];
32        stream.read(&mut payload)?;
33        Ok(Self { payload })
34    }
35}
36
37#[derive(Debug, Clone, Eq, PartialEq)]
38pub struct WrappedOctetStep<T: Serialize + Deserialize + Clone + Debug + Display + Eq> {
39    pub step: T,
40}
41
42impl<T: Serialize + Deserialize + Clone + Debug + Display + Eq> Display for WrappedOctetStep<T> {
43    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
44        write!(f, "wrapped {}", self.step)
45    }
46}
47
48impl<T: Serialize + Deserialize + Clone + Debug + Display + Eq> Serialize for WrappedOctetStep<T> {
49    fn serialize(&self, stream: &mut impl WriteOctetStream) -> io::Result<()>
50    where
51        Self: Sized,
52    {
53        let mut out_stream = OutOctetStream::new();
54        self.step.serialize(&mut out_stream)?;
55        stream.write_u8(out_stream.octets_ref().len() as u8)?;
56        stream.write(out_stream.octets_ref())
57    }
58}
59
60impl<T: Serialize + Deserialize + Clone + Debug + Display + Eq> Deserialize
61    for WrappedOctetStep<T>
62{
63    fn deserialize(stream: &mut impl ReadOctetStream) -> io::Result<Self>
64    where
65        Self: Sized,
66    {
67        let len = stream.read_u8()? as usize;
68        let mut payload = vec![0u8; len];
69        stream.read(&mut payload)?;
70
71        let mut in_stream = InOctetStream::new(&payload);
72        Ok(Self {
73            step: Deserialize::deserialize(&mut in_stream)?,
74        })
75    }
76}