gin_tonic_core/
decoder.rs1use 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}