use crate::ctx::CtxGuard;
use crate::ctx::Match;
use crate::err::Error;
use crate::regex::Adapter;
use crate::regex::Regex;
use crate::span::Span;
pub const fn into_regex_builder<'a, C, P, T, F>(pat: P, func: F) -> Adapter<C, impl Regex<C>>
where
P: Regex<C>,
T: Regex<C>,
C: Match<'a>,
F: Fn(&mut C, &Span) -> Result<T, Error>,
{
let regex = move |ctx: &mut C| {
let mut ctx = CtxGuard::new(ctx);
crate::debug_regex_beg!("into_regex_builder", ctx.beg());
let span = ctx.try_mat(&pat)?;
let new_pat = (func)(ctx.ctx(), &span)?;
let ret = ctx.try_mat(&new_pat);
Ok(crate::debug_regex_reval!("into_regex_builder", ret)?)
};
Adapter::new(regex)
}
pub trait DynamicRegexBuilderHelper<'a, C>
where
Self: Sized,
C: Match<'a>,
{
fn into_regex_builder<F, R>(self, func: F) -> Adapter<C, impl Regex<C>>
where
R: Regex<C>,
F: Fn(&mut C, &Span) -> Result<R, Error>;
}
impl<'a, C, T> DynamicRegexBuilderHelper<'a, C> for T
where
Self: Regex<C> + Sized,
C: Match<'a>,
{
fn into_regex_builder<F, R>(self, func: F) -> Adapter<C, impl Regex<C>>
where
R: Regex<C>,
F: Fn(&mut C, &Span) -> Result<R, Error>,
{
into_regex_builder(self, func)
}
}