alopex_cli/output/
formatter.rs1use std::io::Write;
6
7use crate::cli::OutputFormat;
8use crate::error::Result;
9use crate::models::{Column, Row};
10
11use super::csv::CsvFormatter;
12use super::json::JsonFormatter;
13use super::jsonl::JsonlFormatter;
14use super::table::TableFormatter;
15use super::tsv::TsvFormatter;
16
17pub trait Formatter: Send + Sync {
21 fn write_header(&mut self, writer: &mut dyn Write, columns: &[Column]) -> Result<()>;
26
27 fn write_row(&mut self, writer: &mut dyn Write, row: &Row) -> Result<()>;
29
30 fn write_footer(&mut self, writer: &mut dyn Write) -> Result<()>;
34
35 fn supports_streaming(&self) -> bool;
40}
41
42pub fn create_formatter(format: OutputFormat) -> Box<dyn Formatter> {
44 match format {
45 OutputFormat::Table => Box::new(TableFormatter::new()),
46 OutputFormat::Json => Box::new(JsonFormatter::new()),
47 OutputFormat::Jsonl => Box::new(JsonlFormatter::new()),
48 OutputFormat::Csv => Box::new(CsvFormatter::new()),
49 OutputFormat::Tsv => Box::new(TsvFormatter::new()),
50 }
51}
52
53#[cfg(test)]
54mod tests {
55 use super::*;
56
57 #[test]
58 fn test_create_formatter_table() {
59 let formatter = create_formatter(OutputFormat::Table);
60 assert!(!formatter.supports_streaming());
61 }
62
63 #[test]
64 fn test_create_formatter_json() {
65 let formatter = create_formatter(OutputFormat::Json);
66 assert!(formatter.supports_streaming());
67 }
68
69 #[test]
70 fn test_create_formatter_jsonl() {
71 let formatter = create_formatter(OutputFormat::Jsonl);
72 assert!(formatter.supports_streaming());
73 }
74
75 #[test]
76 fn test_create_formatter_csv() {
77 let formatter = create_formatter(OutputFormat::Csv);
78 assert!(formatter.supports_streaming());
79 }
80
81 #[test]
82 fn test_create_formatter_tsv() {
83 let formatter = create_formatter(OutputFormat::Tsv);
84 assert!(formatter.supports_streaming());
85 }
86}