use crate::syntax::content::{Parseable, parser::lexeme::Lexeme}; #[derive(Debug, Clone, Eq, PartialEq)] pub struct Span { open: Option, } 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 { "".to_owned() } else { "".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(), ""); let closed_span = Span::new(false); assert_eq!(closed_span.render(), ""); } #[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()); } }