Same lifetime issue.

This commit is contained in:
Tom Alexander 2022-11-27 00:21:34 -05:00
parent ec4078c812
commit 7d25628f74
Signed by: talexander
GPG Key ID: D3A179C9A53C0EDE
2 changed files with 28 additions and 18 deletions

View File

@ -29,9 +29,6 @@ use nom::sequence::tuple;
use nom::IResult; use nom::IResult;
use tracing::instrument; use tracing::instrument;
use super::nom_context::ContextTree;
use super::nom_context::OrgModeContextTree;
use super::parser_with_context::parser_with_context;
use super::text_element_parser::paragraph; use super::text_element_parser::paragraph;
pub type Res<T, U> = IResult<T, U, VerboseError<T>>; pub type Res<T, U> = IResult<T, U, VerboseError<T>>;

View File

@ -5,9 +5,9 @@ use std::rc::Rc;
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::nom_context::ContextTree; use super::new_context::ContextElement;
use super::nom_context::OrgModeContextNode; use super::new_context::ContextTree;
use super::nom_context::OrgModeContextTree; use super::new_context::FailMatcherNode;
use super::text::bold_end; use super::text::bold_end;
use super::text::bold_start; use super::text::bold_start;
use super::text::line_break; use super::text::line_break;
@ -37,12 +37,13 @@ use nom::Parser;
use tracing::instrument; use tracing::instrument;
use tracing::trace; use tracing::trace;
fn context_many_till<'r, I, O, E, F, M, T>( fn context_many_till<'r, C, I, O, E, F, M, T>(
context: &'r OrgModeContextNode<'r>, context: &'r ContextTree<'r, C>,
mut many_matcher: M, mut many_matcher: M,
mut till_matcher: T, mut till_matcher: T,
) -> impl FnMut(I) -> IResult<I, (Vec<O>, F), E> ) -> impl FnMut(I) -> IResult<I, (Vec<O>, F), E>
where where
C: ContextElement,
I: Clone + InputLength, I: Clone + InputLength,
M: Parser<I, O, E>, M: Parser<I, O, E>,
T: Parser<I, F, E>, T: Parser<I, F, E>,
@ -81,16 +82,19 @@ where
} }
pub fn document(input: &str) -> Res<&str, Vec<(Vec<TextElement>, &str)>> { pub fn document(input: &str) -> Res<&str, Vec<(Vec<TextElement>, &str)>> {
let initial_context = ContextTree::new(); let initial_context: ContextTree<'_, FailMatcherNode> = ContextTree::new();
let paragraph_parser = parser_with_context!(paragraph); let paragraph_parser = parser_with_context!(paragraph);
let ret = many1(paragraph_parser(&initial_context))(input); let ret = many1(paragraph_parser(&initial_context))(input);
ret ret
} }
pub fn paragraph<'s, 'r>( pub fn paragraph<'s, 'r, C>(
context: &'r OrgModeContextNode<'r>, context: &'r ContextTree<'r, C>,
i: &'s str, i: &'s str,
) -> Res<&'s str, (Vec<TextElement<'s>>, &'s str)> { ) -> Res<&'s str, (Vec<TextElement<'s>>, &'s str)>
where
C: ContextElement,
{
// Add a not(eof) check because many_till cannot match a zero-length string // Add a not(eof) check because many_till cannot match a zero-length string
not(eof)(i)?; not(eof)(i)?;
let paragraph_context = context.with_additional_fail_matcher(&paragraph_end); let paragraph_context = context.with_additional_fail_matcher(&paragraph_end);
@ -100,11 +104,14 @@ pub fn paragraph<'s, 'r>(
ret ret
} }
fn flat_text_element<'s, 'r>( fn flat_text_element<'s, 'r, C>(
context: &'r OrgModeContextNode<'r>, context: &'r ContextTree<'r, C>,
i: &'s str, i: &'s str,
) -> Res<&'s str, TextElement<'s>> { ) -> Res<&'s str, TextElement<'s>>
not(|i| context.match_fail(i))(i)?; where
C: ContextElement,
{
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);
let link_matcher = parser_with_context!(flat_link)(context); let link_matcher = parser_with_context!(flat_link)(context);
@ -125,7 +132,10 @@ fn recognize_bold_end(input: &str) -> Res<&str, &str> {
recognize(bold_end)(input) recognize(bold_end)(input)
} }
fn flat_bold<'s, 'r>(context: &'r OrgModeContextNode<'r>, i: &'s str) -> Res<&'s str, Bold<'s>> { fn flat_bold<'s, 'r, C>(context: &'r ContextTree<'r, C>, i: &'s str) -> Res<&'s str, Bold<'s>>
where
C: ContextElement,
{
let new_context = context.with_additional_fail_matcher(&recognize_bold_end); let new_context = context.with_additional_fail_matcher(&recognize_bold_end);
let text_element_parser = parser_with_context!(flat_text_element)(&new_context); let text_element_parser = parser_with_context!(flat_text_element)(&new_context);
let (remaining, captured) = recognize(tuple(( let (remaining, captured) = recognize(tuple((
@ -140,7 +150,10 @@ fn recognize_link_end(input: &str) -> Res<&str, &str> {
recognize(link_end)(input) recognize(link_end)(input)
} }
fn flat_link<'s, 'r>(context: &'r OrgModeContextNode<'r>, i: &'s str) -> Res<&'s str, Link<'s>> { fn flat_link<'s, 'r, C>(context: &'r ContextTree<'r, C>, i: &'s str) -> Res<&'s str, Link<'s>>
where
C: ContextElement,
{
let new_context = context.with_additional_fail_matcher(&recognize_link_end); let new_context = context.with_additional_fail_matcher(&recognize_link_end);
let text_element_parser = parser_with_context!(flat_text_element)(&new_context); let text_element_parser = parser_with_context!(flat_text_element)(&new_context);
let (remaining, captured) = recognize(tuple(( let (remaining, captured) = recognize(tuple((