facet_deserialize/
span.rs1use core::fmt;
2use core::marker::PhantomData;
3
4#[derive(Debug, PartialEq)]
6pub enum Cooked {}
7
8#[derive(Debug, PartialEq)]
10pub enum Raw {}
11
12pub type Pos = usize;
14
15#[derive(Debug, PartialEq, Eq)]
17pub struct Span<C = Cooked> {
18 pub start: Pos,
20 pub len: usize,
22 _p: PhantomData<C>,
24}
25
26pub trait Spannable<C = Cooked>: Sized {
28 fn with_span(self, span: Span<C>) -> Spanned<Self, C>;
30}
31
32impl<T, C> Spannable<C> for T {
33 fn with_span(self, span: Span<C>) -> Spanned<Self, C> {
34 Spanned { node: self, span }
35 }
36}
37
38impl<C> Span<C> {
39 pub fn new(start: Pos, len: usize) -> Self {
41 Span {
42 start,
43 len,
44 _p: PhantomData,
45 }
46 }
47 pub fn start(&self) -> Pos {
49 self.start
50 }
51 pub fn len(&self) -> usize {
53 self.len
54 }
55 pub fn is_empty(&self) -> bool {
57 self.len == 0
58 }
59 pub fn end(&self) -> Pos {
61 self.start + self.len
62 }
63}
64
65impl<C> Default for Span<C> {
66 fn default() -> Self {
67 Span {
68 start: 0,
69 len: 0,
70 _p: PhantomData,
71 }
72 }
73}
74
75#[derive(Debug, Clone, PartialEq, Eq)]
77pub struct Spanned<T, C = Cooked> {
78 pub node: T,
80 pub span: Span<C>,
82}
83
84impl<T: fmt::Display, C> fmt::Display for Spanned<T, C> {
85 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
86 write!(
87 f,
88 "{} at {}-{}",
89 self.node,
90 self.span.start(),
91 self.span.end()
92 )
93 }
94}
95
96impl<C> Clone for Span<C> {
100 fn clone(&self) -> Self {
101 *self
102 }
103}
104
105impl<C> Copy for Span<C> {}