79 lines
2.1 KiB
Rust
79 lines
2.1 KiB
Rust
use crate::{input_validators::*, ArgConstant};
|
|
use clap::{App, Arg};
|
|
|
|
pub const BLOCKHASH_ARG: ArgConstant<'static> = ArgConstant {
|
|
name: "blockhash",
|
|
long: "blockhash",
|
|
help: "Use the supplied blockhash",
|
|
};
|
|
|
|
pub const SIGN_ONLY_ARG: ArgConstant<'static> = ArgConstant {
|
|
name: "sign_only",
|
|
long: "sign-only",
|
|
help: "Sign the transaction offline",
|
|
};
|
|
|
|
pub const SIGNER_ARG: ArgConstant<'static> = ArgConstant {
|
|
name: "signer",
|
|
long: "signer",
|
|
help: "Provide a public-key/signature pair for the transaction",
|
|
};
|
|
|
|
pub fn blockhash_arg<'a, 'b>() -> Arg<'a, 'b> {
|
|
Arg::with_name(BLOCKHASH_ARG.name)
|
|
.long(BLOCKHASH_ARG.long)
|
|
.takes_value(true)
|
|
.value_name("BLOCKHASH")
|
|
.validator(is_hash)
|
|
.help(BLOCKHASH_ARG.help)
|
|
}
|
|
|
|
pub fn sign_only_arg<'a, 'b>() -> Arg<'a, 'b> {
|
|
Arg::with_name(SIGN_ONLY_ARG.name)
|
|
.long(SIGN_ONLY_ARG.long)
|
|
.takes_value(false)
|
|
.requires(BLOCKHASH_ARG.name)
|
|
.help(SIGN_ONLY_ARG.help)
|
|
}
|
|
|
|
fn signer_arg<'a, 'b>() -> Arg<'a, 'b> {
|
|
Arg::with_name(SIGNER_ARG.name)
|
|
.long(SIGNER_ARG.long)
|
|
.takes_value(true)
|
|
.value_name("PUBKEY=SIGNATURE")
|
|
.validator(is_pubkey_sig)
|
|
.requires(BLOCKHASH_ARG.name)
|
|
.multiple(true)
|
|
.help(SIGNER_ARG.help)
|
|
}
|
|
|
|
pub trait ArgsConfig {
|
|
fn blockhash_arg<'a, 'b>(&self, arg: Arg<'a, 'b>) -> Arg<'a, 'b> {
|
|
arg
|
|
}
|
|
fn sign_only_arg<'a, 'b>(&self, arg: Arg<'a, 'b>) -> Arg<'a, 'b> {
|
|
arg
|
|
}
|
|
fn signer_arg<'a, 'b>(&self, arg: Arg<'a, 'b>) -> Arg<'a, 'b> {
|
|
arg
|
|
}
|
|
}
|
|
|
|
pub trait OfflineArgs {
|
|
fn offline_args(self) -> Self;
|
|
fn offline_args_config(self, config: &dyn ArgsConfig) -> Self;
|
|
}
|
|
|
|
impl OfflineArgs for App<'_, '_> {
|
|
fn offline_args_config(self, config: &dyn ArgsConfig) -> Self {
|
|
self.arg(config.blockhash_arg(blockhash_arg()))
|
|
.arg(config.sign_only_arg(sign_only_arg()))
|
|
.arg(config.signer_arg(signer_arg()))
|
|
}
|
|
fn offline_args(self) -> Self {
|
|
struct NullArgsConfig {}
|
|
impl ArgsConfig for NullArgsConfig {}
|
|
self.offline_args_config(&NullArgsConfig {})
|
|
}
|
|
}
|