Implement clone for the context.
This commit is contained in:
parent
b91e4df797
commit
dff528da32
@ -1,9 +1,11 @@
|
|||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
pub struct List<T> {
|
pub struct List<T> {
|
||||||
head: Option<Rc<Node<T>>>,
|
head: Option<Rc<Node<T>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
pub struct Node<T> {
|
pub struct Node<T> {
|
||||||
data: T,
|
data: T,
|
||||||
parent: Option<Rc<Node<T>>>,
|
parent: Option<Rc<Node<T>>>,
|
||||||
|
@ -5,4 +5,4 @@ mod parser_with_context;
|
|||||||
mod text;
|
mod text;
|
||||||
mod text_element_parser;
|
mod text_element_parser;
|
||||||
pub use text_element_parser::document;
|
pub use text_element_parser::document;
|
||||||
type Context<'r> = new_context::ContextTree<'r>;
|
type Context<'r> = &'r new_context::ContextTree<'r>;
|
||||||
|
@ -5,6 +5,7 @@ use super::list::List;
|
|||||||
|
|
||||||
type Matcher = dyn for<'s> Fn(&'s str) -> IResult<&'s str, &'s str, VerboseError<&'s str>>;
|
type Matcher = dyn for<'s> Fn(&'s str) -> IResult<&'s str, &'s str, VerboseError<&'s str>>;
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
pub struct ContextTree<'r> {
|
pub struct ContextTree<'r> {
|
||||||
tree: List<ContextElement<'r>>,
|
tree: List<ContextElement<'r>>,
|
||||||
}
|
}
|
||||||
@ -16,21 +17,22 @@ impl<'r> ContextTree<'r> {
|
|||||||
|
|
||||||
pub fn with_additional_node<'x>(&self, data: ContextElement<'x>) -> ContextTree<'x> {
|
pub fn with_additional_node<'x>(&self, data: ContextElement<'x>) -> ContextTree<'x> {
|
||||||
let new_list = self.tree.push_front(data);
|
let new_list = self.tree.push_front(data);
|
||||||
ContextTree {
|
ContextTree { tree: new_list }
|
||||||
tree: new_list,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
pub enum ContextElement<'r> {
|
pub enum ContextElement<'r> {
|
||||||
FailMatcherNode(FailMatcherNode<'r>),
|
FailMatcherNode(FailMatcherNode<'r>),
|
||||||
PreviousElementNode(PreviousElementNode<'r>),
|
PreviousElementNode(PreviousElementNode<'r>),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
pub struct FailMatcherNode<'r> {
|
pub struct FailMatcherNode<'r> {
|
||||||
pub fail_matcher: ChainBehavior<'r>,
|
pub fail_matcher: ChainBehavior<'r>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
pub struct PreviousElementNode<'r> {
|
pub struct PreviousElementNode<'r> {
|
||||||
pub dummy: &'r str,
|
pub dummy: &'r str,
|
||||||
}
|
}
|
||||||
@ -40,3 +42,18 @@ pub enum ChainBehavior<'r> {
|
|||||||
AndParent(Option<&'r Matcher>),
|
AndParent(Option<&'r Matcher>),
|
||||||
IgnoreParent(Option<&'r Matcher>),
|
IgnoreParent(Option<&'r Matcher>),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl std::fmt::Debug for ChainBehavior {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
|
let mut formatter = f.debug_struct("ChainBehavior");
|
||||||
|
// match self {
|
||||||
|
// ChainBehavior::AndParent(_) => {
|
||||||
|
// formatter = formatter.field("type", &"AndParent");
|
||||||
|
// }
|
||||||
|
// ChainBehavior::IgnoreParent(_) => {
|
||||||
|
// formatter = formatter.field("type", &"IgnoreParent");
|
||||||
|
// }
|
||||||
|
// };
|
||||||
|
formatter.finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
macro_rules! parser_with_context {
|
macro_rules! parser_with_context {
|
||||||
($target:ident) => {
|
($target:ident) => {
|
||||||
move |context| move |i| $target(context, i)
|
move |context| |i| $target(&context, i)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
pub(crate) use parser_with_context;
|
pub(crate) use parser_with_context;
|
||||||
|
@ -113,8 +113,8 @@ pub fn paragraph<'s, 'r>(
|
|||||||
fn flat_text_element<'s, 'r>(context: Context<'r>, i: &'s str) -> Res<&'s str, TextElement<'s>> {
|
fn flat_text_element<'s, 'r>(context: Context<'r>, i: &'s str) -> Res<&'s str, TextElement<'s>> {
|
||||||
not(|i| context.check_fail_matcher(i))(i)?;
|
not(|i| context.check_fail_matcher(i))(i)?;
|
||||||
|
|
||||||
let bold_matcher = parser_with_context!(flat_bold)(context);
|
let bold_matcher = parser_with_context!(flat_bold)(context.clone());
|
||||||
let link_matcher = parser_with_context!(flat_link)(context);
|
let link_matcher = parser_with_context!(flat_link)(context.clone());
|
||||||
|
|
||||||
alt((
|
alt((
|
||||||
map(bold_matcher, TextElement::Bold),
|
map(bold_matcher, TextElement::Bold),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user