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#[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#[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}