use crate::data::data_exporter::DataExporter;
use crate::data::data_provider::DataProvider;
use anyhow::Result;
pub trait ExportBehavior {
fn get_data_provider(&self) -> Option<Box<dyn DataProvider>>;
fn export_to_csv(&mut self) -> Result<String> {
if let Some(provider) = self.get_data_provider() {
DataExporter::export_provider_to_csv(provider.as_ref())
} else {
Err(anyhow::anyhow!("No data available to export"))
}
}
fn export_to_json(&mut self) -> Result<String> {
if let Some(provider) = self.get_data_provider() {
DataExporter::export_provider_to_json(provider.as_ref())
} else {
Err(anyhow::anyhow!("No data available to export"))
}
}
fn export_to_format(&mut self, format: ExportFormat) -> Result<String> {
match format {
ExportFormat::Csv => self.export_to_csv(),
ExportFormat::Json => self.export_to_json(),
ExportFormat::Tsv => {
Err(anyhow::anyhow!("TSV export not yet implemented"))
}
ExportFormat::Markdown => {
Err(anyhow::anyhow!("Markdown export not yet implemented"))
}
ExportFormat::Html => {
Err(anyhow::anyhow!("HTML export not yet implemented"))
}
ExportFormat::Sql => {
Err(anyhow::anyhow!("SQL export not yet implemented"))
}
}
}
fn export_selection_to_csv(&mut self) -> Result<String> {
Err(anyhow::anyhow!("Selection export not yet implemented"))
}
fn export_selection_to_json(&mut self) -> Result<String> {
Err(anyhow::anyhow!("Selection export not yet implemented"))
}
fn get_export_filename(&self, extension: &str) -> String {
use chrono::Local;
let timestamp = Local::now().format("%Y%m%d_%H%M%S");
format!("export_{timestamp}.{extension}")
}
fn handle_export_result(&mut self, result: Result<String>);
}
pub enum ExportFormat {
Csv,
Json,
Tsv,
Markdown,
Html,
Sql,
}