use std::path::Path;
use crate::core::{Core, failed};
use crate::event::Event;
use crate::failure::FailureCode;
use crate::port::DriverCapabilities;
use crate::schema::TableDef;
impl Core {
pub(crate) fn import_file(&mut self, source: &Path, table: &str) -> Vec<Event> {
let Some(db) = self.state.database.as_ref() else {
return failed(
FailureCode::NoDatabase,
"no database is open — open a database first",
);
};
if !db.capabilities.create_table {
return failed(
FailureCode::Capability(crate::availability::DisabledReason::CreateTables),
DriverCapabilities::unsupported(&db.driver, "create tables for this source"),
);
}
if !db.capabilities.write_rows {
return failed(
FailureCode::Capability(crate::availability::DisabledReason::WriteRows),
DriverCapabilities::unsupported(&db.driver, "write rows for this source"),
);
}
if table.trim().is_empty() {
return failed(FailureCode::InvalidInput, "the target table name is empty");
}
let parsed = match crate::import::read_csv_file(source) {
Ok(parsed) => parsed,
Err(reason) => {
return failed(FailureCode::Io, format!("{}: {reason}", source.display()));
}
};
let definition = TableDef::new(table.to_owned(), parsed.fields.clone());
let mut events = self.create_table(definition);
if events
.iter()
.any(|event| matches!(event, Event::Failed { .. }))
{
return events;
}
for (index, cells) in parsed.rows.iter().enumerate() {
match crate::row_edit::row_values(&parsed.fields, cells) {
Ok(values) => events.extend(self.insert_row(table, &values)),
Err(reason) => {
events.extend(failed(
FailureCode::InvalidInput,
format!("row {}: {reason}", index + 1),
));
return events;
}
}
}
self.state.import_window_open = false;
self.state.import_preview = None;
events
}
pub(crate) fn preview_import_file(&mut self, source: &Path) -> Vec<Event> {
if self.state.database.is_none() {
return failed(
FailureCode::NoDatabase,
"no database is open — open a database first",
);
}
let parsed = match crate::import::read_csv_file(source) {
Ok(parsed) => parsed,
Err(reason) => {
self.state.import_preview = None;
return failed(FailureCode::Io, format!("{}: {reason}", source.display()));
}
};
let table = source.file_stem().map_or_else(
|| "imported".to_owned(),
|stem| stem.to_string_lossy().into_owned(),
);
let total_rows = parsed.rows.len();
self.state.import_preview = Some(crate::import::ImportPreview {
table,
fields: parsed.fields,
rows: parsed
.rows
.into_iter()
.take(crate::import::PREVIEW_ROWS)
.collect(),
total_rows,
});
Vec::new()
}
}