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
19use crate::{
21 JResult, BufWrite,
22 ContainerAttrModifiers, FieldAttrModifiers,
23};
24
25
26pub 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
57pub 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}