use core::fmt; #[derive(Copy, Clone, Debug, PartialEq)] pub(crate) struct IndexedToken<'raw> { pub idx: usize, pub tok: Token<'raw>, } impl<'raw> IndexedToken<'raw> { pub fn new(idx: usize, tok: Token<'raw>) -> Self { Self { idx, tok } } } #[derive(Copy, Clone, Debug, PartialEq)] pub enum Token<'raw> { /// String of non-space characters Text(&'raw str), /// A space; ' '; 0x20 Space, /// backtick Code, /// asterisk Italic, /// Double-asterisk Bold, /// backslash Escape, /// Percent % Percent, /// Pipe character | Pipe, /// Link Opening [ LinkOpen, /// Link Closing ] LinkClose, /// Interlink Open [[ InterlinkOpen, /// Interlink CLose ]] InterlinkClose, } impl<'raw> Token<'raw> { pub fn is_text(&self) -> bool { if let Self::Text(_) = self { true } else { false } } pub fn is_space(&self) -> bool { if let Self::Space = self { true } else { false } } pub fn len(&self) -> usize { match self { Self::Text(txt) => txt.len(), Self::Space | Self::Code | Self::Italic | Self::Escape | Self::Percent | Self::Pipe | Self::LinkOpen | Self::LinkClose => 1, Self::Bold | Self::InterlinkOpen | Self::InterlinkClose => 2, } } pub fn as_str(&self) -> &'raw str { match self { Token::Bold => "**", Token::Space => " ", Token::Code => "`", Token::Escape => "\\", Token::Percent => "*", Token::Pipe => "|", Token::LinkClose => "]", Token::LinkOpen => "[", Token::InterlinkOpen => "[[", Token::InterlinkClose => "]]", Token::Italic => "*", Token::Text(str) => str, } } } impl<'raw> fmt::Display for Token<'raw> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{}", self.as_str()) } }