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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
use serde_json::Value;
use std::error::Error;
fn convert_object(
json: &str,
deliminator: char,
with_headers: bool,
) -> Result<String, Box<dyn Error>> {
let mut headers = String::new();
let mut buffer = String::new();
let object: Value = serde_json::from_str(&json)?;
let map = object.as_object().unwrap();
if with_headers {
for (x, _) in map {
headers.push_str(x);
headers.push(deliminator);
}
headers = headers[..headers.len() - 1].parse()?;
buffer.push_str(&headers);
buffer.push('\n');
}
for (_, y) in map {
buffer.push_str(y.as_str().unwrap_or(""));
buffer.push(deliminator);
}
buffer = buffer[..buffer.len() - 1].parse()?;
buffer.push('\n');
Ok(buffer)
}
#[cfg(test)]
mod tests {
use crate::convert_object;
use std::fs::read_to_string;
#[test]
fn one_object() {
assert_eq!(
convert_object(r#"{"name":"tom","age":"23","dob":"07/22/1989"}"#, ',', true).unwrap(),
("age,dob,name\n23,07/22/1989,tom\n")
);
}
#[test]
fn without_headers() {
assert_eq!(
convert_object(
r#"{"name":"tom","age":"23","dob":"07/22/1989"}"#,
',',
false
)
.unwrap(),
"23,07/22/1989,tom\n"
);
}
#[test]
fn json_doc() {
let in_buffer = read_to_string("test").unwrap();
println!("{}", convert_object(&in_buffer, '|', true).unwrap());
}
#[test]
fn bad_data() {
assert_eq!(
convert_object("{asdfasdf,{adsf}}sdf}", ',', true).unwrap(),
"should fail"
);
}
}