lex_extension/wire/
range.rs1use serde::{Deserialize, Serialize};
17
18#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
23pub struct Position(pub u32, pub u32);
24
25impl Position {
26 pub fn new(line: u32, column: u32) -> Self {
29 Self(line, column)
30 }
31
32 pub fn line(&self) -> u32 {
34 self.0
35 }
36
37 pub fn column(&self) -> u32 {
39 self.1
40 }
41}
42
43#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
45pub struct Range {
46 pub start: Position,
47 pub end: Position,
48}
49
50impl Range {
51 pub fn new(start: Position, end: Position) -> Self {
52 Self { start, end }
53 }
54}
55
56#[cfg(test)]
57mod tests {
58 use super::*;
59
60 #[test]
61 fn position_serialises_as_array() {
62 let p = Position::new(12, 4);
63 let s = serde_json::to_string(&p).unwrap();
64 assert_eq!(s, "[12,4]");
65 }
66
67 #[test]
68 fn position_deserialises_from_array() {
69 let p: Position = serde_json::from_str("[12,4]").unwrap();
70 assert_eq!(p, Position::new(12, 4));
71 }
72
73 #[test]
74 fn range_round_trips() {
75 let r = Range::new(Position::new(1, 2), Position::new(3, 4));
76 let s = serde_json::to_string(&r).unwrap();
77 assert_eq!(s, r#"{"start":[1,2],"end":[3,4]}"#);
78 let back: Range = serde_json::from_str(&s).unwrap();
79 assert_eq!(back, r);
80 }
81}