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