Improved error casting system
This commit is contained in:
+5
-26
@@ -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
@@ -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,7 +1,7 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
Rule,
|
Rule,
|
||||||
ast::*,
|
ast::*,
|
||||||
error::{AstError, GetParseError},
|
error::{AstError, IntoErr},
|
||||||
parser::listen_rule,
|
parser::listen_rule,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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()),
|
||||||
|
|||||||
@@ -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,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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,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,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,7 +1,7 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
Rule,
|
Rule,
|
||||||
ast::*,
|
ast::*,
|
||||||
error::{AstError, GetParseError},
|
error::{AstError, IntoErr},
|
||||||
parser::consume_rule,
|
parser::consume_rule,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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(),
|
||||||
)),
|
)),
|
||||||
|
|
||||||
|
|||||||
@@ -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,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,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user