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