sql_cli/ui/behaviors/
export_behavior.rs1use crate::data::data_exporter::DataExporter;
5use crate::data::data_provider::DataProvider;
6use anyhow::Result;
7
8pub trait ExportBehavior {
10    fn get_data_provider(&self) -> Option<Box<dyn DataProvider>>;
12
13    fn export_to_csv(&mut self) -> Result<String> {
15        if let Some(provider) = self.get_data_provider() {
16            DataExporter::export_provider_to_csv(provider.as_ref())
17        } else {
18            Err(anyhow::anyhow!("No data available to export"))
19        }
20    }
21
22    fn export_to_json(&mut self) -> Result<String> {
24        if let Some(provider) = self.get_data_provider() {
25            DataExporter::export_provider_to_json(provider.as_ref())
26        } else {
27            Err(anyhow::anyhow!("No data available to export"))
28        }
29    }
30
31    fn export_to_format(&mut self, format: ExportFormat) -> Result<String> {
33        match format {
34            ExportFormat::Csv => self.export_to_csv(),
35            ExportFormat::Json => self.export_to_json(),
36            ExportFormat::Tsv => {
37                Err(anyhow::anyhow!("TSV export not yet implemented"))
39            }
40            ExportFormat::Markdown => {
41                Err(anyhow::anyhow!("Markdown export not yet implemented"))
43            }
44            ExportFormat::Html => {
45                Err(anyhow::anyhow!("HTML export not yet implemented"))
47            }
48            ExportFormat::Sql => {
49                Err(anyhow::anyhow!("SQL export not yet implemented"))
51            }
52        }
53    }
54
55    fn export_selection_to_csv(&mut self) -> Result<String> {
57        Err(anyhow::anyhow!("Selection export not yet implemented"))
60    }
61
62    fn export_selection_to_json(&mut self) -> Result<String> {
64        Err(anyhow::anyhow!("Selection export not yet implemented"))
66    }
67
68    fn get_export_filename(&self, extension: &str) -> String {
70        use chrono::Local;
71        let timestamp = Local::now().format("%Y%m%d_%H%M%S");
72        format!("export_{timestamp}.{extension}")
73    }
74
75    fn handle_export_result(&mut self, result: Result<String>);
77}
78
79pub enum ExportFormat {
81    Csv,
82    Json,
83    Tsv,
84    Markdown,
85    Html,
86    Sql,
87}