Merge branch 'custom_error' into context_many_till
This commit is contained in:
commit
ef60559428
32
src/parser/error.rs
Normal file
32
src/parser/error.rs
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
use nom::bytes::complete::tag;
|
||||||
|
use nom::error::ErrorKind;
|
||||||
|
use nom::error::ParseError;
|
||||||
|
use nom::error::VerboseError;
|
||||||
|
use nom::IResult;
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq)]
|
||||||
|
pub enum CustomError<I> {
|
||||||
|
MyError(MyError<I>),
|
||||||
|
Nom(I, ErrorKind),
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq)]
|
||||||
|
pub struct MyError<I>(pub I);
|
||||||
|
|
||||||
|
impl<I> ParseError<I> for CustomError<I> {
|
||||||
|
fn from_error_kind(input: I, kind: ErrorKind) -> Self {
|
||||||
|
CustomError::Nom(input, kind)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn append(input: I, kind: ErrorKind, mut other: Self) -> Self {
|
||||||
|
// Doesn't do append like VerboseError
|
||||||
|
other
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Err(nom::Err::Error(nom::error::Error::from_error_kind(input, nom::error::ErrorKind::Char)))
|
||||||
|
|
||||||
|
fn test_parser<'a>(i: &'a str) -> IResult<&'a str, &'a str, CustomError<&'a str>> {
|
||||||
|
Err(nom::Err::Error(CustomError::MyError(MyError(i))))?;
|
||||||
|
tag("sdjfisdfjisudfjuwiefweufefefjwef")(i)
|
||||||
|
}
|
@ -1,3 +1,4 @@
|
|||||||
|
mod error;
|
||||||
mod list;
|
mod list;
|
||||||
mod nom_context;
|
mod nom_context;
|
||||||
mod parser_with_context;
|
mod parser_with_context;
|
||||||
|
@ -5,15 +5,15 @@ use nom::combinator::not;
|
|||||||
use nom::error::VerboseError;
|
use nom::error::VerboseError;
|
||||||
use nom::IResult;
|
use nom::IResult;
|
||||||
|
|
||||||
|
use super::error::CustomError;
|
||||||
|
use super::error::MyError;
|
||||||
use super::list::List;
|
use super::list::List;
|
||||||
use super::list::Node;
|
use super::list::Node;
|
||||||
use super::token::Token;
|
use super::token::Token;
|
||||||
use super::Context;
|
use super::Context;
|
||||||
|
|
||||||
type Matcher = dyn for<'r, 's> Fn(
|
type Matcher =
|
||||||
Context<'r, 's>,
|
dyn for<'r, 's> Fn(Context<'r, 's>, &'s str) -> IResult<&'s str, &'s str, CustomError<&'s str>>;
|
||||||
&'s str,
|
|
||||||
) -> IResult<&'s str, &'s str, VerboseError<&'s str>>;
|
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct ContextTree<'r, 's> {
|
pub struct ContextTree<'r, 's> {
|
||||||
@ -46,7 +46,7 @@ impl<'r, 's> ContextTree<'r, 's> {
|
|||||||
pub fn check_exit_matcher(
|
pub fn check_exit_matcher(
|
||||||
&'r self,
|
&'r self,
|
||||||
i: &'s str,
|
i: &'s str,
|
||||||
) -> IResult<&'s str, &'s str, VerboseError<&'s str>> {
|
) -> IResult<&'s str, &'s str, CustomError<&'s str>> {
|
||||||
for current_node in self.iter() {
|
for current_node in self.iter() {
|
||||||
let context_element = current_node.get_data();
|
let context_element = current_node.get_data();
|
||||||
match context_element {
|
match context_element {
|
||||||
@ -64,12 +64,12 @@ impl<'r, 's> ContextTree<'r, 's> {
|
|||||||
if local_result.is_ok() {
|
if local_result.is_ok() {
|
||||||
return local_result;
|
return local_result;
|
||||||
}
|
}
|
||||||
// TODO: Make this a custom error
|
// TODO: Make this a specific error instead of just a generic MyError
|
||||||
not(take(0usize))(i)?;
|
return Err(nom::Err::Error(CustomError::MyError(MyError("NoExit"))));
|
||||||
}
|
}
|
||||||
ChainBehavior::IgnoreParent(None) => {
|
ChainBehavior::IgnoreParent(None) => {
|
||||||
// TODO: Make this a custom error
|
// TODO: Make this a specific error instead of just a generic MyError
|
||||||
not(take(0usize))(i)?;
|
return Err(nom::Err::Error(CustomError::MyError(MyError("NoExit"))));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -78,9 +78,8 @@ impl<'r, 's> ContextTree<'r, 's> {
|
|||||||
ContextElement::Context(_) => {}
|
ContextElement::Context(_) => {}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
// TODO: Make this a custom error
|
// TODO: Make this a specific error instead of just a generic MyError
|
||||||
not(take(0usize))(i)?;
|
return Err(nom::Err::Error(CustomError::MyError(MyError("NoExit"))));
|
||||||
unreachable!()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,7 +25,10 @@ use nom::multi::many_till;
|
|||||||
use nom::sequence::tuple;
|
use nom::sequence::tuple;
|
||||||
use nom::IResult;
|
use nom::IResult;
|
||||||
|
|
||||||
pub type Res<T, U> = IResult<T, U, VerboseError<T>>;
|
use super::error::CustomError;
|
||||||
|
|
||||||
|
pub type Res<T, U> = IResult<T, U, CustomError<T>>;
|
||||||
|
pub type ResOld<T, U> = IResult<T, U, VerboseError<T>>;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum TextElement<'a> {
|
pub enum TextElement<'a> {
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
use crate::parser::parser_with_context::parser_with_context;
|
use crate::parser::parser_with_context::parser_with_context;
|
||||||
use crate::parser::text::paragraph_end;
|
use crate::parser::text::paragraph_end;
|
||||||
|
|
||||||
|
use super::error::CustomError;
|
||||||
|
use super::error::MyError;
|
||||||
use super::nom_context::ChainBehavior;
|
use super::nom_context::ChainBehavior;
|
||||||
use super::nom_context::ContextElement;
|
use super::nom_context::ContextElement;
|
||||||
use super::nom_context::ContextTree;
|
use super::nom_context::ContextTree;
|
||||||
@ -32,6 +34,7 @@ use nom::combinator::peek;
|
|||||||
use nom::combinator::recognize;
|
use nom::combinator::recognize;
|
||||||
use nom::error::ErrorKind;
|
use nom::error::ErrorKind;
|
||||||
use nom::error::ParseError;
|
use nom::error::ParseError;
|
||||||
|
use nom::error::VerboseError;
|
||||||
use nom::multi::many1;
|
use nom::multi::many1;
|
||||||
use nom::multi::many_till;
|
use nom::multi::many_till;
|
||||||
use nom::sequence::tuple;
|
use nom::sequence::tuple;
|
||||||
@ -180,9 +183,8 @@ pub fn context_bold_start<'s, 'r>(
|
|||||||
if can_start_bold(context) {
|
if can_start_bold(context) {
|
||||||
recognize(bold_start)(input)
|
recognize(bold_start)(input)
|
||||||
} else {
|
} else {
|
||||||
// TODO: Make this a custom error
|
// TODO: Make this a specific error instead of just a generic MyError
|
||||||
not(take(0usize))(input)?;
|
return Err(nom::Err::Error(CustomError::MyError(MyError("Cannot start bold"))));
|
||||||
unreachable!()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user