jbytes/encode/
mod.rs

1mod impls_bool;
2mod impls_int;
3mod impls_float;
4mod impls_char;
5mod impls_string;
6mod impls_tuple;
7mod impls_array;
8mod impls_bytes;
9mod impls_vec;
10#[cfg(feature = "std")]
11mod impls_hashmap;
12mod impls_hex;
13mod impls_other;
14mod impls_option;
15mod impls_ipaddress;
16mod impls_macaddress;
17mod impls_netaddress;
18
19// use crate::std::*;
20use crate::{
21    JResult, BufWrite,
22    ContainerAttrModifiers, FieldAttrModifiers,
23};
24
25
26/// This is bytes encoding trait. 
27/// 
28/// # Example
29/// 
30/// ```no_test
31/// use jbytes::{
32///     JResult, BufWrite,
33///     ByteDecode, BorrowByteDecode,
34///     ContainerAttrModifiers, FieldAttrModifiers,
35/// };
36/// 
37/// 
38/// impl ByteEncode for bool {
39///     fn encode_inner<B: BufWrite>(&self, buffer: &mut B, _cattr: Option<&ContainerAttrModifiers>,
40///                                                               _fattr: Option<&FieldAttrModifiers>) -> JResult<usize>
41///     {
42///         buffer.push_bool(*self)
43///     }
44/// }
45/// ```
46pub trait ByteEncode {
47    fn encode_inner<B: BufWrite>(&self, buffer: &mut B, cattr: Option<&ContainerAttrModifiers>,
48                                                              fattr: Option<&FieldAttrModifiers>) -> JResult<usize>;
49
50    #[inline]
51    fn encode<B: BufWrite>(&self, buffer: &mut B) -> JResult<usize> {
52        self.encode_inner(buffer, None, None)
53    }
54}
55
56
57/// This is bytes encoding trait of borrow type. 
58/// 
59/// # Example
60/// 
61/// ```no_test
62/// use jbytes::{
63///     JResult, BufWrite,
64///     ByteDecode, BorrowByteDecode,
65///     ContainerAttrModifiers, FieldAttrModifiers,
66/// };
67/// 
68/// 
69/// impl BorrowByteEncode for bool {
70///     fn encode_inner<B: BufWrite>(&self, buffer: &mut B, _cattr: Option<&ContainerAttrModifiers>,
71///                                                               _fattr: Option<&FieldAttrModifiers>) -> JResult<usize>
72///     {
73///         buffer.push_bool(*self)
74///     }
75/// }
76/// ```
77pub trait BorrowByteEncode {
78    fn encode_inner<B: BufWrite>(&self, buffer: &mut B, cattr: Option<&ContainerAttrModifiers>,
79                                                              fattr: Option<&FieldAttrModifiers>) -> JResult<usize>;
80
81    #[inline]
82    fn encode<B: BufWrite>(&self, buffer: &mut B) -> JResult<usize> {
83        self.encode_inner(buffer, None, None)
84    }
85}
86
87
88#[allow(clippy::if_same_then_else)]
89#[inline]
90fn push_count_and_try_count<B: BufWrite>(buffer: &mut B, cattr: Option<&ContainerAttrModifiers>, fattr: Option<&FieldAttrModifiers>, value: usize) -> JResult<usize> {
91    let mut r_nbytes = 0;
92
93    if let Some(fr) = fattr {
94        if let Some(byte_count) = fr.byte_count_outside {
95            r_nbytes += buffer.push_byteorder_uint(value as u64, byte_count, crate::get_byteorder(cattr, fattr))?;
96        }
97        else if fr.count.is_some() { }
98        else if fr.try_count.is_some() { }
99        else {
100            r_nbytes += buffer.push_u8(value as u8)?;
101        }
102    }
103    else {
104        r_nbytes += buffer.push_u8(value as u8)?;
105    }
106
107    Ok(r_nbytes)
108}