use alloc::borrow::Cow;
use core::ops::Range;
use super::LabeledSpan;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Label {
span: miette::SourceSpan,
label: Option<Cow<'static, str>>,
}
impl Label {
pub fn at<R>(range: R) -> Self
where
Range<usize>: From<R>,
{
let range = Range::<usize>::from(range);
Self { span: range.into(), label: None }
}
pub fn point<L>(at: usize, label: L) -> Self
where
Cow<'static, str>: From<L>,
{
Self {
span: miette::SourceSpan::from(at),
label: Some(Cow::from(label)),
}
}
pub fn new<R, L>(range: R, label: L) -> Self
where
Range<usize>: From<R>,
Cow<'static, str>: From<L>,
{
let range = Range::<usize>::from(range);
Self {
span: range.into(),
label: Some(Cow::from(label)),
}
}
pub fn label(&self) -> Option<&str> {
self.label.as_deref()
}
}
impl From<Label> for miette::SourceSpan {
#[inline(always)]
fn from(label: Label) -> Self {
label.span
}
}
impl From<Label> for LabeledSpan {
#[inline]
fn from(label: Label) -> LabeledSpan {
if let Some(message) = label.label {
LabeledSpan::at(label.span, message)
} else {
LabeledSpan::underline(label.span)
}
}
}