wolfram_serialize/wxf/
reader.rs1use crate::constants::{ExpressionEnum, NumericArrayEnum, PackedArrayEnum};
12use crate::reader::Reader;
13use crate::Error;
14
15pub struct WxfReader<R> {
17 inner: R,
18}
19
20impl<'de, R: Reader<'de>> WxfReader<R> {
21 pub fn new(inner: R) -> Self {
24 WxfReader { inner }
25 }
26
27 pub fn read_byte(&mut self) -> Result<u8, Error> {
31 self.inner.read_byte()
32 }
33
34 pub fn read_bytes(&mut self, n: usize) -> Result<&'de [u8], Error> {
36 self.inner.read_bytes(n)
37 }
38
39 pub fn read_varint(&mut self) -> Result<u64, Error> {
41 let mut result: u64 = 0;
42 let mut shift: u32 = 0;
43 loop {
44 let b = self.inner.read_byte()?;
45 result |= u64::from(b & 0x7F) << shift;
46 if b & 0x80 == 0 {
47 return Ok(result);
48 }
49 shift += 7;
50 if shift >= 64 {
51 return Err(Error::invalid("varint exceeds 64 bits".into()));
52 }
53 }
54 }
55
56 pub fn read_expr_token(&mut self) -> Result<ExpressionEnum, Error> {
60 let b = self.inner.read_byte()?;
61 ExpressionEnum::try_from(b)
62 .map_err(|_| Error::invalid(format!("unknown WXF token byte 0x{:02X}", b)))
63 }
64
65 pub fn read_numeric_type(&mut self) -> Result<NumericArrayEnum, Error> {
67 let b = self.inner.read_byte()?;
68 NumericArrayEnum::try_from(b).map_err(|_| {
69 Error::invalid(format!("unknown NumericArray element type 0x{:02X}", b))
70 })
71 }
72
73 pub fn read_packed_type(&mut self) -> Result<PackedArrayEnum, Error> {
75 let b = self.inner.read_byte()?;
76 PackedArrayEnum::try_from(b).map_err(|_| {
77 Error::invalid(format!("unknown PackedArray element type 0x{:02X}", b))
78 })
79 }
80
81 pub fn read_i8(&mut self) -> Result<i8, Error> {
85 Ok(self.inner.read_byte()? as i8)
86 }
87
88 pub fn read_i16(&mut self) -> Result<i16, Error> {
90 let b = self.inner.read_bytes(2)?;
91 Ok(i16::from_le_bytes(b.try_into().unwrap()))
92 }
93
94 pub fn read_i32(&mut self) -> Result<i32, Error> {
96 let b = self.inner.read_bytes(4)?;
97 Ok(i32::from_le_bytes(b.try_into().unwrap()))
98 }
99
100 pub fn read_i64(&mut self) -> Result<i64, Error> {
102 let b = self.inner.read_bytes(8)?;
103 Ok(i64::from_le_bytes(b.try_into().unwrap()))
104 }
105
106 pub fn read_f64(&mut self) -> Result<f64, Error> {
108 let b = self.inner.read_bytes(8)?;
109 Ok(f64::from_le_bytes(b.try_into().unwrap()))
110 }
111
112 pub fn read_str(&mut self) -> Result<&'de str, Error> {
118 let len = self.read_varint()? as usize;
119 let bytes = self.inner.read_bytes(len)?;
120 std::str::from_utf8(bytes)
121 .map_err(|_| Error::invalid("payload not valid UTF-8".into()))
122 }
123
124 pub fn read_string(&mut self) -> Result<String, Error> {
127 match self.read_expr_token()? {
128 ExpressionEnum::String => Ok(self.read_str()?.to_owned()),
129 other => Err(Error::unexpected_token(&["String"], other)),
130 }
131 }
132
133 pub fn read_symbol_name(&mut self) -> Result<String, Error> {
137 Ok(self.read_str()?.to_owned())
138 }
139
140 pub fn read_byte_array(&mut self) -> Result<&'de [u8], Error> {
144 let len = self.read_varint()? as usize;
145 self.inner.read_bytes(len)
146 }
147
148 pub fn read_numeric_array_parts(
154 &mut self,
155 ) -> Result<(NumericArrayEnum, Vec<usize>, Vec<u8>), Error> {
156 let dt = self.read_numeric_type()?;
157 let (dims, bytes) = self.read_array_body(dt.size_in_bytes())?;
158 Ok((dt, dims, bytes))
159 }
160
161 pub fn read_array_body(
164 &mut self,
165 elem_size: usize,
166 ) -> Result<(Vec<usize>, Vec<u8>), Error> {
167 let rank = self.read_varint()? as usize;
168 let mut dims = Vec::with_capacity(rank);
169 for _ in 0..rank {
170 dims.push(self.read_varint()? as usize);
171 }
172 let byte_count = dims.iter().product::<usize>() * elem_size;
173 let bytes = self.inner.read_bytes(byte_count)?.to_vec();
174 Ok((dims, bytes))
175 }
176
177 pub fn read_rule(&mut self) -> Result<bool, Error> {
181 match self.read_expr_token()? {
182 ExpressionEnum::Rule => Ok(false),
183 ExpressionEnum::RuleDelayed => Ok(true),
184 other => Err(Error::unexpected_token(&["Rule", "RuleDelayed"], other)),
185 }
186 }
187
188 pub fn skip(&mut self) -> Result<(), Error> {
194 let tok = self.read_expr_token()?;
195 self.skip_body(tok)
196 }
197
198 fn skip_body(&mut self, tok: ExpressionEnum) -> Result<(), Error> {
199 match tok {
200 ExpressionEnum::Integer8 => {
201 self.read_i8()?;
202 },
203 ExpressionEnum::Integer16 => {
204 self.read_i16()?;
205 },
206 ExpressionEnum::Integer32 => {
207 self.read_i32()?;
208 },
209 ExpressionEnum::Integer64 => {
210 self.read_i64()?;
211 },
212 ExpressionEnum::Real64 => {
213 self.read_f64()?;
214 },
215 ExpressionEnum::String
216 | ExpressionEnum::Symbol
217 | ExpressionEnum::ByteArray
218 | ExpressionEnum::BigInteger
219 | ExpressionEnum::BigReal => {
220 let len = self.read_varint()? as usize;
221 self.inner.read_bytes(len)?;
222 },
223 ExpressionEnum::NumericArray | ExpressionEnum::PackedArray => {
224 let dt = self.read_numeric_type()?;
226 let rank = self.read_varint()? as usize;
227 let mut count = 1usize;
228 for _ in 0..rank {
229 count *= self.read_varint()? as usize;
230 }
231 self.inner.read_bytes(count * dt.size_in_bytes())?;
232 },
233 ExpressionEnum::Function => {
234 let n = self.read_varint()?;
235 self.skip()?; for _ in 0..n {
237 self.skip()?;
238 }
239 },
240 ExpressionEnum::Association => {
241 let n = self.read_varint()?;
242 for _ in 0..n {
243 self.read_rule()?;
244 self.skip()?; self.skip()?; }
247 },
248 other @ (ExpressionEnum::Rule | ExpressionEnum::RuleDelayed) => {
250 return Err(Error::unexpected_token(&[], other))
251 },
252 }
253 Ok(())
254 }
255}