peggen_core/
span.rs

1use crate::*;
2use core::{fmt::Debug, ops::{Deref, Range}};
3
4/// Annoted value
5#[derive(Debug, Clone)]
6pub struct Span<X> {
7    pub value: X,
8    pub range: Range<usize>,
9}
10
11pub trait ToSpan: Sized {
12    fn span(self, range: core::ops::Range<usize>) -> Span<Self>;
13}
14
15impl<X> ToSpan for X {
16    fn span(self, range: core::ops::Range<usize>) -> Span<Self> {
17        Span { value: self, range }
18    }
19}
20
21impl<X> Span<X> {
22    pub fn map<Y>(self, f: impl FnOnce(X) -> Y) -> Span<Y> {
23        Span { value: f(self.value), range: self.range }
24    }
25}
26
27impl<X> Span<X> {
28    pub fn inner_ref<Y: ?Sized>(&self) -> Span<&Y> where X: AsRef<Y> {
29        Span { value: self.value.as_ref(), range: self.range.clone() }
30    }
31}
32
33impl<X> Deref for Span<X> {
34    type Target = X;
35    fn deref(&self) -> &Self::Target {
36        &self.value
37    }
38}
39
40impl<const GROUP: usize, const ERROR: bool, T> ParseImpl<GROUP, ERROR> for Span<T> 
41    where T: ParseImpl<GROUP, ERROR>
42{
43    fn parse_impl(
44        input: &str, end: usize,
45        depth: usize,
46        first: bool,
47        trace: &mut Vec<usize>,
48        stack: &mut Vec<Tag>,
49    ) -> Result<usize, ()> {
50        <T as ParseImpl<GROUP, ERROR>>::parse_impl(input, end, depth, first, trace, stack)
51    }
52}
53
54impl<Extra, T> AstImpl<Extra> for Span<T> 
55    where T: AstImpl<Extra>,
56            Extra: Copy,
57{
58    fn ast<'a>(
59        input: &'a str, 
60        stack: &'a [Tag], 
61        with: Extra
62    ) -> (&'a [Tag], Self) {
63        let range = stack[stack.len()-1].span.clone();
64        let (rest, value) = T::ast(input, stack, with);
65        (rest, Span { value, range })
66    }
67}