Skip to main content

regast_syntax/
span.rs

1use serde::{Deserialize, Serialize};
2
3/// A half-open byte range in UTF-8 source text.
4#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
5pub struct Span {
6    pub start: u32,
7    pub end: u32,
8}
9
10impl Span {
11    /// Construct a span from byte offsets.
12    ///
13    /// # Panics
14    ///
15    /// Panics when either offset exceeds `u32::MAX`.
16    #[must_use]
17    pub fn new(start: usize, end: usize) -> Self {
18        Self {
19            start: u32::try_from(start).expect("span start exceeds u32"),
20            end: u32::try_from(end).expect("span end exceeds u32"),
21        }
22    }
23
24    #[must_use]
25    pub const fn len(self) -> u32 {
26        self.end - self.start
27    }
28
29    #[must_use]
30    pub const fn is_empty(self) -> bool {
31        self.start == self.end
32    }
33}
34
35/// Stable index into a [`crate::Pattern`] arena.
36#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
37#[serde(transparent)]
38pub struct NodeId(pub u32);