1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
use crate::ast::{FromTokens, ScannerTokens};
use crate::scanner::LogosScanner;
use crate::Error;

pub trait Parse<'a>: FromTokens<'a> {
    fn parse(s: &'a str) -> Result<Self, Vec<Error>>;
}

impl<'a, T: FromTokens<'a>> Parse<'a> for T {
    fn parse(s: &'a str) -> Result<Self, Vec<Error>> {
        let scanner = LogosScanner::new(s);
        let mut tokens = ScannerTokens::new(scanner);

        let result = T::from_tokens(&mut tokens);

        if tokens.errors.is_empty() {
            result.map_err(|err| vec![err.into()])
        } else {
            Err(tokens.errors.into_iter().map(Into::into).collect())
        }
    }
}