1use std::fmt::{Debug, Formatter};
2use crate::*;
3
4#[derive(Clone, Copy)]
5pub struct Span<'a, T: ParserImpl<'a> + Copy> {
6 pub range: (usize, usize),
7 pub value: T,
8 pub phant: PhantomData<&'a ()>
9}
10
11impl<'a, T> ParserImpl<'a> for Span<'a, T> where
12 T: ParserImpl<'a> + Copy
13{
14 fn parser_impl(
15 source: Source<'a>,
16 out_arena: &'a Arena,
17 err_arena: &'a Arena,
18 precedence: u16,
19 ) -> Result<(Self, Source<'a>), Error<'a>> {
20 let start = source.split;
21 let (inner, source) = T::parser_impl(source, out_arena, err_arena, precedence)?;
22 Ok((Span {
23 range: (start, source.split),
24 value: inner,
25 phant: PhantomData
26 }, source))
27 }
28}
29
30impl<'a, T: ParserImpl<'a> + Copy + Debug> Debug for Span<'a, T> {
31 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
32 write!(f, "{:?}", self.value)
33 }
34}