use crate::span::Span;
#[derive(Debug, Clone)]
pub struct Label {
span: Span,
message: String,
is_primary: bool,
}
impl Label {
pub fn primary(span: Span, message: impl Into<String>) -> Self {
Self {
span,
message: message.into(),
is_primary: true,
}
}
pub fn secondary(span: Span, message: impl Into<String>) -> Self {
Self {
span,
message: message.into(),
is_primary: false,
}
}
pub fn span(&self) -> Span {
self.span
}
pub fn message(&self) -> &str {
&self.message
}
pub fn is_primary(&self) -> bool {
self.is_primary
}
pub fn is_secondary(&self) -> bool {
!self.is_primary
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_primary_label() {
let span = Span::new(10..20);
let label = Label::primary(span, "error here");
assert_eq!(label.span().start(), 10);
assert_eq!(label.span().end(), 20);
assert_eq!(label.message(), "error here");
assert!(label.is_primary());
assert!(!label.is_secondary());
}
#[test]
fn test_secondary_label() {
let span = Span::new(5..15);
let label = Label::secondary(span, "first defined here");
assert_eq!(label.span().start(), 5);
assert_eq!(label.span().end(), 15);
assert_eq!(label.message(), "first defined here");
assert!(!label.is_primary());
assert!(label.is_secondary());
}
}