wgsl_parse/
span.rs

1use std::ops::Range;
2
3use derive_more::derive::{AsMut, AsRef, Deref, DerefMut, From};
4
5pub type Id = u32;
6
7#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8#[derive(Default, Clone, Debug, PartialEq, Eq, Deref, DerefMut, AsRef, AsMut, From)]
9pub struct Span(Range<usize>);
10
11impl Span {
12    pub fn new(range: Range<usize>) -> Self {
13        Self(range)
14    }
15    pub fn range(&self) -> Range<usize> {
16        self.0.clone()
17    }
18    pub fn extend(&self, other: &Span) -> Self {
19        Self(self.start..other.end)
20    }
21}
22
23#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
24#[derive(Default, Clone, Debug, Deref, DerefMut, AsRef, AsMut, From)]
25pub struct Spanned<T> {
26    span: Span,
27    #[deref(forward)]
28    #[deref_mut(forward)]
29    #[as_ref(T)]
30    #[as_mut(T)]
31    #[from(T)]
32    node: Box<T>,
33}
34
35// we ignore the spans for equality comparison
36impl<T: PartialEq> PartialEq for Spanned<T> {
37    fn eq(&self, other: &Self) -> bool {
38        self.node.eq(&other.node)
39    }
40}
41
42impl<T> Spanned<T> {
43    pub fn new(node: T, span: Span) -> Self {
44        Self::new_boxed(Box::new(node), span)
45    }
46    pub fn new_boxed(node: Box<T>, span: Span) -> Self {
47        Self { span, node }
48    }
49    pub fn span(&self) -> &Span {
50        &self.span
51    }
52    pub fn node(&self) -> &T {
53        self
54    }
55    pub fn node_mut(&mut self) -> &mut T {
56        self
57    }
58    pub fn into_inner(self) -> T {
59        *self.node
60    }
61}
62
63impl<T> From<T> for Spanned<T> {
64    fn from(value: T) -> Self {
65        Self {
66            span: Default::default(),
67            node: Box::new(value),
68        }
69    }
70}