sql_cli/ui/behaviors/
export_behavior.rs

1// Export behavior for saving data to various formats
2// Handles CSV, JSON, and other export operations
3
4use crate::data::data_exporter::DataExporter;
5use crate::data::data_provider::DataProvider;
6use anyhow::Result;
7
8/// Trait for exporting data to various formats
9pub trait ExportBehavior {
10    // Required methods - provide access to TUI internals
11    fn get_data_provider(&self) -> Option<Box<dyn DataProvider>>;
12
13    /// Export current data to CSV file
14    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    /// Export current data to JSON file
23    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    /// Export current data to a custom format
32    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                // TODO: Implement TSV export
38                Err(anyhow::anyhow!("TSV export not yet implemented"))
39            }
40            ExportFormat::Markdown => {
41                // TODO: Implement Markdown table export
42                Err(anyhow::anyhow!("Markdown export not yet implemented"))
43            }
44            ExportFormat::Html => {
45                // TODO: Implement HTML table export
46                Err(anyhow::anyhow!("HTML export not yet implemented"))
47            }
48            ExportFormat::Sql => {
49                // TODO: Implement SQL INSERT statements export
50                Err(anyhow::anyhow!("SQL export not yet implemented"))
51            }
52        }
53    }
54
55    /// Export selected rows to CSV
56    fn export_selection_to_csv(&mut self) -> Result<String> {
57        // TODO: Implement selection-based export
58        // This would export only the selected rows/columns
59        Err(anyhow::anyhow!("Selection export not yet implemented"))
60    }
61
62    /// Export selected rows to JSON
63    fn export_selection_to_json(&mut self) -> Result<String> {
64        // TODO: Implement selection-based export
65        Err(anyhow::anyhow!("Selection export not yet implemented"))
66    }
67
68    /// Get export filename with timestamp
69    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    /// Handle export result with status message
76    fn handle_export_result(&mut self, result: Result<String>);
77}
78
79/// Export format options
80pub enum ExportFormat {
81    Csv,
82    Json,
83    Tsv,
84    Markdown,
85    Html,
86    Sql,
87}