1use serde::{Deserialize, Serialize};
2use std::ops::Range;
3
4#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
6pub struct SpanBase {
7 range: Range<usize>,
8}
9
10impl SpanBase {
11 pub fn new(start: usize, end: usize) -> Self {
13 Self { range: start..end }
14 }
15
16 pub fn start(&self) -> usize {
18 self.range.start
19 }
20
21 pub fn end(&self) -> usize {
23 self.range.end
24 }
25
26 pub fn range(&self) -> &Range<usize> {
28 &self.range
29 }
30}
31
32#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
34pub struct Span {
35 base: SpanBase,
36}
37
38impl Span {
39 pub fn new(start: usize, end: usize) -> Self {
41 Self {
42 base: SpanBase::new(start, end),
43 }
44 }
45
46 pub fn start(&self) -> usize {
48 self.base.start()
49 }
50
51 pub fn end(&self) -> usize {
53 self.base.end()
54 }
55
56 pub fn range(&self) -> &Range<usize> {
58 self.base.range()
59 }
60}
61
62#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
64pub struct RelativeSpan {
65 base: SpanBase,
66}
67
68impl RelativeSpan {
69 pub fn new(start: usize, end: usize) -> Self {
71 Self {
72 base: SpanBase::new(start, end),
73 }
74 }
75
76 pub fn start(&self) -> usize {
78 self.base.start()
79 }
80
81 pub fn end(&self) -> usize {
83 self.base.end()
84 }
85
86 pub fn range(&self) -> &Range<usize> {
88 self.base.range()
89 }
90}