neure/re/regex/
boxed.rs

1use crate::ctx::Context;
2use crate::ctx::Match;
3use crate::ctx::Span;
4use crate::err::Error;
5use crate::re::Ctor;
6use crate::re::Extract;
7use crate::re::Handler;
8use crate::re::Regex;
9use crate::re::Wrapped;
10
11use std::fmt::Debug;
12
13#[derive(Debug, Clone)]
14pub struct BoxedRegex<T> {
15    inner: Box<T>,
16}
17
18impl<T> BoxedRegex<T> {
19    pub fn new(val: T) -> Self {
20        Self {
21            inner: Box::new(val),
22        }
23    }
24}
25
26impl<C, T> Regex<C> for BoxedRegex<T>
27where
28    T: Regex<C>,
29{
30    type Ret = <T as Regex<C>>::Ret;
31
32    fn try_parse(&self, ctx: &mut C) -> Result<Self::Ret, Error> {
33        self.inner.try_parse(ctx)
34    }
35}
36
37impl<'a, C, O, T, H, A> Ctor<'a, C, O, O, H, A> for BoxedRegex<T>
38where
39    T: Regex<C, Ret = Span>,
40    C: Context<'a> + Match<C>,
41    H: Handler<A, Out = O, Error = Error>,
42    A: Extract<'a, C, Span, Out<'a> = A, Error = Error>,
43{
44    fn construct(&self, ctx: &mut C, handler: &mut H) -> Result<O, Error> {
45        let ret = ctx.try_mat(self)?;
46
47        handler.invoke(A::extract(ctx, &ret)?)
48    }
49}
50
51impl<T> Wrapped for BoxedRegex<T> {
52    type Inner = Box<T>;
53
54    fn wrap(inner: Self::Inner) -> Self {
55        Self { inner }
56    }
57
58    fn inner(&self) -> &Self::Inner {
59        &self.inner
60    }
61
62    fn inner_mut(&mut self) -> &mut Self::Inner {
63        &mut self.inner
64    }
65}