Skip to main content

krait/output/
mod.rs

1pub mod compact;
2pub mod human;
3pub mod json;
4
5use crate::cli::OutputFormat;
6use crate::commands::search::SearchOutput;
7use crate::protocol::Response;
8
9/// Format a response according to the selected output format.
10#[must_use]
11pub fn format_response(response: &Response, format: OutputFormat) -> String {
12    match format {
13        OutputFormat::Compact => compact::format(response),
14        OutputFormat::Json => json::format(response),
15        OutputFormat::Human => human::format(response),
16    }
17}
18
19/// Format search output according to the selected format.
20#[must_use]
21pub fn format_search(
22    output: &SearchOutput,
23    format: OutputFormat,
24    with_context: bool,
25    files_only: bool,
26) -> String {
27    match format {
28        OutputFormat::Json => serde_json::to_string_pretty(output).unwrap_or_default(),
29        _ => compact::format_search(output, with_context, files_only),
30    }
31}
32
33#[cfg(test)]
34mod tests {
35    use serde_json::json;
36
37    use super::*;
38    use crate::protocol::Response;
39
40    #[test]
41    fn format_flag_dispatches_correctly() {
42        let resp = Response::ok(json!({"daemon": {"pid": 1, "uptime_secs": 0}}));
43
44        let compact_out = format_response(&resp, OutputFormat::Compact);
45        assert!(compact_out.starts_with("daemon:"));
46
47        let json_out = format_response(&resp, OutputFormat::Json);
48        assert!(json_out.starts_with('{'));
49
50        let human_out = format_response(&resp, OutputFormat::Human);
51        assert!(human_out.starts_with("Daemon Status"));
52    }
53
54    #[test]
55    fn error_response_formatting_all_formats() {
56        let resp = Response::err_with_advice("test_err", "Something failed", "Try again");
57
58        let compact = format_response(&resp, OutputFormat::Compact);
59        assert!(compact.contains("error:"));
60        assert!(compact.contains("advice:"));
61
62        let json_out = format_response(&resp, OutputFormat::Json);
63        let parsed: serde_json::Value = serde_json::from_str(&json_out).unwrap();
64        assert_eq!(parsed["code"], "test_err");
65
66        let human = format_response(&resp, OutputFormat::Human);
67        assert!(human.contains("Error:"));
68        assert!(human.contains("Advice:"));
69    }
70}