indodax_cli/output/
json.rs1use super::CommandOutput;
2
3pub fn render(output: &CommandOutput) -> String {
4 let mut envelope = serde_json::json!({
5 "success": true,
6 "data": output.data,
7 });
8 if let Some(ref addendum) = output.addendum {
9 envelope["addendum"] = serde_json::Value::String(addendum.clone());
10 }
11 serde_json::to_string_pretty(&envelope).unwrap_or_else(|_| "{}".into())
12}
13
14#[cfg(test)]
15mod tests {
16 use super::*;
17 use serde_json::json;
18
19 #[test]
20 fn test_render_simple_object() {
21 let output = CommandOutput {
22 data: json!({"key": "value"}),
23 headers: vec![],
24 rows: vec![],
25 format: super::super::OutputFormat::Json,
26 addendum: None,
27 };
28
29 let rendered = render(&output);
30 let parsed: serde_json::Value = serde_json::from_str(&rendered).unwrap();
31 assert_eq!(parsed["data"]["key"], "value");
32 }
33
34 #[test]
35 fn test_render_nested_object() {
36 let output = CommandOutput {
37 data: json!({"nested": {"a": 1, "b": 2}}),
38 headers: vec![],
39 rows: vec![],
40 format: super::super::OutputFormat::Json,
41 addendum: None,
42 };
43
44 let rendered = render(&output);
45 let parsed: serde_json::Value = serde_json::from_str(&rendered).unwrap();
46 assert_eq!(parsed["data"]["nested"]["a"], 1);
47 assert_eq!(parsed["data"]["nested"]["b"], 2);
48 }
49
50 #[test]
51 fn test_render_array() {
52 let output = CommandOutput {
53 data: json!([1, 2, 3]),
54 headers: vec![],
55 rows: vec![],
56 format: super::super::OutputFormat::Json,
57 addendum: None,
58 };
59
60 let rendered = render(&output);
61 let parsed: serde_json::Value = serde_json::from_str(&rendered).unwrap();
62 assert_eq!(parsed["data"][0], 1);
63 assert_eq!(parsed["data"][1], 2);
64 assert_eq!(parsed["data"][2], 3);
65 }
66
67 #[test]
68 fn test_render_empty_object() {
69 let output = CommandOutput {
70 data: json!({}),
71 headers: vec![],
72 rows: vec![],
73 format: super::super::OutputFormat::Json,
74 addendum: None,
75 };
76
77 let rendered = render(&output);
78 let parsed: serde_json::Value = serde_json::from_str(&rendered).unwrap();
79 assert_eq!(parsed["data"], json!({}));
80 }
81
82 #[test]
83 fn test_render_null() {
84 let output = CommandOutput {
85 data: json!(null),
86 headers: vec![],
87 rows: vec![],
88 format: super::super::OutputFormat::Json,
89 addendum: None,
90 };
91
92 let rendered = render(&output);
93 let parsed: serde_json::Value = serde_json::from_str(&rendered).unwrap();
94 assert!(parsed["data"].is_null());
95 }
96
97 #[test]
98 fn test_render_with_special_chars() {
99 let output = CommandOutput {
100 data: json!({"msg": "hello\nworld\t!"}),
101 headers: vec![],
102 rows: vec![],
103 format: super::super::OutputFormat::Json,
104 addendum: None,
105 };
106
107 let rendered = render(&output);
108 let parsed: serde_json::Value = serde_json::from_str(&rendered).unwrap();
109 assert_eq!(parsed["data"]["msg"], "hello\nworld\t!");
110 }
111
112 #[test]
113 fn test_render_with_addendum() {
114 let output = CommandOutput {
115 data: json!({"key": "value"}),
116 headers: vec![],
117 rows: vec![],
118 format: super::super::OutputFormat::Json,
119 addendum: Some("Extra message".into()),
120 };
121
122 let rendered = render(&output);
123 let parsed: serde_json::Value = serde_json::from_str(&rendered).unwrap();
124 assert_eq!(parsed["data"]["key"], "value");
125 assert_eq!(parsed["addendum"], "Extra message");
126 }
127}