Improved error casting system

This commit is contained in:
2026-05-16 04:32:19 +02:00
parent b22c0e8527
commit 0c6723e967
13 changed files with 28 additions and 55 deletions
+5 -26
View File
@@ -46,34 +46,13 @@ impl<'a, F> AstError<'a, F> {
} }
} }
pub trait GetParseError<'a, F> { pub trait IntoErr<T> {
fn get<T>(self) -> AstResult<'a, F, T>; fn get(self) -> T;
} }
impl<'a, F> GetParseError<'a, F> for AstResult<'a, F> { impl<'a, T, TE, TE2> IntoErr<AstResult<'a, T, TE2>> for AstResult<'a, T, TE> {
fn get<T>(self) -> AstResult<'a, F, T> { fn get(self) -> AstResult<'a, T, TE2> {
match self { self.map_err(AstError::get)
Ok(v) => Ok(v),
Err(e) => Err(e.get()),
}
}
}
impl<'a, F> GetParseError<'a, Option<F>> for Result<Option<F>, AstError<'a, F>> {
fn get<T>(self) -> AstResult<'a, Option<F>, T> {
match self {
Ok(v) => Ok(v),
Err(e) => Err(e.get()),
}
}
}
impl<'a, F> GetParseError<'a, Option<Vec<F>>> for Result<Option<Vec<F>>, AstError<'a, F>> {
fn get<T>(self) -> AstResult<'a, Option<Vec<F>>, T> {
match self {
Ok(v) => Ok(v),
Err(e) => Err(e.get()),
}
} }
} }
+1 -1
View File
@@ -7,7 +7,7 @@ pub mod parser;
use ast::*; use ast::*;
use crate::error::{GetParseError, ParseError}; use crate::error::{IntoErr, ParseError};
#[derive(Parser)] #[derive(Parser)]
#[grammar = "./src/grammar.pest"] #[grammar = "./src/grammar.pest"]
+1 -1
View File
@@ -1,7 +1,7 @@
use crate::{ use crate::{
Rule, Rule,
ast::*, ast::*,
error::{AstError, GetParseError}, error::{AstError, IntoErr},
parser::listen_rule, parser::listen_rule,
}; };
+11 -17
View File
@@ -1,7 +1,8 @@
use crate::{ use crate::{
Rule, Rule,
ast::*, ast::*,
error::{AstError, AstResult, GetParseError, collect_recovered, collect_recovered_map}, ast_expr,
error::{AstError, IntoErr, collect_recovered, collect_recovered_map},
}; };
impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for Expression { impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for Expression {
@@ -15,26 +16,19 @@ impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for Expression {
Rule::expr => { Rule::expr => {
let prefixes = inner let prefixes = inner
.next() .next()
.map(|p| { .map(|p| collect_recovered::<Prefix, Prefix>(p.into_inner()))
p.into_inner() .unwrap_or_else(|| Ok(Vec::new()));
.into_iter()
.map(Prefix::try_from)
.collect::<AstResult<'a, Vec<_>, _>>()
})
.transpose()
.get()?
.unwrap_or_default();
let exp = Expression::try_from(inner.next().unwrap())?; let exp = Expression::try_from(inner.next().unwrap());
if inner.len() > 0 || prefixes.len() > 0 { if inner.len() > 0 {
Ok(Expression::Fix { ast_expr!(Expression::Fix {
initial: Box::new(exp), initial: exp.map(Box::new),
prefixes, prefixes: prefixes,
postfixes: collect_recovered(inner).get()?, postfixes: collect_recovered(inner),
}) })
} else { } else {
Ok(exp) Ok(exp?)
} }
} }
Rule::primary => Expression::try_from(inner.next().unwrap()), Rule::primary => Expression::try_from(inner.next().unwrap()),
+1 -1
View File
@@ -6,7 +6,7 @@ pub mod types;
use crate::{ use crate::{
Rule, Rule,
ast::*, ast::*,
error::{AstError, GetParseError, collect_recovered}, error::{AstError, IntoErr, collect_recovered},
parser::consume_rule, parser::consume_rule,
}; };
+1 -1
View File
@@ -2,7 +2,7 @@ use crate::{
Rule, Rule,
ast::*, ast::*,
ast_expr, ast_expr,
error::{AstError, AstResult, ErrorCode, GetParseError, collect_recovered}, error::{AstError, AstResult, ErrorCode, IntoErr, collect_recovered},
parser::listen_rule, parser::listen_rule,
}; };
+1 -1
View File
@@ -1,7 +1,7 @@
use crate::{ use crate::{
Rule, Rule,
ast::*, ast::*,
error::{AstError, GetParseError, collect_recovered}, error::{AstError, IntoErr, collect_recovered},
parser::{consume_rule, listen_rule}, parser::{consume_rule, listen_rule},
}; };
+1 -1
View File
@@ -1,7 +1,7 @@
use crate::{ use crate::{
Rule, Rule,
ast::*, ast::*,
error::{AstError, GetParseError, collect_recovered}, error::{AstError, IntoErr, collect_recovered},
}; };
impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for Attribute { impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for Attribute {
+1 -1
View File
@@ -1,7 +1,7 @@
use crate::{ use crate::{
Rule, Rule,
ast::*, ast::*,
error::{AstError, GetParseError}, error::{AstError, IntoErr},
parser::consume_rule, parser::consume_rule,
}; };
+2 -2
View File
@@ -1,7 +1,7 @@
use crate::{ use crate::{
Rule, Rule,
ast::*, ast::*,
error::{AstError, GetParseError, collect_recovered}, error::{AstError, IntoErr, collect_recovered},
}; };
impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for EnumItem { impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for EnumItem {
@@ -25,7 +25,7 @@ impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for EnumItem {
.next() .next()
.map(|pair| collect_recovered::<FieldDecl, FieldDecl>(pair.into_inner())) .map(|pair| collect_recovered::<FieldDecl, FieldDecl>(pair.into_inner()))
.transpose() .transpose()
.get::<Self>()? .get()?
.unwrap_or_default(), .unwrap_or_default(),
)), )),
+1 -1
View File
@@ -2,7 +2,7 @@ use crate::{
Rule, Rule,
ast::*, ast::*,
ast_expr, ast_expr,
error::{AstError, AstResult, GetParseError, collect_recovered}, error::{AstError, AstResult, IntoErr, collect_recovered},
parser::{consume_rule, listen_rule}, parser::{consume_rule, listen_rule},
}; };
+1 -1
View File
@@ -1,7 +1,7 @@
use crate::{ use crate::{
Rule, Rule,
ast::*, ast::*,
error::{AstError, GetParseError, collect_recovered}, error::{AstError, IntoErr, collect_recovered},
parser::consume_rule, parser::consume_rule,
}; };
+1 -1
View File
@@ -8,7 +8,7 @@ use crate::{
Rule, Rule,
ast::*, ast::*,
ast_expr, ast_expr,
error::{AstError, GetParseError, collect_recovered}, error::{AstError, IntoErr, collect_recovered},
parser::consume_rule, parser::consume_rule,
}; };