Skip to main content

rajac_base/
span.rs

1use serde::{Deserialize, Serialize};
2use std::ops::Range;
3
4/// Shared storage for span byte offsets.
5#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
6pub struct SpanBase {
7    range: Range<usize>,
8}
9
10impl SpanBase {
11    /// Creates a span base from start and end byte offsets.
12    pub fn new(start: usize, end: usize) -> Self {
13        Self { range: start..end }
14    }
15
16    /// Returns the start byte offset (inclusive).
17    pub fn start(&self) -> usize {
18        self.range.start
19    }
20
21    /// Returns the end byte offset (exclusive).
22    pub fn end(&self) -> usize {
23        self.range.end
24    }
25
26    /// Returns the wrapped range.
27    pub fn range(&self) -> &Range<usize> {
28        &self.range
29    }
30}
31
32/// Byte span within a source text.
33#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
34pub struct Span {
35    base: SpanBase,
36}
37
38impl Span {
39    /// Creates a span from start and end byte offsets.
40    pub fn new(start: usize, end: usize) -> Self {
41        Self {
42            base: SpanBase::new(start, end),
43        }
44    }
45
46    /// Returns the start byte offset (inclusive).
47    pub fn start(&self) -> usize {
48        self.base.start()
49    }
50
51    /// Returns the end byte offset (exclusive).
52    pub fn end(&self) -> usize {
53        self.base.end()
54    }
55
56    /// Returns the wrapped range.
57    pub fn range(&self) -> &Range<usize> {
58        self.base.range()
59    }
60}
61
62/// Byte span relative to a local base offset.
63#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
64pub struct RelativeSpan {
65    base: SpanBase,
66}
67
68impl RelativeSpan {
69    /// Creates a relative span from start and end byte offsets.
70    pub fn new(start: usize, end: usize) -> Self {
71        Self {
72            base: SpanBase::new(start, end),
73        }
74    }
75
76    /// Returns the start byte offset (inclusive).
77    pub fn start(&self) -> usize {
78        self.base.start()
79    }
80
81    /// Returns the end byte offset (exclusive).
82    pub fn end(&self) -> usize {
83        self.base.end()
84    }
85
86    /// Returns the wrapped range.
87    pub fn range(&self) -> &Range<usize> {
88        self.base.range()
89    }
90}