Remove the new context tree implementation.
This commit is contained in:
parent
6e2ff8b870
commit
f4473cbf01
@ -1,4 +1,3 @@
|
|||||||
mod new_context;
|
|
||||||
mod nom_context;
|
mod nom_context;
|
||||||
mod parser_with_context;
|
mod parser_with_context;
|
||||||
mod text;
|
mod text;
|
||||||
|
@ -1,133 +0,0 @@
|
|||||||
use nom::combinator::not;
|
|
||||||
use nom::combinator::recognize;
|
|
||||||
use nom::complete::take;
|
|
||||||
use nom::error::ErrorKind;
|
|
||||||
use nom::error::ParseError;
|
|
||||||
use nom::error::VerboseError;
|
|
||||||
use nom::IResult;
|
|
||||||
use std::borrow::Cow;
|
|
||||||
|
|
||||||
use super::text::bold_end;
|
|
||||||
use super::text::Res;
|
|
||||||
|
|
||||||
type Matcher = dyn for<'s> Fn(&'s str) -> IResult<&'s str, &'s str, VerboseError<&'s str>>;
|
|
||||||
type Link<'r, T> = Option<&'r Node<'r, T>>;
|
|
||||||
|
|
||||||
pub trait OrgModeContext<'r> {
|
|
||||||
fn get_fail_matcher(&'r self) -> Cow<ChainBehavior<'r>>;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct FailMatcherNode<'r> {
|
|
||||||
fail_matcher: ChainBehavior<'r>,
|
|
||||||
}
|
|
||||||
|
|
||||||
struct PreviousElementNode<'r> {
|
|
||||||
dummy: &'r str,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone)]
|
|
||||||
pub enum ChainBehavior<'r> {
|
|
||||||
AndParent(Option<&'r Matcher>),
|
|
||||||
IgnoreParent(Option<&'r Matcher>),
|
|
||||||
}
|
|
||||||
|
|
||||||
struct Node<'r, T: 'r + ?Sized> {
|
|
||||||
elem: &'r T,
|
|
||||||
parent: Link<'r, T>,
|
|
||||||
}
|
|
||||||
|
|
||||||
struct ContextTree<'r, T: 'r + ?Sized> {
|
|
||||||
// Not using Link so the ContextTree can own this node
|
|
||||||
head: Option<Node<'r, T>>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'r> ContextTree<'r, dyn OrgModeContext<'r>> {
|
|
||||||
pub fn new() -> Self {
|
|
||||||
ContextTree { head: None }
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn with_additional_node(
|
|
||||||
&'r self,
|
|
||||||
new_elem: &'r dyn OrgModeContext<'r>,
|
|
||||||
) -> ContextTree<'r, dyn OrgModeContext<'r>> {
|
|
||||||
let new_node = Node {
|
|
||||||
elem: new_elem,
|
|
||||||
parent: self.head.as_ref(),
|
|
||||||
};
|
|
||||||
ContextTree {
|
|
||||||
head: Some(new_node),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn check_fail_matcher<'s>(
|
|
||||||
&'r self,
|
|
||||||
i: &'s str,
|
|
||||||
) -> IResult<&'s str, &'s str, VerboseError<&'s str>> {
|
|
||||||
let mut current_node = self.head.as_ref();
|
|
||||||
while current_node.is_some() {
|
|
||||||
let current_node_unwrapped =
|
|
||||||
current_node.expect("while loop asserts current_node is some.");
|
|
||||||
let current_fail_matcher = current_node_unwrapped.elem.get_fail_matcher();
|
|
||||||
match current_fail_matcher.as_ref() {
|
|
||||||
ChainBehavior::AndParent(Some(matcher)) => {
|
|
||||||
let local_result = matcher(i);
|
|
||||||
if local_result.is_ok() {
|
|
||||||
return local_result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ChainBehavior::AndParent(None) => {}
|
|
||||||
ChainBehavior::IgnoreParent(Some(matcher)) => {
|
|
||||||
return matcher(i);
|
|
||||||
}
|
|
||||||
ChainBehavior::IgnoreParent(None) => {
|
|
||||||
// TODO: Make this a custom error
|
|
||||||
return Err(nom::Err::Error(VerboseError::from_error_kind(
|
|
||||||
i,
|
|
||||||
ErrorKind::ManyTill,
|
|
||||||
)));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
current_node = current_node
|
|
||||||
.map(|current_head| current_head.parent)
|
|
||||||
.flatten();
|
|
||||||
}
|
|
||||||
// TODO: Make this a custom error
|
|
||||||
return Err(nom::Err::Error(VerboseError::from_error_kind(
|
|
||||||
i,
|
|
||||||
ErrorKind::ManyTill,
|
|
||||||
)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'r> OrgModeContext<'r> for FailMatcherNode<'r> {
|
|
||||||
fn get_fail_matcher(&'r self) -> Cow<ChainBehavior<'r>> {
|
|
||||||
Cow::Borrowed(&self.fail_matcher)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'r> OrgModeContext<'r> for PreviousElementNode<'r> {
|
|
||||||
fn get_fail_matcher(&'r self) -> Cow<ChainBehavior<'r>> {
|
|
||||||
Cow::Owned(ChainBehavior::AndParent(None))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn recognize_bold_end(input: &str) -> Res<&str, &str> {
|
|
||||||
recognize(bold_end)(input)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn test_context() {
|
|
||||||
let foo = "foo";
|
|
||||||
let context = ContextTree::new();
|
|
||||||
let child1_context = PreviousElementNode { dummy: foo };
|
|
||||||
let child1 = context.with_additional_node(&child1_context);
|
|
||||||
let child2_context = FailMatcherNode {
|
|
||||||
fail_matcher: ChainBehavior::AndParent(Some(&recognize_bold_end)),
|
|
||||||
};
|
|
||||||
let child2 = child1.with_additional_node(&child2_context);
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'r, T> std::fmt::Debug for ContextTree<'r, T> {
|
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
||||||
write!(f, "ContextTree")
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user