1#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
3#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
4pub struct Position {
5 pub offset: usize,
7 pub line: u32,
9 pub column: u32,
11}
12
13#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
17#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
18pub struct Span {
19 pub start: Position,
20 pub end: Position,
21}
22
23impl Span {
24 pub fn new(start: Position, end: Position) -> Self {
26 Self { start, end }
27 }
28
29 pub fn dummy() -> Self {
31 let pos = Position {
32 offset: 0,
33 line: 0,
34 column: 0,
35 };
36 Self {
37 start: pos,
38 end: pos,
39 }
40 }
41
42 pub fn merge(self, other: Span) -> Span {
44 let start = if self.start.offset <= other.start.offset {
45 self.start
46 } else {
47 other.start
48 };
49 let end = if self.end.offset >= other.end.offset {
50 self.end
51 } else {
52 other.end
53 };
54 Span { start, end }
55 }
56}