deskc_parser/
lib.rs

1use ast::{expr::Expr, span::Span};
2use chumsky::prelude::Simple;
3use textual_diagnostics::{Report, TextualDiagnostics};
4use tokens::Token;
5
6pub mod common;
7pub mod expr;
8pub mod ty;
9
10pub fn parse(input: Vec<(Token, Span)>) -> Result<(Expr, Span), ParserError> {
11    use chumsky::prelude::*;
12    use chumsky::Stream;
13    expr::parser()
14        .then_ignore(end())
15        .parse(Stream::from_iter(
16            input.len()..input.len() + 1,
17            input.into_iter(),
18        ))
19        .map_err(ParserError)
20}
21
22#[derive(Debug, PartialEq)]
23pub struct ParserError(pub Vec<Simple<Token>>);
24
25impl From<ParserError> for TextualDiagnostics {
26    fn from(error: ParserError) -> TextualDiagnostics {
27        TextualDiagnostics {
28            title: "Parser error".into(),
29            reports: error
30                .0
31                .into_iter()
32                .map(|error| Report {
33                    span: error.span(),
34                    text: format!("{:?}", error),
35                })
36                .collect(),
37        }
38    }
39}