keybd 0.1.0

instead of JSON when binary data more than string data
Documentation
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]
    }
}