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
pub trait Position: core::ops::Sub<Self, Output = i32> + Copy {
    fn index(&self) -> u32;
    fn line(&self) -> u32;
    fn column(&self) -> u32;
}

pub trait Error {
    type Position;
    fn reasons(&self) -> &[(Self::Position, &'static str)];
    fn add_reason(self, position: Self::Position, reason: &'static str) -> Self;
}

pub trait Input: Default {
    type Position: Position;
    type Error: Error<Position = Self::Position>;
    fn next(&self, pos: Self::Position) -> Result<(char, Self::Position), Self::Error>;
    fn next_range(
        &self,
        start: Self::Position,
        counts: u32,
    ) -> Result<(&str, Self::Position), Self::Error>;
    fn error_at(&self, pos: Self::Position, reason: &'static str) -> Self::Error;
    fn is_end(&self, pos: Self::Position) -> bool;
}

pub type ResultOf<I, O> = Result<(O, <I as Input>::Position), <I as Input>::Error>;