use clap::{Parser, Subcommand};
use colored::Colorize;
mod commands;
mod utils;
#[derive(Parser)]
#[command(name = "rustywallet")]
#[command(version, about = "Cryptocurrency wallet CLI tool", long_about = None)]
struct Cli {
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand)]
enum Commands {
Generate {
#[arg(short, long, default_value = "hex", value_parser = ["hex", "wif"])]
format: String,
#[arg(short, long, default_value = "mainnet", value_parser = ["mainnet", "testnet"])]
network: String,
},
Mnemonic {
#[arg(short, long, default_value = "12", value_parser = ["12", "15", "18", "21", "24"])]
words: String,
#[arg(short, long)]
passphrase: Option<String>,
#[arg(short, long)]
validate: Option<String>,
#[arg(long)]
show_seed: bool,
},
Address {
#[arg(short, long)]
key: String,
#[arg(short = 't', long, default_value = "segwit", value_parser = ["legacy", "segwit", "taproot", "ethereum"])]
r#type: String,
#[arg(short, long, default_value = "mainnet", value_parser = ["mainnet", "testnet"])]
network: String,
},
Hd {
#[arg(short, long)]
mnemonic: String,
#[arg(short, long)]
passphrase: Option<String>,
#[arg(long, default_value = "m/44'/0'/0'/0/0")]
path: String,
#[arg(short = 't', long, default_value = "segwit", value_parser = ["legacy", "segwit", "taproot", "ethereum"])]
address_type: String,
#[arg(short, long, default_value = "mainnet", value_parser = ["mainnet", "testnet"])]
network: String,
},
Sign {
#[arg(short, long)]
key: String,
#[arg(short, long)]
message: String,
#[arg(short, long, default_value = "bitcoin", value_parser = ["bitcoin", "ethereum", "raw"])]
format: String,
},
Verify {
#[arg(short, long)]
address: String,
#[arg(short, long)]
message: String,
#[arg(short, long)]
signature: String,
#[arg(short, long, default_value = "bitcoin", value_parser = ["bitcoin", "ethereum"])]
format: String,
},
}
fn main() {
let cli = Cli::parse();
let result = match cli.command {
Commands::Generate { format, network } => commands::generate::run(&format, &network),
Commands::Mnemonic {
words,
passphrase,
validate,
show_seed,
} => commands::mnemonic::run(&words, passphrase.as_deref(), validate.as_deref(), show_seed),
Commands::Address { key, r#type, network } => {
commands::address::run(&key, &r#type, &network)
}
Commands::Hd {
mnemonic,
passphrase,
path,
address_type,
network,
} => commands::hd::run(&mnemonic, passphrase.as_deref(), &path, &address_type, &network),
Commands::Sign {
key,
message,
format,
} => commands::sign::run(&key, &message, &format),
Commands::Verify {
address,
message,
signature,
format,
} => commands::verify::run(&address, &message, &signature, &format),
};
if let Err(e) = result {
eprintln!("{} {}", "Error:".red().bold(), e);
std::process::exit(1);
}
}