use alloc::boxed::Box;
use span_lang::Span;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Label {
span: Span,
message: Box<str>,
}
impl Label {
#[inline]
#[must_use]
pub fn new(span: Span, message: impl Into<Box<str>>) -> Self {
Self {
span,
message: message.into(),
}
}
#[inline]
#[must_use]
pub fn unlabelled(span: Span) -> Self {
Self {
span,
message: Box::from(""),
}
}
#[inline]
#[must_use]
pub const fn span(&self) -> Span {
self.span
}
#[inline]
#[must_use]
pub fn message(&self) -> &str {
&self.message
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_new_stores_span_and_message() {
let label = Label::new(Span::new(2, 6), "msg");
assert_eq!(label.span(), Span::new(2, 6));
assert_eq!(label.message(), "msg");
}
#[test]
fn test_unlabelled_has_empty_message() {
let label = Label::unlabelled(Span::new(4, 4));
assert_eq!(label.span(), Span::new(4, 4));
assert_eq!(label.message(), "");
}
#[test]
fn test_message_accepts_owned_string() {
extern crate alloc;
use alloc::string::String;
let label = Label::new(Span::new(0, 1), String::from("owned"));
assert_eq!(label.message(), "owned");
}
}