use super::navigator::CharNavigator;
use crate::tokenizer::tokens::TokenType;
use crate::Result;
#[derive(Debug, Clone)]
pub struct TokenScanner<'a> {
pub(super) navigator: CharNavigator<'a>,
pub(super) source: &'a str,
}
impl<'a> TokenScanner<'a> {
#[must_use]
pub fn new(source: &'a str, position: usize, line: usize, column: usize) -> Self {
Self {
navigator: CharNavigator::new(source, position, line, column),
source,
}
}
pub fn navigator_mut(&mut self) -> &mut CharNavigator<'a> {
&mut self.navigator
}
#[must_use]
pub const fn navigator(&self) -> &CharNavigator<'a> {
&self.navigator
}
pub fn scan_section_header(&mut self) -> Result<TokenType> {
self.navigator.advance_char()?;
while !self.navigator.is_at_end() {
let ch = self.navigator.peek_char()?;
if ch == ']' {
break;
}
self.navigator.advance_char()?;
}
Ok(TokenType::SectionHeader)
}
pub fn scan_style_override(&mut self) -> Result<TokenType> {
self.navigator.advance_char()?;
let mut brace_depth = 1;
while !self.navigator.is_at_end() && brace_depth > 0 {
let ch = self.navigator.peek_char()?;
match ch {
'{' => brace_depth += 1,
'}' => brace_depth -= 1,
_ => {}
}
if brace_depth > 0 {
self.navigator.advance_char()?;
}
}
Ok(TokenType::OverrideBlock)
}
pub fn scan_comment(&mut self) -> Result<TokenType> {
while !self.navigator.is_at_end() {
let ch = self.navigator.peek_char()?;
if ch == '\n' || ch == '\r' {
break;
}
self.navigator.advance_char()?;
}
Ok(TokenType::Comment)
}
}