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}