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
use crate::sources::source_file::SourceFileIterator;

/// Represents a parser that parsed its value successfully.
/// It parsed the value of type `O`.
/// It also stores the best error encountered during parsing, and the position AFTER the parsed value in `pos`.
#[derive(Clone)]
pub struct ParseResult<'src, O: Clone> {
    pub result: O,
    pub pos: SourceFileIterator<'src>,
    pub pos_err: SourceFileIterator<'src>,
    pub ok: bool,
    pub recovered: bool,
}

impl<'src, O: Clone> ParseResult<'src, O> {
    /// Maps the result of this ParseSuccess, using a mapping function.
    pub fn map<F, ON: Clone>(self, mapfn: F) -> ParseResult<'src, ON>
    where
        F: Fn(O) -> ON,
    {
        ParseResult {
            result: mapfn(self.result),
            pos: self.pos,
            pos_err: self.pos_err,
            ok: self.ok,
            recovered: self.recovered,
        }
    }

    pub fn new(
        result: O,
        pos: SourceFileIterator<'src>,
        pos_err: SourceFileIterator<'src>,
        ok: bool,
        recovered: bool,
    ) -> Self {
        ParseResult {
            result,
            pos,
            pos_err,
            ok,
            recovered,
        }
    }

    pub fn new_ok(
        result: O,
        pos: SourceFileIterator<'src>,
        pos_err: SourceFileIterator<'src>,
        recovered: bool,
    ) -> Self {
        ParseResult {
            result,
            pos,
            pos_err,
            ok: true,
            recovered,
        }
    }

    pub fn new_err(
        result: O,
        pos: SourceFileIterator<'src>,
        pos_err: SourceFileIterator<'src>,
    ) -> Self {
        ParseResult {
            result,
            pos,
            pos_err,
            ok: false,
            recovered: false,
        }
    }
}