use polite::prelude::*;
use std::env;
use std::fs;
fn main() -> Result<(), Box<dyn std::error::Error>> {
run_cli()
}
fn run_cli() -> Result<(), Box<dyn std::error::Error>> {
let args: Vec<String> = env::args().collect();
if args.len() < 2 || args.contains(&"--help".to_string()) || args.contains(&"-h".to_string()) {
print_help();
return Ok(());
}
let sql = &args[1];
let db_path = match args.get(2) {
Some(path) => path.as_str(),
None => {
eprintln!("Error: you must provide a SQLite database file path.");
std::process::exit(1);
}
};
let sql = if let Some(path) = sql.strip_prefix('@') {
fs::read_to_string(path)?
} else {
sql.clone()
};
if sql.trim_start().to_uppercase().starts_with("SELECT") {
let df = to_dataframe(db_path, &sql)?;
println!("{df}");
} else {
let conn = connect_sqlite(Some(db_path))?;
let rows = execute_query(&conn, &sql)?;
eprintln!("Executed successfully, {rows} row(s) affected");
}
Ok(())
}
fn print_help() {
println!("polite — rusqlite × Polars bridge demo");
println!();
println!("USAGE:");
println!(" polite <SQL> [DB_PATH]");
println!();
println!("ARGS:");
println!(" <SQL> SQL statement (use @file.sql to read from file)");
println!(" [DB_PATH] Path to SQLite database file (defaults to in-memory)");
println!();
println!("EXAMPLES:");
println!(" polite \"CREATE TABLE t (id INTEGER, name TEXT)\"");
println!(" polite \"INSERT INTO t VALUES (1, 'Alice')\"");
println!(" polite \"SELECT * FROM t\"");
println!(" polite @queries.sql mydb.sqlite3");
}