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}