use std::fmt::Debug;
use std::marker::PhantomData;
use crate::ctx::Context;
use crate::ctx::Match;
use crate::ctx::Span;
use crate::err::Error;
use crate::re::def_not;
use crate::re::Ctor;
use crate::re::Extract;
use crate::re::Handler;
use crate::re::Regex;
#[derive(Default, Copy)]
pub struct Pattern<C, P> {
pat: P,
marker: PhantomData<C>,
}
def_not!(Pattern<C, P>);
impl<C, P> Debug for Pattern<C, P>
where
P: Debug,
{
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Pattern").field("pat", &self.pat).finish()
}
}
impl<C, P> Clone for Pattern<C, P>
where
P: Clone,
{
fn clone(&self) -> Self {
Self {
pat: self.pat.clone(),
marker: self.marker,
}
}
}
impl<C, P> Pattern<C, P> {
pub fn new(pat: P) -> Self {
Self {
pat,
marker: PhantomData,
}
}
pub fn pat(&self) -> &P {
&self.pat
}
pub fn pat_mut(&mut self) -> &mut P {
&mut self.pat
}
pub fn set_pat(&mut self, pat: P) -> &mut Self {
self.pat = pat;
self
}
}
impl<'a, C, O, P, H, A> Ctor<'a, C, O, O, H, A> for Pattern<C, P>
where
P: Regex<C, Ret = Span>,
C: Context<'a> + Match<C>,
H: Handler<A, Out = O, Error = Error>,
A: Extract<'a, C, Span, Out<'a> = A, Error = Error>,
{
#[inline(always)]
fn constrct(&self, ctx: &mut C, func: &mut H) -> Result<O, Error> {
let ret = ctx.try_mat(&self.pat)?;
func.invoke(A::extract(ctx, &ret)?)
}
}
impl<'a, C, P> Regex<C> for Pattern<C, P>
where
P: Regex<C, Ret = Span>,
C: Context<'a> + Match<C>,
{
type Ret = P::Ret;
#[inline(always)]
fn try_parse(&self, ctx: &mut C) -> Result<Self::Ret, Error> {
ctx.try_mat(&self.pat)
}
}