1mod buffer;
2mod parser;
3mod scanner;
4mod value;
5
6use parser::Parser;
7use std::fs::File;
8pub use value::{JSONError, JSONValue};
9
10#[derive(Debug)]
11pub struct JSONDocument {
12 pub value: Option<JSONValue>,
13}
14
15impl JSONDocument {
16 pub fn new() -> JSONDocument {
17 JSONDocument { value: None }
18 }
19
20 pub fn parse_string(&mut self, content: String) -> Result<JSONValue, JSONError> {
21 let mut parser = Parser::from_string(&content);
22 match parser.parse() {
23 Ok(p) => {
24 self.value = Some(p.clone());
25 Ok(p)
26 }
27 Err(e) => Err(e),
28 }
29 }
30
31 pub fn parse_file(&mut self, file: File) -> Result<JSONValue, JSONError> {
32 let mut parser = Parser::from_file(file);
33 match parser.parse() {
34 Ok(p) => {
35 self.value = Some(p.clone());
36 Ok(p)
37 }
38 Err(e) => Err(e),
39 }
40 }
41
42 pub fn to_string(&mut self) -> Result<String, JSONError> {
43 match &self.value {
44 Some(v) => Ok(v.to_string()),
45 None => Ok(String::from("null")),
46 }
47 }
48
49 pub fn pretify(&mut self) -> String {
50 "null".to_string()
51 }
56}
57
58#[cfg(test)]
59mod tests {
60 use super::*;
61
62 #[test]
63 fn library_string_interface() {
64 let mut doc = JSONDocument::new();
65 assert!(doc.parse_string("test".to_string()).is_err());
66 }
67
68 #[test]
69 fn library_file_interface() {
70 let mut doc = JSONDocument::new();
71 let file = File::open("fixtures/sample.json").unwrap();
72 assert!(doc.parse_file(file).is_ok());
73 }
76
77 #[test]
78 fn single_value() {
79 let mut doc = JSONDocument::new();
80
81 let v = doc.parse_string("null".to_string()).unwrap();
83 assert_eq!(v, JSONValue::Null);
84
85 let v = doc.parse_string("12.03e+3".to_string()).unwrap();
87 assert_eq!(v, JSONValue::Number(12030f64));
88
89 let v = doc.parse_string("false".to_string()).unwrap();
91 assert_eq!(v, JSONValue::Boolean(false));
92
93 let v = doc.parse_string("true".to_string()).unwrap();
95 assert_eq!(v, JSONValue::Boolean(true));
96
97 let v = doc.parse_string("\"jhon\"".to_string()).unwrap();
99 assert_eq!(v, JSONValue::String("jhon".to_string()));
100 }
101}