plantuml_parser/dsl/token/
header.rs1use crate::dsl::token::shared::{Comment, Delimiter};
2use crate::{ParseContainer, ParseResult, wr, wr2};
3use nom::Parser;
4use nom::bytes::complete::tag_no_case;
5
6#[derive(Clone, Debug)]
24pub struct HeaderToken {
25 header: Comment,
26 delimiter: Delimiter,
27}
28
29impl HeaderToken {
30 pub fn parse(input: ParseContainer) -> ParseResult<Self> {
32 let (rest, (header_tag, (delimiter_raw, delimiter), (header_raw, header))) = (
33 wr!(tag_no_case("header")),
34 wr2!(Delimiter::parse),
35 wr2!(Comment::parse),
36 )
37 .parse(input)?;
38
39 let ret0 = ParseContainer::from(vec![header_tag, delimiter_raw, header_raw]);
40 let ret1 = Self { header, delimiter };
41
42 Ok((rest, (ret0, ret1)))
43 }
44
45 pub fn header(&self) -> &str {
47 self.header.as_str()
48 }
49
50 pub fn delimiter(&self) -> Option<&str> {
52 self.delimiter.delimiter()
53 }
54}
55
56#[cfg(test)]
57mod tests {
58 use super::*;
59
60 #[test]
61 fn test_parse() -> anyhow::Result<()> {
62 let testdata = "header EXAMPLE HEADER";
63 let (rest, (parsed, token)) = HeaderToken::parse(testdata.into())?;
64 assert_eq!(rest, "");
65 assert_eq!(testdata, parsed);
66 assert_eq!("EXAMPLE HEADER", token.header());
67
68 let testdata = "header EXAMPLE \t HEADER \t";
69 let (rest, (parsed, token)) = HeaderToken::parse(testdata.into())?;
70 assert_eq!(rest, " \t");
71 assert_eq!("header EXAMPLE \t HEADER", parsed);
72 assert_eq!("EXAMPLE \t HEADER", token.header());
73
74 Ok(())
75 }
76
77 #[test]
78 fn test_parse_case_insensitive() -> anyhow::Result<()> {
79 let testdata = "Header EXAMPLE HEADER";
80 let (rest, (parsed, token)) = HeaderToken::parse(testdata.into())?;
81 assert_eq!(rest, "");
82 assert_eq!(testdata, parsed);
83 assert_eq!("EXAMPLE HEADER", token.header());
84
85 let testdata = "HEADER EXAMPLE HEADER";
86 let (rest, (parsed, token)) = HeaderToken::parse(testdata.into())?;
87 assert_eq!(rest, "");
88 assert_eq!(testdata, parsed);
89 assert_eq!("EXAMPLE HEADER", token.header());
90
91 let testdata = "heAder EXAMPLE HEADER";
92 let (rest, (parsed, token)) = HeaderToken::parse(testdata.into())?;
93 assert_eq!(rest, "");
94 assert_eq!(testdata, parsed);
95 assert_eq!("EXAMPLE HEADER", token.header());
96
97 Ok(())
98 }
99
100 #[test]
101 fn test_parse_with_delimiter() -> anyhow::Result<()> {
102 let testdata = "header : EXAMPLE HEADER";
103 let (rest, (parsed, token)) = HeaderToken::parse(testdata.into())?;
104 assert_eq!(rest, "");
105 assert_eq!(testdata, parsed);
106 assert_eq!("EXAMPLE HEADER", token.header());
107
108 let testdata = "header: \tEXAMPLE HEADER";
109 let (rest, (parsed, token)) = HeaderToken::parse(testdata.into())?;
110 assert_eq!(rest, "");
111 assert_eq!(testdata, parsed);
112 assert_eq!("EXAMPLE HEADER", token.header());
113
114 let testdata = "header\t :EXAMPLE HEADER";
115 let (rest, (parsed, token)) = HeaderToken::parse(testdata.into())?;
116 assert_eq!(rest, "");
117 assert_eq!(testdata, parsed);
118 assert_eq!("EXAMPLE HEADER", token.header());
119
120 let testdata = "header:EXAMPLE HEADER";
121 let (rest, (parsed, token)) = HeaderToken::parse(testdata.into())?;
122 assert_eq!(rest, "");
123 assert_eq!(testdata, parsed);
124 assert_eq!("EXAMPLE HEADER", token.header());
125
126 Ok(())
127 }
128}