1#![doc = include_str!("readme.md")]
2
3pub use self::{token::Token, token_stream::TokenStream};
4use crate::{GaiaDiagnostics, GaiaError};
5use byteorder::{ByteOrder, ReadBytesExt};
6use serde::{Deserialize, Serialize};
7use std::{
8 io::{Read, Seek, SeekFrom},
9 marker::PhantomData,
10};
11use url::Url;
12
13mod token;
14mod token_stream;
15
16#[derive(Debug)]
21pub struct BinaryReader<R, E> {
22 reader: R,
23 position: u64,
24 endian: PhantomData<E>,
25 errors: Vec<GaiaError>,
26}
27
28impl<R: Read, E> Read for BinaryReader<R, E> {
29 fn read(&mut self, buffer: &mut [u8]) -> std::io::Result<usize> {
30 let bytes_read = self.reader.read(buffer)?;
31 self.position += bytes_read as u64;
32 Ok(bytes_read)
33 }
34}
35
36impl<R: Seek, E> Seek for BinaryReader<R, E> {
37 fn seek(&mut self, pos: SeekFrom) -> std::io::Result<u64> {
38 let new_position = self.reader.seek(pos)?;
39 self.position = new_position;
40 Ok(new_position)
41 }
42}
43
44impl<R, E> BinaryReader<R, E> {
45 pub fn new(reader: R) -> Self {
53 Self { reader, position: 0, endian: Default::default(), errors: vec![] }
54 }
55
56 pub fn get_position(&self) -> u64 {
61 self.position
62 }
63
64 pub fn set_position(&mut self, position: u64) -> Result<u64, GaiaError>
74 where
75 R: Seek,
76 {
77 self.reader.seek(SeekFrom::Start(position))?;
78 self.position = position;
79 Ok(position)
80 }
81 pub fn finish(self) -> GaiaDiagnostics<R> {
83 GaiaDiagnostics { result: Ok(self.reader), diagnostics: self.errors }
84 }
85
86 pub fn take_errors(&mut self) -> Vec<GaiaError> {
87 std::mem::take(&mut self.errors)
88 }
89}
90
91impl<R: ReadBytesExt, E: ByteOrder> BinaryReader<R, E> {
92 pub fn read_u8(&mut self) -> std::io::Result<u8> {
97 let value = self.reader.read_u8()?;
98 self.position += 1;
99 Ok(value)
100 }
101
102 pub fn read_u16(&mut self) -> std::io::Result<u16> {
107 let value = self.reader.read_u16::<E>()?;
108 self.position += 2;
109 Ok(value)
110 }
111
112 pub fn read_i16(&mut self) -> std::io::Result<i16> {
117 let value = self.reader.read_i16::<E>()?;
118 self.position += 2;
119 Ok(value)
120 }
121
122 pub fn read_u32(&mut self) -> std::io::Result<u32> {
127 let value = self.reader.read_u32::<E>()?;
128 self.position += 4;
129 Ok(value)
130 }
131
132 pub fn read_u64(&mut self) -> std::io::Result<u64> {
137 let value = self.reader.read_u64::<E>()?;
138 self.position += 8;
139 Ok(value)
140 }
141
142 pub fn read_bytes(&mut self, len: usize) -> std::io::Result<Vec<u8>> {
150 let mut buf = vec![0u8; len];
151 self.reader.read_exact(&mut buf)?;
152 self.position += len as u64;
153 Ok(buf)
154 }
155
156 pub fn read_array<const N: usize>(&mut self) -> std::io::Result<[u8; N]> {
161 let mut buf = [0u8; N];
162 self.reader.read_exact(&mut buf)?;
163 self.position += N as u64;
164 Ok(buf)
165 }
166
167 pub fn skip(&mut self, count: u64) -> std::io::Result<u64>
177 where
178 R: Seek,
179 {
180 let new_pos = self.reader.seek(SeekFrom::Current(count as i64))?;
181 self.position = new_pos;
182 Ok(new_pos)
183 }
184}
185
186#[derive(Copy, Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
190pub struct SourcePosition {
191 pub line: u32,
195 pub column: u32,
199 pub offset: usize,
203 pub length: usize,
207}
208
209#[derive(Clone, Debug, Serialize, Deserialize)]
214pub struct SourceLocation {
215 pub line: u32,
219 pub column: u32,
223 pub url: Option<Url>,
228}
229
230impl Default for SourceLocation {
231 fn default() -> Self {
232 Self { line: 1, column: 1, url: None }
233 }
234}