rseip_core/codec/
encode.rs

1// rseip
2//
3// rseip - Ethernet/IP (CIP) in pure Rust.
4// Copyright: 2021, Joylei <leingliu@gmail.com>
5// License: MIT
6
7mod impls;
8mod slice;
9
10use crate::Error;
11use bytes::BytesMut;
12pub use slice::SliceContainer;
13
14pub trait Encoder {
15    type Error: Error;
16
17    fn encode_bool(&mut self, item: bool, buf: &mut BytesMut) -> Result<(), Self::Error>;
18    fn encode_i8(&mut self, item: i8, buf: &mut BytesMut) -> Result<(), Self::Error>;
19    fn encode_u8(&mut self, item: u8, buf: &mut BytesMut) -> Result<(), Self::Error>;
20    fn encode_i16(&mut self, item: i16, buf: &mut BytesMut) -> Result<(), Self::Error>;
21    fn encode_u16(&mut self, item: u16, buf: &mut BytesMut) -> Result<(), Self::Error>;
22    fn encode_i32(&mut self, item: i32, buf: &mut BytesMut) -> Result<(), Self::Error>;
23    fn encode_u32(&mut self, item: u32, buf: &mut BytesMut) -> Result<(), Self::Error>;
24    fn encode_i64(&mut self, item: i64, buf: &mut BytesMut) -> Result<(), Self::Error>;
25    fn encode_u64(&mut self, item: u64, buf: &mut BytesMut) -> Result<(), Self::Error>;
26    fn encode_f32(&mut self, item: f32, buf: &mut BytesMut) -> Result<(), Self::Error>;
27    fn encode_f64(&mut self, item: f64, buf: &mut BytesMut) -> Result<(), Self::Error>;
28    fn encode_i128(&mut self, item: i128, buf: &mut BytesMut) -> Result<(), Self::Error>;
29    fn encode_u128(&mut self, item: u128, buf: &mut BytesMut) -> Result<(), Self::Error>;
30
31    #[inline]
32    fn encode<T>(&mut self, item: T, buf: &mut BytesMut) -> Result<(), Self::Error>
33    where
34        T: Encode + Sized,
35        Self: Sized,
36    {
37        item.encode(buf, self)
38    }
39
40    #[inline]
41    fn encode_by_ref<T>(&mut self, item: &T, buf: &mut BytesMut) -> Result<(), Self::Error>
42    where
43        T: Encode + ?Sized,
44        Self: Sized,
45    {
46        item.encode_by_ref(buf, self)
47    }
48}
49
50pub trait Encode {
51    /// encode by moved values
52    #[inline]
53    fn encode<A: Encoder>(self, buf: &mut BytesMut, encoder: &mut A) -> Result<(), A::Error>
54    where
55        Self: Sized,
56    {
57        self.encode_by_ref(buf, encoder)
58    }
59
60    /// encode by references
61    fn encode_by_ref<A: Encoder>(
62        &self,
63        buf: &mut BytesMut,
64        encoder: &mut A,
65    ) -> Result<(), A::Error>;
66
67    /// be careful to calculate the number of bytes
68    fn bytes_count(&self) -> usize;
69}