Skip to main content

gin_tonic_core/
decoder.rs

1use crate::Decode;
2
3pub struct Decoder<'buf> {
4    buffer: &'buf [u8],
5    position: usize,
6}
7
8impl<'buf> Decoder<'buf> {
9    #[inline]
10    pub fn new(buffer: &'buf [u8]) -> Self {
11        Self {
12            buffer,
13            position: 0,
14        }
15    }
16
17    #[inline]
18    pub fn advance(&mut self, offset: usize) {
19        self.position += offset
20    }
21
22    #[inline]
23    pub fn position(&self) -> usize {
24        self.position
25    }
26
27    #[inline]
28    pub fn buffer(&self) -> &'buf [u8] {
29        &self.buffer[self.position..]
30    }
31}
32
33impl<'buf> Decode for Decoder<'buf> {
34    #[inline]
35    fn eof(&self) -> bool {
36        self.position >= self.buffer.len()
37    }
38
39    #[inline]
40    fn position(&self) -> usize {
41        self.position
42    }
43
44    #[inline]
45    fn len(&self) -> usize {
46        self.buffer.len()
47    }
48
49    #[inline]
50    fn advance(&mut self, size: usize) {
51        self.position += size;
52    }
53
54    #[inline]
55    fn sub_decoder(&mut self, size: usize) -> impl Decode {
56        let sub_buffer = &self.buffer()[0..size];
57        self.advance(size);
58        Decoder::new(sub_buffer)
59    }
60
61    #[inline]
62    fn buffer(&self) -> &[u8] {
63        &self.buffer[self.position..]
64    }
65
66    #[inline]
67    fn decode_sint32(&mut self) -> Result<i32, crate::error::ProtoError> {
68        let (value, size) = varint_simd::decode_zigzag(self.buffer())?;
69        self.advance(size);
70        Ok(value)
71    }
72
73    #[inline]
74    fn decode_sint64(&mut self) -> Result<i64, crate::error::ProtoError> {
75        let (value, size) = varint_simd::decode_zigzag(self.buffer())?;
76        self.advance(size);
77        Ok(value)
78    }
79
80    #[inline]
81    fn decode_uint32(&mut self) -> Result<u32, crate::error::ProtoError> {
82        let (value, size) = varint_simd::decode(self.buffer())?;
83        self.advance(size);
84        Ok(value)
85    }
86
87    #[inline]
88    fn decode_uint64(&mut self) -> Result<u64, crate::error::ProtoError> {
89        let (value, size) = varint_simd::decode(self.buffer())?;
90        self.advance(size);
91        Ok(value)
92    }
93
94    #[inline]
95    fn decode_sfixed32(&mut self) -> Result<i32, crate::error::ProtoError> {
96        let value = i32::from_le_bytes(self.buffer()[0..std::mem::size_of::<i32>()].try_into()?);
97        self.advance(std::mem::size_of::<i32>());
98        Ok(value)
99    }
100
101    #[inline]
102    fn decode_sfixed64(&mut self) -> Result<i64, crate::error::ProtoError> {
103        let value = i64::from_le_bytes(self.buffer()[0..std::mem::size_of::<i64>()].try_into()?);
104        self.advance(std::mem::size_of::<i64>());
105        Ok(value)
106    }
107
108    #[inline]
109    fn decode_fixed32(&mut self) -> Result<u32, crate::error::ProtoError> {
110        let value = u32::from_le_bytes(self.buffer()[0..std::mem::size_of::<u32>()].try_into()?);
111        self.advance(std::mem::size_of::<u32>());
112        Ok(value)
113    }
114
115    #[inline]
116    fn decode_fixed64(&mut self) -> Result<u64, crate::error::ProtoError> {
117        let value = u64::from_le_bytes(self.buffer()[0..std::mem::size_of::<u64>()].try_into()?);
118        self.advance(std::mem::size_of::<u64>());
119        Ok(value)
120    }
121
122    #[inline]
123    fn decode_float(&mut self) -> Result<f32, crate::error::ProtoError> {
124        let value = f32::from_le_bytes(self.buffer()[0..std::mem::size_of::<f32>()].try_into()?);
125        self.advance(std::mem::size_of::<f32>());
126        Ok(value)
127    }
128
129    #[inline]
130    fn decode_double(&mut self) -> Result<f64, crate::error::ProtoError> {
131        let value = f64::from_le_bytes(self.buffer()[0..std::mem::size_of::<f64>()].try_into()?);
132        self.advance(std::mem::size_of::<f64>());
133        Ok(value)
134    }
135
136    #[inline]
137    fn decode_bytes(&mut self) -> Result<Vec<u8>, crate::error::ProtoError> {
138        let len = self.decode_uint32()? as usize;
139        let vec = (self.buffer()[0..len]).to_vec();
140        self.advance(len);
141        Ok(vec)
142    }
143
144    #[inline]
145    fn decode_string(&mut self) -> Result<String, crate::ProtoError> {
146        let len = self.decode_uint32()? as usize;
147        let str = str::from_utf8(&self.buffer()[0..len])?;
148        self.advance(len);
149        Ok(str.into())
150    }
151}