facet_deserialize/
span.rs1use core::fmt;
2
3pub type Pos = usize;
5
6#[derive(Default, Debug, PartialEq, Eq, Clone, Copy)]
8pub struct Span {
9 pub start: Pos,
11 pub len: usize,
13}
14
15pub trait Spannable: Sized {
17 fn with_span(self, span: Span) -> Spanned<Self>;
19}
20
21impl<T> Spannable for T {
22 fn with_span(self, span: Span) -> Spanned<Self> {
23 Spanned { node: self, span }
24 }
25}
26
27impl Span {
28 pub fn new(start: Pos, len: usize) -> Self {
30 Span { start, len }
31 }
32 pub fn start(&self) -> Pos {
34 self.start
35 }
36 pub fn len(&self) -> usize {
38 self.len
39 }
40 pub fn is_empty(&self) -> bool {
42 self.len == 0
43 }
44 pub fn end(&self) -> Pos {
46 self.start + self.len
47 }
48}
49
50#[derive(Debug, Clone, PartialEq, Eq)]
52pub struct Spanned<T> {
53 pub node: T,
55 pub span: Span,
57}
58
59impl<T: fmt::Display> fmt::Display for Spanned<T> {
60 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
61 write!(
62 f,
63 "{} at {}-{}",
64 self.node,
65 self.span.start(),
66 self.span.end()
67 )
68 }
69}