volt_parse/volt_parse/
parser.rs

1use super::file_pos::FilePos;
2use std::fmt::Debug;
3
4// Input text to be parsed
5#[derive(Debug, Clone, Copy)]
6pub struct ParserInput<'a>
7{
8    pub text : &'a str,
9    pub pos :  FilePos,
10}
11
12impl<'a> ParserInput<'a>
13{
14    pub fn new(to_parse : &'a str) -> ParserInput<'a>
15    {
16        ParserInput {
17            text : to_parse,
18            pos :  FilePos {
19                line : 1, column : 0
20            },
21        }
22    }
23}
24
25// Parser result data
26pub trait PResData = Debug + Clone + PartialEq + Eq;
27
28// Parser result (success)
29#[derive(Debug, Clone, PartialEq)]
30pub struct PRes<'a, DatT : PResData>
31{
32    pub val :       DatT,
33    pub pos :       FilePos,
34    pub remainder : &'a str,
35}
36
37// Parser error
38#[derive(Debug, Clone, PartialEq, Eq)]
39pub struct PErr
40{
41    pub pos : FilePos,
42}
43
44// Paser out type
45pub type POut<'a, DatT> = Result<PRes<'a, DatT>, PErr>;
46
47pub fn get_p_out_pos<'a, DatT : PResData>(pout : &POut<'a, DatT>) -> FilePos
48{
49    match pout
50    {
51        Ok(p_succ) => p_succ.pos,
52        Err(p_err) => p_err.pos,
53    }
54}
55
56pub trait Parser<'a, DatT : PResData> = Fn(&ParserInput<'a>) -> POut<'a, DatT> + Clone;
57
58pub trait Predicate<'a> = Fn(&'a str) -> bool + Clone;
59
60impl<'a, DatT : PResData> PRes<'a, DatT>
61{
62    pub fn to_in(&self) -> ParserInput<'a>
63    {
64        ParserInput {
65            pos :  self.pos,
66            text : self.remainder,
67        }
68    }
69
70    pub fn with_val<DatTOut : PResData>(&self, dat_out : DatTOut) -> PRes<'a, DatTOut>
71    {
72        PRes {
73            val :       dat_out,
74            pos :       self.pos,
75            remainder : self.remainder,
76        }
77    }
78}