json_position_parser/
lib.rs

1mod parser;
2pub mod tree;
3pub mod types;
4use parser::{parse, tokenize};
5use std::fs;
6use tree::Tree;
7use tokenize::TokenType;
8use types::{ParseError, ParseResult};
9
10/// Parse a json text:
11///
12/// **Example**
13/// ```
14/// let text = "{ \"foo\": \"bar\" }";
15/// match parse_json(&text) {
16///     Ok(tree) => println!("{:?}", tree),
17///     Err(e) => println!("{:?}", e),
18/// };
19/// ```
20pub fn parse_json(text: &str) -> ParseResult<Tree> {
21    tokenize::tokenize(&text)
22        .map(|tokens| tokens)
23        .and_then(|tokens| {
24
25            let filtered_tokens: Vec<TokenType> = tokens.into_iter().filter(|e| {
26                if let TokenType::Comment(_,_) = e {
27                    return false;
28                }
29        
30                true
31            }).collect();
32            
33            parse::parse_json(&filtered_tokens[..])
34        })
35}
36
37/// Parse a json file:
38///
39/// **Example**
40/// ```
41/// let file_name = "foo.json";
42/// match parse_json_file(&file_name) {
43///     Ok(tree) => println!("{:?}", tree),
44///     Err(e) => println!("{:?}", e),
45/// };
46/// ```
47pub fn parse_json_file(file_path: &str) -> ParseResult<Tree> {
48    match fs::read_to_string(file_path) {
49        Ok(text) => parse_json(&text),
50        Err(_) => Err(ParseError::FileNotFound),
51    }
52}
53
54#[cfg(test)]
55mod tests {
56    use super::tree::{EntryType, PathType};
57    #[test]
58    fn test_parse() {
59        let json = "// hulu \n {\"a/b\": {},\n//haha\n \"a\": {}, \"b\": { \"c\": [true, { \"e\": 42 } ] } }\n // hello";
60        match super::parse_json(json) {
61            Ok(tree) => {
62                let res = tree.value_at(&[PathType::Object("a")]);
63                let entry = res.get(0).unwrap();
64                match (*(*entry)).entry_type {
65                    EntryType::JSONObject(_) => println!("Correct entry"),
66                    _ => panic!("Should be object"),
67                }
68
69                let res = tree.value_at(&[
70                    PathType::Object("b"),
71                    PathType::Object("c"),
72                    PathType::Array(1),
73                    PathType::Object("e"),
74                ]);
75                let entry = res.get(0).unwrap();
76                match (*(*entry)).entry_type {
77                    EntryType::Int(val) => assert_eq!(42, val),
78                    _ => panic!("Should be number"),
79                }
80
81                let res = tree.value_at(&[
82                    PathType::Wildcard,
83                    PathType::Object("c"),
84                    PathType::Array(0),
85                ]);
86                let entry = res.get(0).unwrap();
87                match (*(*entry)).entry_type {
88                    EntryType::Bool(val) => assert_eq!(true, val),
89                    _ => panic!("Should be bool"),
90                }
91
92                let res = tree.value_at(&[
93                    PathType::RecursiveWildcard,
94                    PathType::Array(1),
95                    PathType::Object("e"),
96                ]);
97                let entry = res.get(0).unwrap();
98                match (*(*entry)).entry_type {
99                    EntryType::Int(val) => assert_eq!(42, val),
100                    _ => panic!("Should be number"),
101                }
102
103                let res = tree.value_at(&[
104                    PathType::Wildcard,
105                    PathType::Object("c"),
106                    PathType::Array(1),
107                    PathType::Object("e"),
108                ]);
109                let entry = res.get(0).unwrap();
110                match (*(*entry)).entry_type {
111                    EntryType::Int(val) => assert_eq!(42, val),
112                    _ => panic!("Should be number"),
113                }
114            }
115            Err(_) => panic!("Could not parse json."),
116        }
117    }
118}