Skip to main content

indodax_cli/output/
json.rs

1use 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}