stash: utilize clap for multicall functionality; simplify CLI handler

Signed-off-by: NotAShelf <raf@notashelf.dev>
Change-Id: I84d9f46bb9bba0e893aa4f99d6ff48f76a6a6964
This commit is contained in:
raf 2025-10-27 12:19:45 +03:00
commit d59ac77b9f
Signed by: NotAShelf
GPG key ID: 29D95B64378DB4BF
2 changed files with 26 additions and 65 deletions

View file

@ -2,7 +2,6 @@ use std::{
env, env,
io::{self, IsTerminal}, io::{self, IsTerminal},
path::PathBuf, path::PathBuf,
process,
}; };
use clap::{CommandFactory, Parser, Subcommand}; use clap::{CommandFactory, Parser, Subcommand};
@ -129,14 +128,27 @@ fn report_error<T>(
} }
#[allow(clippy::too_many_lines)] // whatever #[allow(clippy::too_many_lines)] // whatever
fn main() { fn main() -> color_eyre::eyre::Result<()> {
// Multicall dispatch: stash-copy, stash-paste, wl-copy, wl-paste // Check if we're being called as a multicall binary
if crate::multicall::multicall_dispatch() { let program_name = env::args().next().map(|s| {
// If handled, exit immediately PathBuf::from(s)
std::process::exit(0); .file_name()
.and_then(|name| name.to_str())
.unwrap_or("stash")
.to_string()
});
if let Some(ref name) = program_name {
if name == "wl-copy" || name == "stash-copy" {
crate::multicall::wl_copy::wl_copy_main()?;
return Ok(());
} else if name == "wl-paste" || name == "stash-paste" {
crate::multicall::wl_paste::wl_paste_main()?;
return Ok(());
}
} }
// If not multicall, proceed with normal CLI handling // Normal CLI handling
smol::block_on(async { smol::block_on(async {
let cli = Cli::parse(); let cli = Cli::parse();
env_logger::Builder::new() env_logger::Builder::new()
@ -151,24 +163,11 @@ fn main() {
}); });
if let Some(parent) = db_path.parent() { if let Some(parent) = db_path.parent() {
if let Err(e) = std::fs::create_dir_all(parent) { std::fs::create_dir_all(parent)?;
log::error!("Failed to create database directory: {e}");
process::exit(1);
}
} }
let conn = rusqlite::Connection::open(&db_path).unwrap_or_else(|e| { let conn = rusqlite::Connection::open(&db_path)?;
log::error!("Failed to open SQLite database: {e}"); let db = db::SqliteClipboardDb::new(conn)?;
process::exit(1);
});
let db = match db::SqliteClipboardDb::new(conn) {
Ok(db) => db,
Err(e) => {
log::error!("Failed to initialize SQLite database: {e}");
process::exit(1);
},
};
match cli.command { match cli.command {
Some(Command::Store) => { Some(Command::Store) => {
@ -345,12 +344,12 @@ fn main() {
&[], &[],
); );
}, },
None => { None => {
if let Err(e) = Cli::command().print_help() { Cli::command().print_help()?;
log::error!("Failed to print help: {e}");
}
println!(); println!();
}, },
} }
}); Ok(())
})
} }

View file

@ -4,41 +4,3 @@
// https://github.com/YaLTeR/wl-clipboard-rs/blob/master/wl-clipboard-rs-tools/src/bin/wl_copy.rs // https://github.com/YaLTeR/wl-clipboard-rs/blob/master/wl-clipboard-rs-tools/src/bin/wl_copy.rs
pub mod wl_copy; pub mod wl_copy;
pub mod wl_paste; pub mod wl_paste;
use std::env;
/// Extract the base name from argv[0].
fn get_base(argv0: &str) -> &str {
std::path::Path::new(argv0)
.file_name()
.and_then(|name| name.to_str())
.unwrap_or("")
}
/// Dispatch multicall binary logic based on `argv[0]`.
/// Returns `true` if a multicall command was handled and the process should
/// exit.
pub fn multicall_dispatch() -> bool {
let argv0 = env::args().next().unwrap_or_else(|| {
log::warn!("unable to determine program name");
String::new()
});
let base = get_base(&argv0);
match base {
"stash-copy" | "wl-copy" => {
if let Err(e) = wl_copy::wl_copy_main() {
log::error!("copy failed: {e}");
std::process::exit(1);
}
true
},
"stash-paste" | "wl-paste" => {
if let Err(e) = wl_paste::wl_paste_main() {
log::error!("paste failed: {e}");
std::process::exit(1);
}
true
},
_ => false,
}
}