use clap::Parser; use rusqlite; use yaml_rust::yaml; #[derive(clap::Parser, Debug)] #[clap(version)] struct Args { #[clap(subcommand)] command: Command, } #[derive(clap::Subcommand, Debug)] enum Command { Insert { #[clap(long)] database: String, table_name: String, input_file: Option, }, Select { #[clap(long)] database: String, table_name: String, #[clap(long)] primary_key: Option, record_id: String, #[clap(long)] exclude_column: Option>, #[clap(long)] include_primary_key: bool, }, } fn main() { let args = Args::parse(); match args.command { Command::Insert { database, table_name, input_file, } => { let input_file = match &input_file { Some(f) => f, None => "-", }; let mut dbconn = rusqlite::Connection::open(database).unwrap(); let mut text_data; if input_file == "-" { use std::io::Read; text_data = String::new(); std::io::stdin().read_to_string(&mut text_data).unwrap(); } else { text_data = std::fs::read_to_string(input_file).unwrap(); } let mut yaml_data = yaml::YamlLoader::load_from_str(&text_data).unwrap(); yaqlite::insert(&mut dbconn, &table_name, &mut yaml_data).unwrap(); dbconn.close().unwrap(); }, Command::Select { database, table_name, primary_key, record_id, mut exclude_column, include_primary_key, } => { if exclude_column.is_none() && include_primary_key { exclude_column = Some(Vec::new()); } let dbconn = rusqlite::Connection::open(database).unwrap(); let yaml_data = match primary_key { Some(pk) => yaqlite::select_by_column( &dbconn, &table_name, &pk, &record_id, exclude_column.as_deref(), ).unwrap(), None => yaqlite::select( &dbconn, &table_name, &record_id, exclude_column.as_deref(), ).unwrap(), }; let stdout = std::io::stdout(); let mut stdout_handle = stdout.lock(); let mut buffer = yaqlite::yaml::IoAdapter::new(&mut stdout_handle); let mut emitter = yaml_rust::YamlEmitter::new(&mut buffer); emitter.multiline_strings(true); emitter.dump(&yaml_data).unwrap(); // YamlEmitter doesn't output a trailing newline. { use std::io::Write; writeln!(stdout_handle, "").unwrap(); } dbconn.close().unwrap(); }, }; }