use super::TextNode;
use nom::{
bytes::complete::{is_not, take_while},
character::complete::char,
sequence::delimited,
AsChar, IResult, Parser,
};
pub const TEXT_START: &str = "[start]";
pub const TEXT_END: &str = "[end]";
pub fn delimited_text(input: &str) -> IResult<&str, &str> {
delimited(char('['), is_not("]"), char(']')).parse(input)
}
fn while_digit(s: &str) -> IResult<&str, &str> {
take_while(AsChar::is_dec_digit)(s)
}
pub fn delimited_digit(input: &str) -> IResult<&str, &str> {
delimited(char('['), while_digit, char(']')).parse(input)
}
pub fn parse_text(text: &str) -> TextNode {
if text.trim() == TEXT_START {
return TextNode::Start;
}
if text.trim() == TEXT_END {
return TextNode::End;
}
match delimited_digit(text) {
Ok((_, d)) => TextNode::Stage(d.parse().unwrap()),
Err(_) => match delimited_text(text) {
Ok((_, t)) => TextNode::Topic(t.into()),
Err(_) => TextNode::Content(text.to_string()),
},
}
}