diff --git a/parser/src/error.rs b/parser/src/error.rs index 4c339b7..769b960 100644 --- a/parser/src/error.rs +++ b/parser/src/error.rs @@ -46,34 +46,13 @@ impl<'a, F> AstError<'a, F> { } } -pub trait GetParseError<'a, F> { - fn get(self) -> AstResult<'a, F, T>; +pub trait IntoErr { + fn get(self) -> T; } -impl<'a, F> GetParseError<'a, F> for AstResult<'a, F> { - fn get(self) -> AstResult<'a, F, T> { - match self { - Ok(v) => Ok(v), - Err(e) => Err(e.get()), - } - } -} - -impl<'a, F> GetParseError<'a, Option> for Result, AstError<'a, F>> { - fn get(self) -> AstResult<'a, Option, T> { - match self { - Ok(v) => Ok(v), - Err(e) => Err(e.get()), - } - } -} - -impl<'a, F> GetParseError<'a, Option>> for Result>, AstError<'a, F>> { - fn get(self) -> AstResult<'a, Option>, T> { - match self { - Ok(v) => Ok(v), - Err(e) => Err(e.get()), - } +impl<'a, T, TE, TE2> IntoErr> for AstResult<'a, T, TE> { + fn get(self) -> AstResult<'a, T, TE2> { + self.map_err(AstError::get) } } diff --git a/parser/src/lib.rs b/parser/src/lib.rs index 11ff32f..b9c126b 100644 --- a/parser/src/lib.rs +++ b/parser/src/lib.rs @@ -7,7 +7,7 @@ pub mod parser; use ast::*; -use crate::error::{GetParseError, ParseError}; +use crate::error::{IntoErr, ParseError}; #[derive(Parser)] #[grammar = "./src/grammar.pest"] diff --git a/parser/src/parser/common/decl.rs b/parser/src/parser/common/decl.rs index d9a3dc5..64ca940 100644 --- a/parser/src/parser/common/decl.rs +++ b/parser/src/parser/common/decl.rs @@ -1,7 +1,7 @@ use crate::{ Rule, ast::*, - error::{AstError, GetParseError}, + error::{AstError, IntoErr}, parser::listen_rule, }; diff --git a/parser/src/parser/common/expr.rs b/parser/src/parser/common/expr.rs index ff0ccd9..b1d8101 100644 --- a/parser/src/parser/common/expr.rs +++ b/parser/src/parser/common/expr.rs @@ -1,7 +1,8 @@ use crate::{ Rule, ast::*, - error::{AstError, AstResult, GetParseError, collect_recovered, collect_recovered_map}, + ast_expr, + error::{AstError, IntoErr, collect_recovered, collect_recovered_map}, }; impl<'a> TryFrom> for Expression { @@ -15,26 +16,19 @@ impl<'a> TryFrom> for Expression { Rule::expr => { let prefixes = inner .next() - .map(|p| { - p.into_inner() - .into_iter() - .map(Prefix::try_from) - .collect::, _>>() - }) - .transpose() - .get()? - .unwrap_or_default(); + .map(|p| collect_recovered::(p.into_inner())) + .unwrap_or_else(|| Ok(Vec::new())); - let exp = Expression::try_from(inner.next().unwrap())?; + let exp = Expression::try_from(inner.next().unwrap()); - if inner.len() > 0 || prefixes.len() > 0 { - Ok(Expression::Fix { - initial: Box::new(exp), - prefixes, - postfixes: collect_recovered(inner).get()?, + if inner.len() > 0 { + ast_expr!(Expression::Fix { + initial: exp.map(Box::new), + prefixes: prefixes, + postfixes: collect_recovered(inner), }) } else { - Ok(exp) + Ok(exp?) } } Rule::primary => Expression::try_from(inner.next().unwrap()), diff --git a/parser/src/parser/common/mod.rs b/parser/src/parser/common/mod.rs index 067dba2..59c47cb 100644 --- a/parser/src/parser/common/mod.rs +++ b/parser/src/parser/common/mod.rs @@ -6,7 +6,7 @@ pub mod types; use crate::{ Rule, ast::*, - error::{AstError, GetParseError, collect_recovered}, + error::{AstError, IntoErr, collect_recovered}, parser::consume_rule, }; diff --git a/parser/src/parser/common/statement.rs b/parser/src/parser/common/statement.rs index 77e1241..32882a5 100644 --- a/parser/src/parser/common/statement.rs +++ b/parser/src/parser/common/statement.rs @@ -2,7 +2,7 @@ use crate::{ Rule, ast::*, ast_expr, - error::{AstError, AstResult, ErrorCode, GetParseError, collect_recovered}, + error::{AstError, AstResult, ErrorCode, IntoErr, collect_recovered}, parser::listen_rule, }; diff --git a/parser/src/parser/common/types.rs b/parser/src/parser/common/types.rs index 19a91c9..3145689 100644 --- a/parser/src/parser/common/types.rs +++ b/parser/src/parser/common/types.rs @@ -1,7 +1,7 @@ use crate::{ Rule, ast::*, - error::{AstError, GetParseError, collect_recovered}, + error::{AstError, IntoErr, collect_recovered}, parser::{consume_rule, listen_rule}, }; diff --git a/parser/src/parser/items/attribute.rs b/parser/src/parser/items/attribute.rs index 5f64605..f3b22ec 100644 --- a/parser/src/parser/items/attribute.rs +++ b/parser/src/parser/items/attribute.rs @@ -1,7 +1,7 @@ use crate::{ Rule, ast::*, - error::{AstError, GetParseError, collect_recovered}, + error::{AstError, IntoErr, collect_recovered}, }; impl<'a> TryFrom> for Attribute { diff --git a/parser/src/parser/items/class.rs b/parser/src/parser/items/class.rs index 88b2944..6694f7f 100644 --- a/parser/src/parser/items/class.rs +++ b/parser/src/parser/items/class.rs @@ -1,7 +1,7 @@ use crate::{ Rule, ast::*, - error::{AstError, GetParseError}, + error::{AstError, IntoErr}, parser::consume_rule, }; diff --git a/parser/src/parser/items/enums.rs b/parser/src/parser/items/enums.rs index ad8c87e..d04f5c8 100644 --- a/parser/src/parser/items/enums.rs +++ b/parser/src/parser/items/enums.rs @@ -1,7 +1,7 @@ use crate::{ Rule, ast::*, - error::{AstError, GetParseError, collect_recovered}, + error::{AstError, IntoErr, collect_recovered}, }; impl<'a> TryFrom> for EnumItem { @@ -25,7 +25,7 @@ impl<'a> TryFrom> for EnumItem { .next() .map(|pair| collect_recovered::(pair.into_inner())) .transpose() - .get::()? + .get()? .unwrap_or_default(), )), diff --git a/parser/src/parser/items/function.rs b/parser/src/parser/items/function.rs index d42ca5d..c9500e7 100644 --- a/parser/src/parser/items/function.rs +++ b/parser/src/parser/items/function.rs @@ -2,7 +2,7 @@ use crate::{ Rule, ast::*, ast_expr, - error::{AstError, AstResult, GetParseError, collect_recovered}, + error::{AstError, AstResult, IntoErr, collect_recovered}, parser::{consume_rule, listen_rule}, }; diff --git a/parser/src/parser/items/impl_decl.rs b/parser/src/parser/items/impl_decl.rs index 98aa43e..dfcd457 100644 --- a/parser/src/parser/items/impl_decl.rs +++ b/parser/src/parser/items/impl_decl.rs @@ -1,7 +1,7 @@ use crate::{ Rule, ast::*, - error::{AstError, GetParseError, collect_recovered}, + error::{AstError, IntoErr, collect_recovered}, parser::consume_rule, }; diff --git a/parser/src/parser/items/mod.rs b/parser/src/parser/items/mod.rs index e8ea0f9..5ea9b56 100644 --- a/parser/src/parser/items/mod.rs +++ b/parser/src/parser/items/mod.rs @@ -8,7 +8,7 @@ use crate::{ Rule, ast::*, ast_expr, - error::{AstError, GetParseError, collect_recovered}, + error::{AstError, IntoErr, collect_recovered}, parser::consume_rule, };