my_xml_parser/
lib.rs

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::field, input)?;
23
24
25  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}