1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
mod indent;

use std::{fs::File, io::BufReader};

pub use anyhow::Result;
use indent::Indent;
use serde::Serialize;
pub use serde_json::Value;
use serde_json::{from_reader, ser::PrettyFormatter, to_writer_pretty, Serializer};

mod tests;
#[allow(dead_code)]
pub fn get_keys(json: Value) -> Vec<String> {
    let mut keys = Vec::new();
    if let Value::Object(map) = json {
        for key in map.keys() {
            keys.push(key.to_owned());
        }
    }
    keys
}

#[allow(dead_code)]
pub fn get_values(json: Value) -> Vec<Value> {
    let mut values = Vec::new();
    if let Value::Object(map) = json {
        for value in map.values() {
            values.push(value.to_owned());
        }
    }
    values
}

#[allow(dead_code)]
pub fn get_map(json: Value) -> Vec<(String, Value)> {
    let mut map = Vec::new();
    if let Value::Object(m) = json {
        for (key, value) in m {
            map.push((key.to_owned(), value.to_owned()));
        }
    }
    map
}

#[allow(dead_code)]
pub fn read_json(path: &str) -> Result<Value> {
    let json_reader = BufReader::new(File::open(path)?);
    Ok(from_reader(json_reader)?)
}

#[allow(dead_code)]
pub fn write_json(path: &str, json: &Value, indent: Indent) -> Result<()> {
    let file = File::create(path)?;
    let indent = indent.to_indent().to_string();
    let fmt = PrettyFormatter::with_indent(indent.as_bytes());
    let mut buf = Vec::new();
    let mut ser = Serializer::with_formatter(&mut buf, fmt);
    json.serialize(&mut ser)?;
    Ok(to_writer_pretty(file, &json)?)
}