use crate::{wr, ParseContainer};
use nom::branch::alt;
use nom::bytes::complete::tag;
use nom::character::complete::{alpha1, line_ending, space0};
use nom::combinator::eof;
use nom::sequence::tuple;
use nom::IResult;
#[derive(Clone, Debug)]
pub struct EndLine {
diagram_kind: ParseContainer,
}
impl EndLine {
pub fn parse(input: ParseContainer) -> IResult<ParseContainer, (Vec<ParseContainer>, Self)> {
let (rest, parsed) = tuple((
wr!(space0),
wr!(tag("@end")),
wr!(alpha1),
wr!(space0),
alt((wr!(eof), wr!(line_ending))),
))(input)?;
let ret0 = Vec::from(<[ParseContainer; 5]>::from(parsed));
let diagram_kind = ret0[2].clone();
let ret1 = Self { diagram_kind };
Ok((rest, (ret0, ret1)))
}
pub fn eq_diagram_kind(&self, diagram_kind: &str) -> bool {
self.diagram_kind == diagram_kind
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_parse_end_line() -> anyhow::Result<()> {
let testdata = "@enduml\n";
let (rest, (parsed, EndLine { diagram_kind })) = EndLine::parse(testdata.into())?;
assert_eq!(rest, "");
assert_eq!(testdata, parsed.join(""));
assert_eq!(diagram_kind, "uml");
let testdata = " \t@enduml\n";
let (rest, (parsed, EndLine { diagram_kind })) = EndLine::parse(testdata.into())?;
assert_eq!(rest, "");
assert_eq!(testdata, parsed.join(""));
assert_eq!(diagram_kind, "uml");
let testdata = "@enduml \t\n";
let (rest, (parsed, EndLine { diagram_kind })) = EndLine::parse(testdata.into())?;
assert_eq!(rest, "");
assert_eq!(testdata, parsed.join(""));
assert_eq!(diagram_kind, "uml");
let testdata = " \t@enduml \t\n";
let (rest, (parsed, EndLine { diagram_kind })) = EndLine::parse(testdata.into())?;
assert_eq!(rest, "");
assert_eq!(testdata, parsed.join(""));
assert_eq!(diagram_kind, "uml");
Ok(())
}
}