diff --git a/src/cli/cli.rs b/src/cli/cli.rs index d00a773..202dfdf 100644 --- a/src/cli/cli.rs +++ b/src/cli/cli.rs @@ -20,4 +20,8 @@ pub enum Commands { #[arg(short = 's', long = "search")] search: Option, }, + Schema { + #[arg(short = 's', long = "search")] + search: Option, + } } diff --git a/src/entity/mod.rs b/src/entity/mod.rs index cefeec6..1b2defe 100644 --- a/src/entity/mod.rs +++ b/src/entity/mod.rs @@ -1 +1,2 @@ pub mod merchant; +pub mod schema; diff --git a/src/entity/schema.rs b/src/entity/schema.rs new file mode 100644 index 0000000..99bf0dd --- /dev/null +++ b/src/entity/schema.rs @@ -0,0 +1,8 @@ + +#[derive(Debug, PartialEq, Eq)] +pub struct Schema { + pub table_name: String, + pub column_name: String, + pub column_type: String, +} + diff --git a/src/main.rs b/src/main.rs index dc0afb3..54248cb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,12 +2,13 @@ use clap::Parser; use cli::cli::{Cli, Commands}; use database::database::Db; use mysql::PooledConn; -use repository::merchant_repo; +use service::{merchant_service, schema_service}; pub mod cli; pub mod database; pub mod entity; pub mod repository; +pub mod service; fn main() -> std::result::Result<(), Box> { let args = Cli::parse(); @@ -16,12 +17,11 @@ fn main() -> std::result::Result<(), Box> { match args.mode { Commands::Merch { search } => { - let selected_payments = merchant_repo::find_by_name_or_id(&search.unwrap(), &mut conn); - - selected_payments.into_iter().for_each(|payment| { - println!("{:?}", payment); - }); + merchant_service::get_merchant(&search.unwrap(), &mut conn); } + Commands::Schema { search } => { + schema_service::get_columns(&search.unwrap(), &mut conn) + }, } Ok(()) diff --git a/src/repository/mod.rs b/src/repository/mod.rs index 892b2c6..35bd01c 100644 --- a/src/repository/mod.rs +++ b/src/repository/mod.rs @@ -1 +1,2 @@ pub mod merchant_repo; +pub mod schema_repo; diff --git a/src/repository/schema_repo.rs b/src/repository/schema_repo.rs new file mode 100644 index 0000000..774cbeb --- /dev/null +++ b/src/repository/schema_repo.rs @@ -0,0 +1,22 @@ +use mysql::{params, prelude::Queryable, PooledConn}; + +use crate::entity::schema::Schema; + +pub fn find_by_column( + column_name: &str, + conn: &mut PooledConn, +) -> Result, mysql::Error> { + let stat = conn + .prep("SELECT TABLE_NAME, COLUMN_NAME, COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE column_name LIKE :c_name") + .unwrap(); + + conn.exec_map( + stat, + params! {"c_name" => column_name}, + |(table_name, column_name, column_type)| Schema { + table_name, + column_name, + column_type, + }, + ) +} diff --git a/src/service/merchant_service.rs b/src/service/merchant_service.rs new file mode 100644 index 0000000..a669361 --- /dev/null +++ b/src/service/merchant_service.rs @@ -0,0 +1,19 @@ +use mysql::PooledConn; + +use crate::repository::merchant_repo; + +pub fn get_merchant(search: &str, conn: &mut PooledConn) { + let merchants = merchant_repo::find_by_name_or_id(search, conn); + + match merchants { + Ok(merchants) => { + if merchants.is_empty() { + println!("Merchant not found!"); + } + merchants.into_iter().for_each(|merchant| { + println!("Merchant: {}", merchant.m_name); + }) + } + Err(err) => panic!("{}", err), + }; +} diff --git a/src/service/mod.rs b/src/service/mod.rs new file mode 100644 index 0000000..2e03769 --- /dev/null +++ b/src/service/mod.rs @@ -0,0 +1,2 @@ +pub mod merchant_service; +pub mod schema_service; diff --git a/src/service/schema_service.rs b/src/service/schema_service.rs new file mode 100644 index 0000000..3dfb171 --- /dev/null +++ b/src/service/schema_service.rs @@ -0,0 +1,23 @@ +use mysql::PooledConn; + +use crate::repository::schema_repo; + + +pub fn get_columns(column: &str, conn: &mut PooledConn) { + let columns = schema_repo::find_by_column(column, conn); + + match columns { + Ok(columns) => { + if columns.is_empty() { + println!("No column found!"); + } + columns.into_iter().for_each(|column| { + println!("{}", "-".repeat(100)); + println!("Table name: {}", column.table_name); + println!("Column name: {}", column.column_name); + println!("Type: {}", column.column_type); + }) + }, + Err(err) => panic!("{err}"), + } +}