json_position_parser/
lib.rs1mod 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
10pub 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
37pub 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}