use crate::{Prefixes, Doc};
pub struct Parser<'a> {
cursor: usize,
buf: &'a [u8]
}
impl<'a> Parser<'a> {
pub fn new(buf: &'a [u8])-> Self {
Self { cursor: 0, buf }
}
pub fn run(&mut self)-> Doc {
match self.get() {
Prefixes::NUL=> Doc::Nul,
Prefixes::FALSE=> Doc::Bool(false),
Prefixes::TRUE=> Doc::Bool(true),
Prefixes::NUMBER | Prefixes::STRING=> Doc::Number(String::from_utf8_lossy(self.buf()).to_string()),
Prefixes::BUFFER=> Doc::Buffer(self.buf().to_vec()),
Prefixes::ARRAY=> {
let len = self.vint();
let mut arr = Vec::with_capacity(len);
for _ in 0..len {
arr.push(self.run());
}
Doc::Array(arr)
}
Prefixes::OBJECT=> {
let len = self.vint();
let mut arr = Vec::with_capacity(len);
for _ in 0..len {
arr.push((String::from_utf8_lossy(self.buf()).to_string(), self.run()));
}
Doc::Object(arr)
}
_=> Doc::Nul
}
}
fn get(&mut self)-> u8 {
let n = self.buf[self.cursor];
self.cursor += 1;
n
}
fn vint(&mut self)-> usize {
let mut n = self.get() as usize;
let len = n >> 6;
n &= 0x3F;
for i in 0..len {
n |= (self.get() as usize) << (i * 8 + 6);
}
return n;
}
fn buf(&mut self)-> &'a [u8] {
let len = self.vint();
let cur = self.cursor;
&self.buf[cur..cur + len]
}
}