1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
use crate::{ExpectTree, Token, TokenKind, TokenVec}; #[derive(Debug, Eq, PartialEq)] pub enum DeserError { EndOfTokenList, NumberTooLarge, NumberTooSmall, UnexpectedToken, Unbuildable, } pub struct Tracker<'a, 'b> { expect: &'b mut ExpectTree<Token<'static>>, tokenvec: &'b mut TokenVec<'a>, steps: usize, } pub type Result<T> = std::result::Result<T, DeserError>; impl<'a, 'b> Tracker<'a, 'b> { pub fn new(expect: &'b mut ExpectTree<Token<'static>>, tokenvec: &'b mut TokenVec<'a>) -> Self { Self { expect, tokenvec, steps: 0, } } pub fn possible_token(&mut self, token: Token<'static>) { self.expect.advance(token); self.expect.retract_one(); } pub fn try_token(&mut self, token: &Token<'static>) -> Result<bool> { if !self.tokenvec.has_remaining() { let mut token = token.clone(); if let Some(last) = self.expect.last() { if let TokenKind::Comma = &last.kind { if last.space_suffix() == 0 { token.space_diff += 1; } } } else if self.steps == 0 { token.space_diff += 1; } self.expect.advance(token); Ok(false) } else if self.tokenvec.top().similar(token) { self.step(); Ok(true) } else if self.tokenvec.top().is_prefix_of(token) { self.expect.advance(token.clone()); Ok(false) } else { Err(DeserError::UnexpectedToken) } } pub fn has_remaining(&self) -> bool { self.tokenvec.has_remaining() } pub fn top(&self) -> &Token<'a> { self.tokenvec.top() } pub fn top_kind(&self) -> &TokenKind { &self.top().kind } pub fn step(&mut self) { *self.expect = ExpectTree::new(); self.tokenvec.step(); self.steps += 1; } } pub trait Deser: Sized { fn deser<'a, 'b>(_tracker: &mut Tracker<'a, 'b>) -> Result<Self> { return Err(DeserError::Unbuildable); } } mod basic; mod btreemap; mod derefs; mod hashmap; mod hashset; mod instant; mod mutex; mod refcell; mod tuple; mod vec;