From 441ce5c6304141e22a79cf3996f78746d50fb12e Mon Sep 17 00:00:00 2001 From: mace Date: Fri, 7 Mar 2025 18:58:32 +0100 Subject: [PATCH] improve error handling part 4 - added thiserror --- Cargo.lock | 27 ++++++++++++++++++++++++--- Cargo.toml | 1 + src/cli/controller.rs | 16 +++++++++++++--- src/database/db.rs | 8 +++++--- src/main.rs | 3 +-- src/repository/filter_repo.rs | 14 +++++--------- src/repository/job_repo.rs | 16 ++++++---------- src/repository/merchant_repo.rs | 3 +-- src/repository/schema_repo.rs | 3 +-- 9 files changed, 57 insertions(+), 34 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5e976d4..0dc43f7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1089,7 +1089,7 @@ dependencies = [ "sha2", "smallvec", "subprocess", - "thiserror", + "thiserror 1.0.69", "time", "uuid", ] @@ -1358,6 +1358,7 @@ dependencies = [ "mysql", "sprintf", "termsize", + "thiserror 2.0.12", "time", ] @@ -1369,7 +1370,7 @@ checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom", "libredox", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1708,7 +1709,16 @@ version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", ] [[package]] @@ -1722,6 +1732,17 @@ dependencies = [ "syn 2.0.90", ] +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", +] + [[package]] name = "time" version = "0.3.37" diff --git a/Cargo.toml b/Cargo.toml index cde3b13..acdce0e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,4 +15,5 @@ log = "0.4.17" mysql = "23.0.1" sprintf = "0.1.3" termsize = "0.1.6" +thiserror = "2.0.12" time = "0.3.20" diff --git a/src/cli/controller.rs b/src/cli/controller.rs index 7b37f87..dd6de6b 100644 --- a/src/cli/controller.rs +++ b/src/cli/controller.rs @@ -9,15 +9,23 @@ use crate::{ use super::command::{Cli, Commands}; -pub fn process_args(args: Cli, db: Db) { +use thiserror::Error; + +#[derive(Debug, Error)] +enum CommandError { + #[error("Empty search provided.")] + EmptySearch(), +} + +pub fn process_args(args: Cli, db: Db) -> Result<(), Box> { match args.mode { Commands::Merch { search } => { let mut merchant_service: MerchantService = container::get_merchant_service(db); - merchant_service.get_merchant(&search.unwrap()); + merchant_service.get_merchant(&search.ok_or(CommandError::EmptySearch())?); } Commands::Schema { search } => { let mut schema_service: SchemaService = container::get_schema_service(db); - schema_service.get_columns(&search.unwrap()) + schema_service.get_columns(&search.ok_or(CommandError::EmptySearch())?) } Commands::Filter { filter_id, @@ -47,4 +55,6 @@ pub fn process_args(args: Cli, db: Db) { } } } + + Ok(()) } diff --git a/src/database/db.rs b/src/database/db.rs index a5516af..bb5e6d3 100644 --- a/src/database/db.rs +++ b/src/database/db.rs @@ -40,9 +40,11 @@ impl Db { })?; let location: String = env::var("LOCATION").unwrap_or_else(|_| "localhost".to_string()); - let user: String = env::var("USERNAME").unwrap(); + let user: String = env::var("USERNAME") + .map_err(|_| Box::new(InitError("Missing USERNAME in dotenv file.".to_string())))?; let port: String = env::var("PORT").unwrap_or_else(|_| "3306".to_string()); - let password: String = env::var("PASSWORD").unwrap(); + let password: String = env::var("PASSWORD") + .map_err(|_| Box::new(InitError("Missing PASSWORD in dotenv file.".to_string())))?; let db_name: String = env::var("DB").unwrap_or_else(|_| "efulfilment".to_string()); let url: String = format!( "mysql://{}:{}@{}:{}/{}", @@ -58,7 +60,7 @@ impl Db { } pub fn get_connection(&self) -> Result { - let pool = self.pool.lock().unwrap(); + let pool = self.pool.lock()?; pool.get_conn() } } diff --git a/src/main.rs b/src/main.rs index 90cc0f6..6fa0b98 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,7 +15,6 @@ fn main() -> std::result::Result<(), Box> { let env: &String = &Cli::parse().env.unwrap_or("local".to_string()); let db: Db = Db::initialize(env.to_string())?; - controller::process_args(args, db); - + controller::process_args(args, db)?; Ok(()) } diff --git a/src/repository/filter_repo.rs b/src/repository/filter_repo.rs index 4fad865..73e63a0 100644 --- a/src/repository/filter_repo.rs +++ b/src/repository/filter_repo.rs @@ -22,8 +22,7 @@ impl FilterRepo { FROM filter f JOIN global_data.filter_modules fm ON fm.filter_module_id = f.filter_module_id WHERE f.filter_id = :filter_id - ") - .unwrap(); + ")?; let params = params! {"filter_id" => filter_id}; connection.exec_map( @@ -52,8 +51,7 @@ impl FilterRepo { JOIN global_data.effi_user t2 on t1.upd_user = t2.user_id WHERE t1.filter_id = :filter_id ", - ) - .unwrap(); + )?; connection.exec_map( stat, @@ -70,15 +68,13 @@ impl FilterRepo { pub fn find_filter_log(&mut self, filter_id: &usize) -> Result, mysql::Error> { let mut connection: PooledConn = self.db.get_connection()?; - let stat = connection - .prep( - " + let stat = connection.prep( + " SELECT t1.run_ts, t1.error_code, t1.error_msg, t1.mysql_error FROM filter_run_error_log t1 WHERE t1.filter_id = :filter_id ", - ) - .unwrap(); + )?; connection.exec_map( stat, diff --git a/src/repository/job_repo.rs b/src/repository/job_repo.rs index e61dfc0..2a326e9 100644 --- a/src/repository/job_repo.rs +++ b/src/repository/job_repo.rs @@ -17,17 +17,15 @@ impl JobRepo { pub fn find_by_id(&mut self, job_id: &usize) -> Result, mysql::Error> { let mut connection: mysql::PooledConn = self.db.get_connection()?; - let stat = connection - .prep( - "SELECT + let stat = connection.prep( + "SELECT jm.file_name, jm.description FROM jobs j JOIN global_data.job_modules jm ON jm.job_module_id = j.job_module_id WHERE j.job_id = :job_id ", - ) - .unwrap(); + )?; connection.exec_map( stat, @@ -41,9 +39,8 @@ impl JobRepo { pub fn find_log(&mut self, job_id: &usize) -> Result, mysql::Error> { let mut connection: mysql::PooledConn = self.db.get_connection()?; - let stat = connection - .prep( - " + let stat = connection.prep( + " SELECT jea.content, jea.upd_ts FROM jobs j JOIN job_events je on j.job_id = je.job_id AND je.m_id = j.m_id @@ -51,8 +48,7 @@ impl JobRepo { WHERE j.job_id = :job_id ", - ) - .unwrap(); + )?; connection.exec_map(stat, params! {"job_id" => job_id}, |(content, upd_ts)| { JobLog { content, upd_ts } diff --git a/src/repository/merchant_repo.rs b/src/repository/merchant_repo.rs index 5e2e412..fce2450 100644 --- a/src/repository/merchant_repo.rs +++ b/src/repository/merchant_repo.rs @@ -14,8 +14,7 @@ impl MerchantRepo { pub fn find_by_name_or_id(&mut self, search: &str) -> Result, mysql::Error> { let mut connection = self.db_pool.get_connection()?; let stat = connection - .prep("SELECT m_name, m_id FROM global_data.merchant WHERE m_id = :search OR m_name LIKE :search2;") - .unwrap(); + .prep("SELECT m_name, m_id FROM global_data.merchant WHERE m_id = :search OR m_name LIKE :search2;")?; let search_like = format!("%{}%", search); diff --git a/src/repository/schema_repo.rs b/src/repository/schema_repo.rs index 261f5cc..3ba97f1 100644 --- a/src/repository/schema_repo.rs +++ b/src/repository/schema_repo.rs @@ -14,8 +14,7 @@ impl SchemaRepo { pub fn find_by_column(&mut self, column_name: &str) -> Result, mysql::Error> { let mut connection: mysql::PooledConn = self.db.get_connection()?; let stat = connection - .prep("SELECT TABLE_NAME, COLUMN_NAME, COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE column_name LIKE :c_name") - .unwrap(); + .prep("SELECT TABLE_NAME, COLUMN_NAME, COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE column_name LIKE :c_name")?; connection.exec_map( stat,