1#![doc = include_str!("readme.md")]
2
3pub use self::{token::Token, token_stream::TokenStream};
4use crate::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}
26
27impl<R: Read, E> Read for BinaryReader<R, E> {
28 fn read(&mut self, buffer: &mut [u8]) -> std::io::Result<usize> {
29 let bytes_read = self.reader.read(buffer)?;
30 self.position += bytes_read as u64;
31 Ok(bytes_read)
32 }
33}
34
35impl<R: Seek, E> Seek for BinaryReader<R, E> {
36 fn seek(&mut self, pos: SeekFrom) -> std::io::Result<u64> {
37 let new_position = self.reader.seek(pos)?;
38 self.position = new_position;
39 Ok(new_position)
40 }
41}
42
43impl<R, E> BinaryReader<R, E> {
44 pub fn new(reader: R) -> Self {
52 Self { reader, position: 0, endian: Default::default() }
53 }
54
55 pub fn get_position(&self) -> u64 {
60 self.position
61 }
62
63 pub fn set_position(&mut self, position: u64) -> Result<u64, GaiaError>
73 where
74 R: Seek,
75 {
76 self.reader.seek(SeekFrom::Start(position))?;
77 self.position = position;
78 Ok(position)
79 }
80 pub fn finish(self) -> R {
81 self.reader
82 }
83}
84
85impl<R: ReadBytesExt, E: ByteOrder> BinaryReader<R, E> {
86 pub fn read_u8(&mut self) -> std::io::Result<u8> {
91 let value = self.reader.read_u8()?;
92 self.position += 1;
93 Ok(value)
94 }
95
96 pub fn read_u16(&mut self) -> std::io::Result<u16> {
101 let value = self.reader.read_u16::<E>()?;
102 self.position += 2;
103 Ok(value)
104 }
105
106 pub fn read_i16(&mut self) -> std::io::Result<i16> {
111 let value = self.reader.read_i16::<E>()?;
112 self.position += 2;
113 Ok(value)
114 }
115
116 pub fn read_u32(&mut self) -> std::io::Result<u32> {
121 let value = self.reader.read_u32::<E>()?;
122 self.position += 4;
123 Ok(value)
124 }
125
126 pub fn read_u64(&mut self) -> std::io::Result<u64> {
131 let value = self.reader.read_u64::<E>()?;
132 self.position += 8;
133 Ok(value)
134 }
135
136 pub fn read_bytes(&mut self, len: usize) -> std::io::Result<Vec<u8>> {
144 let mut buf = vec![0u8; len];
145 self.reader.read_exact(&mut buf)?;
146 self.position += len as u64;
147 Ok(buf)
148 }
149
150 pub fn read_array<const N: usize>(&mut self) -> std::io::Result<[u8; N]> {
155 let mut buf = [0u8; N];
156 self.reader.read_exact(&mut buf)?;
157 self.position += N as u64;
158 Ok(buf)
159 }
160
161 pub fn skip(&mut self, count: u64) -> std::io::Result<u64>
171 where
172 R: Seek,
173 {
174 let new_pos = self.reader.seek(SeekFrom::Current(count as i64))?;
175 self.position = new_pos;
176 Ok(new_pos)
177 }
178}
179
180#[derive(Copy, Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
184pub struct SourcePosition {
185 pub line: u32,
189 pub column: u32,
193 pub offset: usize,
197 pub length: usize,
201}
202
203#[derive(Clone, Debug, Serialize, Deserialize)]
208pub struct SourceLocation {
209 pub line: u32,
213 pub column: u32,
217 pub url: Option<Url>,
222}
223
224impl Default for SourceLocation {
225 fn default() -> Self {
226 Self { line: 1, column: 1, url: None }
227 }
228}