]> Witch of Git - jade-rose/blob - toolchain/src/lib.rs
Implement wrappers for web
[jade-rose] / toolchain / src / lib.rs
1 pub mod inst;
2 #[cfg(target_arch = "wasm32")]
3 pub mod js;
4
5 pub use inst::Inst;
6 use inst::Decode;
7 use std::io::{self, Read};
8
9 pub enum Error {
10 Io { position: usize, error: io::Error },
11 }
12
13 pub fn disassemble(reader: &mut impl io::Read) -> Result<Vec<Inst>, Error> {
14 let mut results = Vec::new();
15 let mut reader = PositionedRead::new(reader);
16 loop {
17 match Inst::decode(&mut reader) {
18 Ok(inst) => results.push(inst),
19 Err(err) if err.kind() == io::ErrorKind::UnexpectedEof => break,
20 Err(err) => {
21 return Err(Error::Io {
22 position: reader.position,
23 error: err,
24 })
25 }
26 }
27 }
28 Ok(results)
29 }
30
31 struct PositionedRead<'a, R> {
32 inner: &'a mut R,
33 position: usize,
34 }
35
36 impl<'a, R> PositionedRead<'a, R> {
37 pub fn new(inner: &'a mut R) -> Self {
38 PositionedRead { inner, position: 0 }
39 }
40 }
41
42 impl<'a, R: Read> Read for PositionedRead<'a, R> {
43 fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
44 let read = self.inner.read(buf)?;
45 self.position += read;
46 Ok(read)
47 }
48 }