en/src/syntax/content/parser/token/span.rs

91 lines
2 KiB
Rust

use crate::syntax::content::{Parseable, parser::lexeme::Lexeme};
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct Span {
open: Option<bool>,
}
impl Span {
pub fn new(open: bool) -> Span {
Span { open: Some(open) }
}
}
impl Parseable for Span {
fn probe(_lexeme: &Lexeme) -> bool {
// there is no lexeme for span
false
}
fn lex(_lexeme: &Lexeme) -> Span {
Span { open: None }
}
fn render(&self) -> String {
if let Some(open) = self.open {
if open {
"<span>".to_owned()
} else {
"</span>".to_owned()
}
} else {
panic!("Attempt to render a span tag while open state is unknown")
}
}
}
impl std::fmt::Display for Span {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
let display_open_state = match self.open {
Some(ref open_state) => {
if *open_state {
"open"
} else {
"closed"
}
},
None => "unknown",
};
write!(f, "Span [{display_open_state}]")
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn probe() {
assert!(!Span::probe(&Lexeme::new(
&crate::ONSET.elapsed().as_nanos().to_string(),
"",
)));
}
#[test]
fn lex() {
let span = Span::lex(&Lexeme::new(
&crate::ONSET.elapsed().as_nanos().to_string(),
"",
));
assert!(span.open.is_none());
}
#[test]
fn render() {
let open_span = Span::new(true);
assert_eq!(open_span.render(), "<span>");
let closed_span = Span::new(false);
assert_eq!(closed_span.render(), "</span>");
}
#[test]
#[should_panic(
expected = "Attempt to render a span tag while open state is unknown"
)]
fn render_unknown_open_state() {
let open_span = Span::lex(&Lexeme::new("", ""));
drop(open_span.render());
}
}