nautilus_binance/common/sbe/spot/
var_string_codec.rs

1pub use decoder::VarStringDecoder;
2pub use encoder::VarStringEncoder;
3
4use super::*;
5
6pub mod encoder {
7    use super::*;
8
9    #[derive(Debug, Default)]
10    pub struct VarStringEncoder<P> {
11        parent: Option<P>,
12        offset: usize,
13    }
14
15    impl<'a, P> Writer<'a> for VarStringEncoder<P>
16    where
17        P: Writer<'a> + Default,
18    {
19        #[inline]
20        fn get_buf_mut(&mut self) -> &mut WriteBuf<'a> {
21            if let Some(parent) = self.parent.as_mut() {
22                parent.get_buf_mut()
23            } else {
24                panic!("parent was None")
25            }
26        }
27    }
28
29    impl<'a, P> VarStringEncoder<P>
30    where
31        P: Writer<'a> + Default,
32    {
33        pub fn wrap(mut self, parent: P, offset: usize) -> Self {
34            self.parent = Some(parent);
35            self.offset = offset;
36            self
37        }
38
39        #[inline]
40        pub fn parent(&mut self) -> SbeResult<P> {
41            self.parent.take().ok_or(SbeErr::ParentNotSet)
42        }
43
44        /// primitive field 'length'
45        /// - min value: 0
46        /// - max value: 65534
47        /// - null value: 0xffff_u16
48        /// - characterEncoding: null
49        /// - semanticType: null
50        /// - encodedOffset: 0
51        /// - encodedLength: 2
52        /// - version: 0
53        #[inline]
54        pub fn length(&mut self, value: u16) {
55            let offset = self.offset;
56            self.get_buf_mut().put_u16_at(offset, value);
57        }
58
59        /// primitive field 'varData'
60        /// - min value: 0
61        /// - max value: 254
62        /// - null value: 0xff_u8
63        /// - characterEncoding: UTF-8
64        /// - semanticType: null
65        /// - encodedOffset: 2
66        /// - encodedLength: -1
67        /// - version: 0
68        #[inline]
69        pub fn var_data(&mut self, value: u8) {
70            let offset = self.offset + 2;
71            self.get_buf_mut().put_u8_at(offset, value);
72        }
73    }
74} // end encoder mod
75
76pub mod decoder {
77    use super::*;
78
79    #[derive(Debug, Default)]
80    pub struct VarStringDecoder<P> {
81        parent: Option<P>,
82        offset: usize,
83    }
84
85    impl<'a, P> ActingVersion for VarStringDecoder<P>
86    where
87        P: Reader<'a> + ActingVersion + Default,
88    {
89        #[inline]
90        fn acting_version(&self) -> u16 {
91            self.parent.as_ref().unwrap().acting_version()
92        }
93    }
94
95    impl<'a, P> Reader<'a> for VarStringDecoder<P>
96    where
97        P: Reader<'a> + Default,
98    {
99        #[inline]
100        fn get_buf(&self) -> &ReadBuf<'a> {
101            self.parent.as_ref().expect("parent missing").get_buf()
102        }
103    }
104
105    impl<'a, P> VarStringDecoder<P>
106    where
107        P: Reader<'a> + Default,
108    {
109        pub fn wrap(mut self, parent: P, offset: usize) -> Self {
110            self.parent = Some(parent);
111            self.offset = offset;
112            self
113        }
114
115        #[inline]
116        pub fn parent(&mut self) -> SbeResult<P> {
117            self.parent.take().ok_or(SbeErr::ParentNotSet)
118        }
119
120        /// primitive field - 'REQUIRED'
121        #[inline]
122        pub fn length(&self) -> u16 {
123            self.get_buf().get_u16_at(self.offset)
124        }
125
126        /// primitive field - 'REQUIRED'
127        /// characterEncoding: 'UTF-8'
128        #[inline]
129        pub fn var_data(&self) -> u8 {
130            self.get_buf().get_u8_at(self.offset + 2)
131        }
132    }
133} // end decoder mod