From 21aaff25f4ed31889684d6a85d1600d28f32e632 Mon Sep 17 00:00:00 2001 From: davidemazzocchi Date: Sat, 4 Oct 2025 06:42:48 +0200 Subject: [PATCH] feat: add error handling for database initialization --- 01.workspace/heave/src/fun/sqlite_init_db.rs | 15 ++++++++------- 01.workspace/heave/src/lib.rs | 1 + 01.workspace/heave/src/str/catalog.rs | 5 +++-- 01.workspace/heave/src/str/failed_to.rs | 6 ++++++ 01.workspace/heave/src/str/mod.rs | 1 + 5 files changed, 19 insertions(+), 9 deletions(-) create mode 100644 01.workspace/heave/src/str/failed_to.rs diff --git a/01.workspace/heave/src/fun/sqlite_init_db.rs b/01.workspace/heave/src/fun/sqlite_init_db.rs index 42ca808..7e4360d 100644 --- a/01.workspace/heave/src/fun/sqlite_init_db.rs +++ b/01.workspace/heave/src/fun/sqlite_init_db.rs @@ -1,7 +1,7 @@ use crate::*; use rusqlite::*; -pub fn run(path: &path::Path) { +pub fn run(path: &path::Path) -> result::Result<(), FailedTo> { let init_statement = r#" CREATE TABLE IF NOT EXISTS entity ( id TEXT PRIMARY KEY, @@ -22,11 +22,11 @@ pub fn run(path: &path::Path) { CREATE INDEX IF NOT EXISTS entity_class ON entity (class); CREATE INDEX IF NOT EXISTS attribute_id ON attribute (id); "#; - let connection = Connection::open(path).unwrap(); - let _result = connection.execute_batch(init_statement); - if _result.is_err() { - panic!(); - } + let connection = Connection::open(path).map_err(|_| FailedTo::OpenSQLiteConnection)?; + connection + .execute_batch(init_statement) + .map_err(|_| FailedTo::ExecuteSQLiteBatch)?; + Ok(()) } #[cfg(test)] @@ -36,6 +36,7 @@ mod unit_tests { fn test_call() { let tempfile = tempfile::NamedTempFile::new().unwrap(); let path = tempfile.path(); - run(path); + let result = run(path); + assert!(result.is_ok()); } } diff --git a/01.workspace/heave/src/lib.rs b/01.workspace/heave/src/lib.rs index 35a3975..47219cc 100644 --- a/01.workspace/heave/src/lib.rs +++ b/01.workspace/heave/src/lib.rs @@ -11,6 +11,7 @@ pub use crate::str::attribute::O as Attribute; pub use crate::str::catalog::O as Catalog; pub use crate::str::entity::O as Entity; pub use crate::str::entity_state::E as EntityState; +pub use crate::str::failed_to::E as FailedTo; pub use crate::str::value::E as Value; pub use crate::trt::eav::T as EAV; diff --git a/01.workspace/heave/src/str/catalog.rs b/01.workspace/heave/src/str/catalog.rs index 3e278e9..d9ea673 100644 --- a/01.workspace/heave/src/str/catalog.rs +++ b/01.workspace/heave/src/str/catalog.rs @@ -24,9 +24,10 @@ impl O { } /// Initializes the database. - pub fn init(&self) { + pub fn init(&self) -> result::Result<(), FailedTo> { let path = path::Path::new(&self.path); - sqlite::init::db(path); + sqlite::init::db(path).map_err(|_| FailedTo::InitDatabase)?; + Ok(()) } /// Inserts a single object that implements the `EAV` trait into the catalog. diff --git a/01.workspace/heave/src/str/failed_to.rs b/01.workspace/heave/src/str/failed_to.rs new file mode 100644 index 0000000..06e4074 --- /dev/null +++ b/01.workspace/heave/src/str/failed_to.rs @@ -0,0 +1,6 @@ +#[derive(Debug, PartialEq, PartialOrd, Eq, Ord, Clone, Copy, Hash)] +pub enum E { + ExecuteSQLiteBatch, + InitDatabase, + OpenSQLiteConnection, +} diff --git a/01.workspace/heave/src/str/mod.rs b/01.workspace/heave/src/str/mod.rs index 1a1a6e5..b46553f 100644 --- a/01.workspace/heave/src/str/mod.rs +++ b/01.workspace/heave/src/str/mod.rs @@ -2,4 +2,5 @@ pub mod attribute; pub mod catalog; pub mod entity; pub mod entity_state; +pub mod failed_to; pub mod value;