1use pest::Parser;
2use pest_derive::Parser;
3use anyhow::*;
4
5
6#[derive(Parser)]
7#[grammar = "./grammar.pest"]
8pub struct XMLParser;
9pub fn parse_xml(input:&str) -> anyhow::Result <pest::iterators::Pairs<'_, Rule>>{
10
11 let successful_parse = XMLParser::parse(Rule::xml, input)?;
12 Ok(successful_parse)
13
14}
15pub fn parse_field(input:&str) -> anyhow::Result <pest::iterators::Pairs<'_, Rule>>{
16
17 let parse = XMLParser::parse(Rule::field, input)?;
18 Ok(parse)
19
20}
21pub fn parse_text(input:&str) -> anyhow::Result <pest::iterators::Pairs<'_, Rule>>{
22 let parse = XMLParser::parse(Rule::text, input)?;
26 Ok(parse)
27
28}
29#[cfg(test)]
30mod tests {
31 use super::*;
32#[test]
33fn field_test() -> anyhow::Result< ()>{
34 let str ="<>";
35 let field = parse_field(str)?.next().ok_or_else( || anyhow!( "no pair" ) )?;
36 assert_eq!(field.as_str(),"");
37
38 let str ="field";
39 let field = parse_field(str)?.next().ok_or_else( || anyhow!( "no pair" ) );
40 assert_eq!(field?.as_span().end(), str.len());
41
42
43 let str ="<field></field>";
44 let field = parse_field(str)?.next().ok_or_else( || anyhow!( "no pair" ) );
45 assert_eq!(field.is_err(), false);
46 assert_eq!(field?.as_span().end(), str.len());
47
48
49 let str ="<field>fff</field>";
50 let field = parse_field(str)?.next().ok_or_else( || anyhow!( "no pair" ) );
51 assert_eq!(field?.as_span().end(), str.len());
52
53
54 let str ="<field><f></field>";
55 let field = parse_field(str)?.next().ok_or_else( || anyhow!( "no pair" ) );
56 assert_eq!(field?.as_str(),"");
57
58 Ok(())
59}
60
61#[test]
62fn text_without_brackets_test() -> anyhow::Result< ()>{
63 let str ="<>";
64 let field = parse_text(str);
65 assert!(field.is_err());
66
67 let str: &str ="field";
68 let field = parse_text(str)?.next().ok_or_else( || anyhow!( "no pair" ) );
69 assert!(field.is_ok());
70
71 let str ="<field>";
72 let field = parse_text(str);
73 assert!(field.is_err());
74
75 let str ="";
76 let field = parse_text(str);
77 assert!(field.is_err());
78
79 Ok(())
80}
81
82#[test]
83fn xml_test() -> anyhow::Result< ()>{
84 let str ="<r>
85 <a>
86 </a>
87 <b>
88 </b>
89 </r>";
90 let field = parse_xml(str);
91 assert!(field.is_ok());
92 assert_eq!(field?.as_str(),str);
93
94 let str ="";
95 let field = parse_xml(str);
96 assert!(field.is_ok());
97 assert_eq!(field?.as_str(),str);
98
99 let str ="<a></b>";
100 let field = parse_xml(str);
101 assert!(field.is_err());
102
103 let str ="<a></a><a></a>";
104 let field = parse_xml(str);
105 assert!(field.is_err());
106
107 let str ="<r><a>text</a><a></a></r>";
108 let field = parse_xml(str);
109 assert!(field.is_ok());
110 assert_eq!(field?.as_str(),str);
111
112 let str ="<r>text<a></a><a></a></r>";
113 let field = parse_xml(str);
114 assert!(field.is_ok());
115 assert_eq!(field?.as_str(),str);
116
117
118
119
120 Ok(())
121}
122}