Skip to main content

abyss_core/parser/
span.rs

1use std::ops::Range;
2
3use chumsky::span::Span as ChumskySpan;
4
5/// A minimal span implementation compatible with chumsky's [`Span`] trait.
6#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
7pub struct SimpleSpan<T> {
8    start: T,
9    end: T,
10}
11
12impl<T: Copy + Ord> SimpleSpan<T> {
13    pub fn new(start: T, end: T) -> Self {
14        Self { start, end }
15    }
16
17    pub fn start(&self) -> T {
18        self.start
19    }
20
21    pub fn end(&self) -> T {
22        self.end
23    }
24
25    pub fn into_range(self) -> Range<T> {
26        self.start..self.end
27    }
28}
29
30impl<T: Copy + Ord> From<Range<T>> for SimpleSpan<T> {
31    fn from(range: Range<T>) -> Self {
32        Self {
33            start: range.start,
34            end: range.end,
35        }
36    }
37}
38
39impl<T: Copy + Ord> From<SimpleSpan<T>> for Range<T> {
40    fn from(span: SimpleSpan<T>) -> Self {
41        span.into_range()
42    }
43}
44
45impl<T: Copy + Ord> ChumskySpan for SimpleSpan<T> {
46    type Context = ();
47    type Offset = T;
48
49    fn new(_: Self::Context, range: Range<Self::Offset>) -> Self {
50        Self {
51            start: range.start,
52            end: range.end,
53        }
54    }
55
56    fn context(&self) -> Self::Context {}
57
58    fn start(&self) -> Self::Offset {
59        self.start
60    }
61
62    fn end(&self) -> Self::Offset {
63        self.end
64    }
65}