use crate::StartDiagramToken;
use crate::{wr, ParseContainer};
use nom::branch::alt;
use nom::character::complete::{line_ending, space0};
use nom::combinator::eof;
use nom::sequence::tuple;
use nom::IResult;
#[derive(Clone, Debug)]
pub struct StartLine {
token: StartDiagramToken,
}
impl StartLine {
pub fn parse(input: ParseContainer) -> IResult<ParseContainer, (Vec<ParseContainer>, Self)> {
let (rest, parsed) = tuple((
wr!(space0),
StartDiagramToken::parse,
wr!(space0),
alt((wr!(eof), wr!(line_ending))),
))(input)?;
let (token_raws, token_parsed) = parsed.1;
let ret0 = [parsed.0]
.into_iter()
.chain(token_raws)
.chain([parsed.2, parsed.3])
.collect();
let ret1 = Self {
token: token_parsed,
};
Ok((rest, (ret0, ret1)))
}
pub fn diagram_kind(&self) -> &str {
self.token.diagram_kind()
}
pub fn id(&self) -> Option<&str> {
self.token.id()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_parse_start_line() -> anyhow::Result<()> {
let testdata = "@startuml\n";
let (rest, (parsed, StartLine { token })) = StartLine::parse(testdata.into())?;
assert_eq!(rest, "");
assert_eq!(testdata, parsed.join(""));
assert_eq!(token.diagram_kind(), "uml");
assert_eq!(token.id(), None);
let testdata = " \t@startuml\n";
let (rest, (parsed, StartLine { token })) = StartLine::parse(testdata.into())?;
assert_eq!(rest, "");
assert_eq!(testdata, parsed.join(""));
assert_eq!(token.diagram_kind(), "uml");
assert_eq!(token.id(), None);
let testdata = "@startuml \t\n";
let (rest, (parsed, StartLine { token })) = StartLine::parse(testdata.into())?;
assert_eq!(rest, "");
assert_eq!(testdata, parsed.join(""));
assert_eq!(token.diagram_kind(), "uml");
assert_eq!(token.id(), None);
let testdata = " \t@startuml \t\n";
let (rest, (parsed, StartLine { token })) = StartLine::parse(testdata.into())?;
assert_eq!(rest, "");
assert_eq!(testdata, parsed.join(""));
assert_eq!(token.diagram_kind(), "uml");
assert_eq!(token.id(), None);
let testdata = " \t@startuml id_foo\t\n";
let (rest, (parsed, StartLine { token })) = StartLine::parse(testdata.into())?;
assert_eq!(rest, "");
assert_eq!(testdata, parsed.join(""));
assert_eq!(token.diagram_kind(), "uml");
assert_eq!(token.id(), Some("id_foo"));
let testdata = " \t@startuml(id=id_bar)\t\n";
let (rest, (parsed, token)) = StartLine::parse(testdata.into())?;
assert_eq!(rest, "");
assert_eq!(testdata, parsed.join(""));
assert_eq!(token.diagram_kind(), "uml");
assert_eq!(token.id(), Some("id_bar"));
Ok(())
}
}