diff --git a/Cargo.lock b/Cargo.lock index 443a9cf..3871454 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1393,6 +1393,7 @@ dependencies = [ "sqlx", "thiserror", "tokio", + "url", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 9dd378a..58f7a68 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,3 +16,4 @@ sqlx = { version = "0.8", features = [ ] } thiserror = "2.0.11" tokio = { version = "1.43.0", features = ["full"] } +url = "2.5.4" diff --git a/src/bin/cli/main.rs b/src/bin/cli/main.rs index f52bf1f..106a077 100644 --- a/src/bin/cli/main.rs +++ b/src/bin/cli/main.rs @@ -1,9 +1,11 @@ -#![allow(dead_code, unused)] +#![allow(unused)] +#![allow(dead_code)] use clap::{Parser, Subcommand}; use simple_crud::error::Error; use simple_crud::error::Result; use simple_crud::sql; +use simple_crud::sql::Database; #[derive(Parser)] #[command(version, about, long_about = None)] diff --git a/src/error.rs b/src/error.rs index 5f2ad4f..7dccfd7 100644 --- a/src/error.rs +++ b/src/error.rs @@ -14,6 +14,9 @@ pub enum Error { #[error("Error in runtime execution: {0}")] Runtime(&'static str), + #[error(transparent)] + ParseError(#[from] url::ParseError), + #[error("Error parsing database column type: {0}")] ColumnParse(String), diff --git a/src/sql.rs b/src/sql.rs index 394ba2f..3d5fc90 100644 --- a/src/sql.rs +++ b/src/sql.rs @@ -1,9 +1,28 @@ -use crate::error::Result; +use clap::ValueEnum; +use url::Url; + +use crate::error::{Error, Result}; mod postgres; +#[derive(ValueEnum, Clone)] +pub enum Database { + Postgres, +} + pub async fn handle_query(url: String, query: &String) -> Result<()> { - let connector = postgres::PgConnector::new(url).await?; + let parse = Url::parse(&url)?; + let scheme = parse.scheme(); + + let connector = match scheme { + "postgresql" => postgres::PgConnector::new(url).await?, + &_ => { + return Err(Error::Generic(format!( + "Database `{}` is not supported", + scheme + ))) + } + }; let rows = connector.query(query).await?;