volt_parse/volt_parse/
parser.rs1use super::file_pos::FilePos;
2use std::fmt::Debug;
3
4#[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
25pub trait PResData = Debug + Clone + PartialEq + Eq;
27
28#[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#[derive(Debug, Clone, PartialEq, Eq)]
39pub struct PErr
40{
41 pub pos : FilePos,
42}
43
44pub 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}