use crate::{
tokenizer::{Token, Tokenizer},
types::custom::UserDefinedTag,
};
pub trait Parser {
fn parse(&mut self, tokenizer: &mut Tokenizer, level: u8);
}
pub fn parse_subset<F>(
tokenizer: &mut Tokenizer,
level: u8,
mut tag_handler: F,
) -> Vec<Box<UserDefinedTag>>
where
F: FnMut(&str, &mut Tokenizer),
{
let mut non_standard_dataset = Vec::new();
loop {
if let Token::Level(curl_level) = tokenizer.current_token {
if curl_level <= level {
break;
}
}
match &tokenizer.current_token {
Token::Tag(tag) => {
let tag_clone = tag.clone();
tag_handler(tag_clone.as_str(), tokenizer);
}
Token::CustomTag(tag) => {
let tag_clone = tag.clone();
non_standard_dataset.push(Box::new(UserDefinedTag::new(
tokenizer,
level + 1,
&tag_clone,
)));
}
Token::Level(_) => tokenizer.next_token(),
_ => panic!(
"{}, Unhandled Token: {:?}",
tokenizer.debug(),
tokenizer.current_token
),
}
}
non_standard_dataset
}