neure/re/ctor/
boxed.rs

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// into_box
14#[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}