Compare commits

..

2 commits

Author SHA1 Message Date
704be76887 wip: add sqlx setup 2025-01-14 20:24:25 -03:00
57074a89ff feat: add clap arg parse 2025-01-14 19:15:49 -03:00
5 changed files with 2113 additions and 2 deletions

1
.gitignore vendored
View file

@ -7,3 +7,4 @@ secring.*
# Added by cargo
/target
.env

4
.justfile Normal file
View file

@ -0,0 +1,4 @@
set dotenv-load := true
dev:
cargo run --bin cli -- query "SELECT * FROM sources;"

2051
Cargo.lock generated

File diff suppressed because it is too large Load diff

View file

@ -4,3 +4,11 @@ version = "0.1.0"
edition = "2021"
[dependencies]
clap = { version = "4.5.26", features = ["derive", "env"] }
sqlx = { version = "0.8", features = [
"runtime-tokio",
"tls-native-tls",
"postgres",
"sqlite",
] }
tokio = {version = "1.43.0", features = ["full"]}

View file

@ -1,3 +1,50 @@
fn main() {
println!("Hello from cli bin!");
use clap::{Parser, Subcommand};
use futures::TryStreamExt;
use sqlx::postgres::PgPool;
#[derive(Parser)]
#[command(version, about, long_about = None)]
#[command(propagate_version = true)]
struct Cli {
/// Name of the person to greet
#[command(subcommand)]
command: Commands,
#[arg(short = 'u', long, global = true, env = "CLI_DB_URL")]
db_url: Option<String>,
}
#[derive(Subcommand)]
enum Commands {
/// Executes a query agains the database, it pass it directly to the underliying driver
Query {
/// Query to execute
sql: String,
},
}
#[tokio::main]
async fn main() {
let cli = Cli::parse();
let url = cli.db_url.unwrap();
// You can check for the existence of subcommands, and if found use their
// matches just as you would the top level cmd
match &cli.command {
Commands::Query { sql } => handle_query(url, sql).await.unwrap(),
}
}
async fn handle_query(url: String, query: &String) -> Result<(), sqlx::Error> {
let pool = PgPool::connect(url.as_str()).await?;
let mut rows = sqlx::query("DELETE FROM table").fetch(&pool);
while let Some(row) = rows.try_next().await? {
// map the row into a user-defined domain type
let email: &str = row.try_get("email")?;
}
return Ok(());
}