interact/
deser.rs

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;