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}