pub trait SpanBound:
Sized
+ Clone
+ Copy
+ std::fmt::Debug
+ Default
+ PartialEq
+ Eq
+ PartialOrd
+ Ord
+ std::hash::Hash
{
#[must_use]
fn offset(self, by: isize) -> Self;
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub struct Span<B: SpanBound = usize> {
pub start: B,
pub end: B,
}
impl Span<()> {
#[doc(hidden)]
pub const DUMMY: Self = Self { start: (), end: () };
}
impl SpanBound for () {
fn offset(self, _by: isize) -> Self {}
}
impl SpanBound for usize {
fn offset(self, by: isize) -> Self {
self.saturating_add_signed(by)
}
}
#[allow(missing_docs)]
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub struct Spanned<T, B: SpanBound = usize> {
pub value: T,
pub span: Span<B>,
}
impl<T, B: SpanBound> From<T> for Spanned<T, B> {
fn from(value: T) -> Self {
Self {
value,
span: Span::default(),
}
}
}
impl<B: SpanBound> From<Vec<u8>> for Spanned<crate::HtmlString, B> {
fn from(value: Vec<u8>) -> Self {
Self {
value: value.into(),
span: Span::default(),
}
}
}
impl<T, B: SpanBound> std::ops::Deref for Spanned<T, B> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.value
}
}
impl<T, B: SpanBound> std::ops::DerefMut for Spanned<T, B> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.value
}
}