regast-syntax 0.1.0

Lossless syntax tree for the regast regular expression engine
Documentation
use serde::{Deserialize, Serialize};

/// A half-open byte range in UTF-8 source text.
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct Span {
    pub start: u32,
    pub end: u32,
}

impl Span {
    /// Construct a span from byte offsets.
    ///
    /// # Panics
    ///
    /// Panics when either offset exceeds `u32::MAX`.
    #[must_use]
    pub fn new(start: usize, end: usize) -> Self {
        Self {
            start: u32::try_from(start).expect("span start exceeds u32"),
            end: u32::try_from(end).expect("span end exceeds u32"),
        }
    }

    #[must_use]
    pub const fn len(self) -> u32 {
        self.end - self.start
    }

    #[must_use]
    pub const fn is_empty(self) -> bool {
        self.start == self.end
    }
}

/// Stable index into a [`crate::Pattern`] arena.
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(transparent)]
pub struct NodeId(pub u32);