From 73f4f60cc7fcff5afef23f920b394c0d2f8aa5f6 Mon Sep 17 00:00:00 2001 From: Rasmus Schlunsen Date: Thu, 5 Jan 2023 14:47:34 +0100 Subject: [PATCH] improvement: use clap for command line args --- Cargo.lock | 143 +++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + src/cli.rs | 14 +++++ src/lib.rs | 1 + src/main.rs | 49 ++++-------------- tests/cli.rs | 10 ++++ 6 files changed, 178 insertions(+), 40 deletions(-) create mode 100644 src/cli.rs create mode 100644 tests/cli.rs diff --git a/Cargo.lock b/Cargo.lock index 4f797bf..855fd07 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -223,6 +223,43 @@ dependencies = [ "winapi", ] +[[package]] +name = "clap" +version = "4.0.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7db700bc935f9e43e88d00b0850dae18a63773cfbec6d8e070fccf7fef89a39" +dependencies = [ + "bitflags", + "clap_derive", + "clap_lex", + "is-terminal", + "once_cell", + "strsim", + "termcolor", +] + +[[package]] +name = "clap_derive" +version = "4.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0177313f9f02afc995627906bbd8967e2be069f5261954222dac78290c2b9014" +dependencies = [ + "heck", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d4198f73e42b4936b35b5bb248d81d2b595ecb170da0bac7655c54eedfa8da8" +dependencies = [ + "os_str_bytes", +] + [[package]] name = "cloudabi" version = "0.0.3" @@ -462,6 +499,27 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" +[[package]] +name = "errno" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" +dependencies = [ + "errno-dragonfly", + "libc", + "winapi", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "fallible-iterator" version = "0.2.0" @@ -727,6 +785,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "heck" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" + [[package]] name = "hermit-abi" version = "0.2.6" @@ -890,6 +954,28 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "io-lifetimes" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46112a93252b123d31a119a8d1a1ac19deac4fac6e0e8b0df58f0d4e5870e63c" +dependencies = [ + "libc", + "windows-sys 0.42.0", +] + +[[package]] +name = "is-terminal" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dfb6c8100ccc63462345b67d1bbc3679177c75ee4bf59bf29c8b1d110b8189" +dependencies = [ + "hermit-abi", + "io-lifetimes", + "rustix", + "windows-sys 0.42.0", +] + [[package]] name = "itertools" version = "0.10.5" @@ -963,6 +1049,12 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" +[[package]] +name = "linux-raw-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" + [[package]] name = "lock_api" version = "0.4.9" @@ -1100,6 +1192,7 @@ version = "0.7.16" dependencies = [ "anyhow", "bitcoin_hashes", + "clap", "config", "console-subscriber", "const_format", @@ -1278,6 +1371,12 @@ dependencies = [ "hashbrown 0.9.1", ] +[[package]] +name = "os_str_bytes" +version = "6.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee" + [[package]] name = "parking_lot" version = "0.12.1" @@ -1412,6 +1511,30 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + [[package]] name = "proc-macro2" version = "1.0.49" @@ -1734,6 +1857,20 @@ dependencies = [ "ordered-multimap", ] +[[package]] +name = "rustix" +version = "0.36.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4feacf7db682c6c329c4ede12649cd36ecab0f3be5b7d74e6a20304725db4549" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys 0.42.0", +] + [[package]] name = "rustversion" version = "1.0.11" @@ -1918,6 +2055,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + [[package]] name = "syn" version = "1.0.107" diff --git a/Cargo.toml b/Cargo.toml index 932db4c..989002b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,6 +12,7 @@ keywords = ["nostr", "server"] categories = ["network-programming", "web-programming"] [dependencies] +clap = { version = "4.0.32", features = ["env", "default", "derive"]} tracing = "0.1.36" tracing-subscriber = "0.2.0" tokio = { version = "1", features = ["full", "tracing", "signal"] } diff --git a/src/cli.rs b/src/cli.rs new file mode 100644 index 0000000..d22d112 --- /dev/null +++ b/src/cli.rs @@ -0,0 +1,14 @@ +use clap::Parser; + +#[derive(Parser)] +#[command(about = "A nostr relay written in Rust", author = env!("CARGO_PKG_AUTHORS"), version = env!("CARGO_PKG_VERSION"))] +pub struct CLIArgs { + #[arg( + short, + long, + help = "Use the as the location of the database", + default_value = ".", + required = false + )] + pub db: String, +} diff --git a/src/lib.rs b/src/lib.rs index 5341061..45b94e4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,4 @@ +pub mod cli; pub mod close; pub mod config; pub mod conn; diff --git a/src/main.rs b/src/main.rs index 97cc5f7..765ef45 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,58 +1,27 @@ //! Server process - +use clap::Parser; +use nostr_rs_relay::cli::*; use nostr_rs_relay::config; use nostr_rs_relay::server::start_server; -use std::env; use std::sync::mpsc as syncmpsc; use std::sync::mpsc::{Receiver as MpscReceiver, Sender as MpscSender}; use std::thread; use tracing::info; + use console_subscriber::ConsoleLayer; -/// Return a requested DB name from command line arguments. -fn db_from_args(args: &[String]) -> Option { - if args.len() == 3 && args.get(1) == Some(&"--db".to_owned()) { - return args.get(2).map(std::clone::Clone::clone); - } - None -} - -fn print_version() { - println!("{} v{}", env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION")); -} - -fn print_help() { - println!("Usage: nostr-rs-relay [OPTION]...\n"); - println!("Options:"); - println!(" --help Show this help message and exit"); - println!(" --version Show version information and exit"); - println!(" --db Use the as the location of the database"); -} /// Start running a Nostr relay server. fn main() { // setup tracing let _trace_sub = tracing_subscriber::fmt::try_init(); info!("Starting up from main"); + + let args = CLIArgs::parse(); + // get database directory from args - let args: Vec = env::args().collect(); - - let help_flag: bool = args.contains(&"--help".to_owned()); - // if --help flag was passed, display help and exit - if help_flag { - print_help(); - return; - } - - let version_flag: bool = args.contains(&"--version".to_owned()); - // if --version flag was passed, display version and exit - if version_flag { - print_version(); - return; - } - - let db_dir: Option = db_from_args(&args); + let db_dir = args.db; // configure settings from config.toml // replace default settings with those read from config.toml let mut settings = config::Settings::new(); @@ -62,8 +31,8 @@ fn main() { ConsoleLayer::builder().with_default_env().init(); } // update with database location - if let Some(db) = db_dir { - settings.database.data_directory = db; + if db_dir.len() > 0 { + settings.database.data_directory = db_dir; } let (_, ctrl_rx): (MpscSender<()>, MpscReceiver<()>) = syncmpsc::channel(); diff --git a/tests/cli.rs b/tests/cli.rs new file mode 100644 index 0000000..cfee3aa --- /dev/null +++ b/tests/cli.rs @@ -0,0 +1,10 @@ +#[cfg(test)] +mod tests { + use nostr_rs_relay::cli::CLIArgs; + + #[test] + fn cli_tests() { + use clap::CommandFactory; + CLIArgs::command().debug_assert(); + } +} \ No newline at end of file