Extract duplicate clap helpers into clap-utils (#6812)

This commit is contained in:
Ryo Onodera 2019-11-12 09:42:08 +09:00 committed by GitHub
parent 95d6586dd7
commit d84f367317
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
21 changed files with 89 additions and 95 deletions

16
Cargo.lock generated
View File

@ -2993,6 +2993,7 @@ version = "0.21.0"
dependencies = [ dependencies = [
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
"console 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "console 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-clap-utils 0.21.0",
"solana-core 0.21.0", "solana-core 0.21.0",
"solana-logger 0.21.0", "solana-logger 0.21.0",
"solana-metrics 0.21.0", "solana-metrics 0.21.0",
@ -3174,6 +3175,16 @@ dependencies = [
"cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)", "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]]
name = "solana-clap-utils"
version = "0.21.0"
dependencies = [
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
"semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-sdk 0.21.0",
"url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]] [[package]]
name = "solana-cli" name = "solana-cli"
version = "0.21.0" version = "0.21.0"
@ -3197,6 +3208,7 @@ dependencies = [
"serde_yaml 0.8.11 (registry+https://github.com/rust-lang/crates.io-index)", "serde_yaml 0.8.11 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-budget-api 0.21.0", "solana-budget-api 0.21.0",
"solana-budget-program 0.21.0", "solana-budget-program 0.21.0",
"solana-clap-utils 0.21.0",
"solana-client 0.21.0", "solana-client 0.21.0",
"solana-config-api 0.21.0", "solana-config-api 0.21.0",
"solana-core 0.21.0", "solana-core 0.21.0",
@ -3471,6 +3483,7 @@ name = "solana-gossip"
version = "0.21.0" version = "0.21.0"
dependencies = [ dependencies = [
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-clap-utils 0.21.0",
"solana-client 0.21.0", "solana-client 0.21.0",
"solana-core 0.21.0", "solana-core 0.21.0",
"solana-logger 0.21.0", "solana-logger 0.21.0",
@ -3496,11 +3509,11 @@ dependencies = [
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
"nix 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "nix 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)",
"reqwest 0.9.22 (registry+https://github.com/rust-lang/crates.io-index)", "reqwest 0.9.22 (registry+https://github.com/rust-lang/crates.io-index)",
"semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_yaml 0.8.11 (registry+https://github.com/rust-lang/crates.io-index)", "serde_yaml 0.8.11 (registry+https://github.com/rust-lang/crates.io-index)",
"sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-clap-utils 0.21.0",
"solana-client 0.21.0", "solana-client 0.21.0",
"solana-config-api 0.21.0", "solana-config-api 0.21.0",
"solana-logger 0.21.0", "solana-logger 0.21.0",
@ -3966,6 +3979,7 @@ dependencies = [
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
"reqwest 0.9.22 (registry+https://github.com/rust-lang/crates.io-index)", "reqwest 0.9.22 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)",
"solana-clap-utils 0.21.0",
"solana-client 0.21.0", "solana-client 0.21.0",
"solana-core 0.21.0", "solana-core 0.21.0",
"solana-drone 0.21.0", "solana-drone 0.21.0",

View File

@ -10,6 +10,7 @@ homepage = "https://solana.com/"
[dependencies] [dependencies]
clap = "2.33.0" clap = "2.33.0"
console = "0.9.1" console = "0.9.1"
solana-clap-utils = { path = "../clap-utils", version = "0.21.0" }
solana-core = { path = "../core", version = "0.21.0" } solana-core = { path = "../core", version = "0.21.0" }
solana-logger = { path = "../logger", version = "0.21.0" } solana-logger = { path = "../logger", version = "0.21.0" }
solana-metrics = { path = "../metrics", version = "0.21.0" } solana-metrics = { path = "../metrics", version = "0.21.0" }

View File

@ -1,5 +1,6 @@
use clap::{crate_description, crate_name, crate_version, App, Arg}; use clap::{crate_description, crate_name, crate_version, App, Arg};
use console::style; use console::style;
use solana_clap_utils::input_validators::is_keypair;
use solana_core::{ use solana_core::{
archiver::Archiver, archiver::Archiver,
cluster_info::{Node, VALIDATOR_PORT_RANGE}, cluster_info::{Node, VALIDATOR_PORT_RANGE},
@ -11,13 +12,6 @@ use solana_sdk::{
}; };
use std::{net::SocketAddr, path::PathBuf, process::exit, sync::Arc}; use std::{net::SocketAddr, path::PathBuf, process::exit, sync::Arc};
// Return an error if a keypair file cannot be parsed.
fn is_keypair(string: String) -> Result<(), String> {
read_keypair_file(&string)
.map(|_| ())
.map_err(|err| format!("{:?}", err))
}
fn main() { fn main() {
solana_logger::setup(); solana_logger::setup();

18
clap-utils/Cargo.toml Normal file
View File

@ -0,0 +1,18 @@
[package]
name = "solana-clap-utils"
version = "0.21.0"
description = "Solana utilities for the clap"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0"
homepage = "https://solana.com/"
edition = "2018"
[dependencies]
clap = "2.33.0"
semver = "0.9.0"
solana-sdk = { path = "../sdk", version = "0.21.0" }
url = "2.1.0"
[lib]
name = "solana_clap_utils"

View File

@ -34,3 +34,17 @@ pub fn is_url(string: String) -> Result<(), String> {
Err(err) => Err(format!("{:?}", err)), Err(err) => Err(format!("{:?}", err)),
} }
} }
pub fn is_semver(semver: &str) -> Result<(), String> {
match semver::Version::parse(&semver) {
Ok(_) => Ok(()),
Err(err) => Err(format!("{:?}", err)),
}
}
pub fn is_release_channel(channel: &str) -> Result<(), String> {
match channel {
"edge" | "beta" | "stable" => Ok(()),
_ => Err(format!("Invalid release channel {}", channel)),
}
}

2
clap-utils/src/lib.rs Normal file
View File

@ -0,0 +1,2 @@
pub mod input_parsers;
pub mod input_validators;

View File

@ -27,6 +27,7 @@ serde_derive = "1.0.102"
serde_json = "1.0.41" serde_json = "1.0.41"
serde_yaml = "0.8.11" serde_yaml = "0.8.11"
solana-budget-api = { path = "../programs/budget_api", version = "0.21.0" } solana-budget-api = { path = "../programs/budget_api", version = "0.21.0" }
solana-clap-utils = { path = "../clap-utils", version = "0.21.0" }
solana-client = { path = "../client", version = "0.21.0" } solana-client = { path = "../client", version = "0.21.0" }
solana-config-api = { path = "../programs/config_api", version = "0.21.0" } solana-config-api = { path = "../programs/config_api", version = "0.21.0" }
solana-drone = { path = "../drone", version = "0.21.0" } solana-drone = { path = "../drone", version = "0.21.0" }

View File

@ -1,13 +1,14 @@
use crate::{ use crate::{
cluster_query::*, display::println_name_value, input_parsers::*, input_validators::*, stake::*, cluster_query::*, display::println_name_value, stake::*, storage::*, validator_info::*, vote::*,
storage::*, validator_info::*, vote::*,
}; };
use chrono::prelude::*; use chrono::prelude::*;
use clap::{App, AppSettings, Arg, ArgMatches, SubCommand}; use clap::{App, AppSettings, Arg, ArgMatches, SubCommand};
use log::*; use log::*;
use num_traits::FromPrimitive; use num_traits::FromPrimitive;
use serde_json::{self, json, Value}; use serde_json::{self, json, Value};
use solana_budget_api::budget_instruction::{self, BudgetError}; use solana_budget_api::budget_instruction::{self, BudgetError};
use solana_clap_utils::{input_parsers::*, input_validators::*};
use solana_client::{client_error::ClientError, rpc_client::RpcClient}; use solana_client::{client_error::ClientError, rpc_client::RpcClient};
#[cfg(not(test))] #[cfg(not(test))]
use solana_drone::drone::request_airdrop_transaction; use solana_drone::drone::request_airdrop_transaction;
@ -32,6 +33,7 @@ use solana_sdk::{
use solana_stake_api::stake_state::{Lockup, StakeAuthorize}; use solana_stake_api::stake_state::{Lockup, StakeAuthorize};
use solana_storage_api::storage_instruction::StorageAccountType; use solana_storage_api::storage_instruction::StorageAccountType;
use solana_vote_api::vote_state::VoteAuthorize; use solana_vote_api::vote_state::VoteAuthorize;
use std::{ use std::{
fs::File, fs::File,
io::{Read, Write}, io::{Read, Write},

View File

@ -5,8 +5,6 @@ pub mod cli;
pub mod cluster_query; pub mod cluster_query;
pub mod config; pub mod config;
pub mod display; pub mod display;
pub mod input_parsers;
pub mod input_validators;
pub mod stake; pub mod stake;
pub mod storage; pub mod storage;
pub mod validator_info; pub mod validator_info;

View File

@ -1,12 +1,14 @@
use clap::{crate_description, crate_name, crate_version, Arg, ArgGroup, ArgMatches, SubCommand}; use clap::{crate_description, crate_name, crate_version, Arg, ArgGroup, ArgMatches, SubCommand};
use console::style; use console::style;
use solana_clap_utils::input_validators::is_url;
use solana_cli::{ use solana_cli::{
cli::{app, parse_command, process_command, CliCommandInfo, CliConfig, CliError}, cli::{app, parse_command, process_command, CliCommandInfo, CliConfig, CliError},
config::{self, Config}, config::{self, Config},
display::{println_name_value, println_name_value_or}, display::{println_name_value, println_name_value_or},
input_validators::is_url,
}; };
use solana_sdk::signature::read_keypair_file; use solana_sdk::signature::read_keypair_file;
use std::error; use std::error;
fn parse_settings(matches: &ArgMatches<'_>) -> Result<bool, Box<dyn error::Error>> { fn parse_settings(matches: &ArgMatches<'_>) -> Result<bool, Box<dyn error::Error>> {

View File

@ -1,14 +1,10 @@
use crate::{ use crate::cli::{
cli::{ build_balance_message, check_account_for_fee, check_unique_pubkeys,
build_balance_message, check_account_for_fee, check_unique_pubkeys, log_instruction_custom_error, CliCommand, CliCommandInfo, CliConfig, CliError, ProcessResult,
log_instruction_custom_error, CliCommand, CliCommandInfo, CliConfig, CliError,
ProcessResult,
},
input_parsers::*,
input_validators::*,
}; };
use clap::{App, Arg, ArgMatches, SubCommand}; use clap::{App, Arg, ArgMatches, SubCommand};
use console::style; use console::style;
use solana_clap_utils::{input_parsers::*, input_validators::*};
use solana_client::rpc_client::RpcClient; use solana_client::rpc_client::RpcClient;
use solana_sdk::signature::Keypair; use solana_sdk::signature::Keypair;
use solana_sdk::{ use solana_sdk::{

View File

@ -1,12 +1,9 @@
use crate::{ use crate::cli::{
cli::{ check_account_for_fee, check_unique_pubkeys, log_instruction_custom_error, CliCommand,
check_account_for_fee, check_unique_pubkeys, log_instruction_custom_error, CliCommand, CliCommandInfo, CliConfig, CliError, ProcessResult,
CliCommandInfo, CliConfig, CliError, ProcessResult,
},
input_parsers::*,
input_validators::*,
}; };
use clap::{App, Arg, ArgMatches, SubCommand}; use clap::{App, Arg, ArgMatches, SubCommand};
use solana_clap_utils::{input_parsers::*, input_validators::*};
use solana_client::rpc_client::RpcClient; use solana_client::rpc_client::RpcClient;
use solana_sdk::signature::Keypair; use solana_sdk::signature::Keypair;
use solana_sdk::{ use solana_sdk::{

View File

@ -1,14 +1,17 @@
use crate::{ use crate::{
cli::{check_account_for_fee, CliCommand, CliCommandInfo, CliConfig, CliError, ProcessResult}, cli::{check_account_for_fee, CliCommand, CliCommandInfo, CliConfig, CliError, ProcessResult},
display::println_name_value, display::println_name_value,
input_parsers::pubkey_of,
input_validators::{is_pubkey, is_url},
}; };
use bincode::deserialize; use bincode::deserialize;
use clap::{App, Arg, ArgMatches, SubCommand}; use clap::{App, Arg, ArgMatches, SubCommand};
use reqwest::Client; use reqwest::Client;
use serde_derive::{Deserialize, Serialize}; use serde_derive::{Deserialize, Serialize};
use serde_json::{Map, Value}; use serde_json::{Map, Value};
use solana_clap_utils::{
input_parsers::pubkey_of,
input_validators::{is_pubkey, is_url},
};
use solana_client::rpc_client::RpcClient; use solana_client::rpc_client::RpcClient;
use solana_config_api::{config_instruction, get_config_data, ConfigKeys, ConfigState}; use solana_config_api::{config_instruction, get_config_data, ConfigKeys, ConfigState};
use solana_sdk::{ use solana_sdk::{
@ -19,6 +22,7 @@ use solana_sdk::{
signature::{Keypair, KeypairUtil}, signature::{Keypair, KeypairUtil},
transaction::Transaction, transaction::Transaction,
}; };
use std::error; use std::error;
pub const MAX_SHORT_FIELD_LENGTH: usize = 70; pub const MAX_SHORT_FIELD_LENGTH: usize = 70;

View File

@ -1,13 +1,9 @@
use crate::{ use crate::cli::{
cli::{ build_balance_message, check_account_for_fee, check_unique_pubkeys,
build_balance_message, check_account_for_fee, check_unique_pubkeys, log_instruction_custom_error, CliCommand, CliCommandInfo, CliConfig, CliError, ProcessResult,
log_instruction_custom_error, CliCommand, CliCommandInfo, CliConfig, CliError,
ProcessResult,
},
input_parsers::*,
input_validators::*,
}; };
use clap::{value_t_or_exit, App, Arg, ArgMatches, SubCommand}; use clap::{value_t_or_exit, App, Arg, ArgMatches, SubCommand};
use solana_clap_utils::{input_parsers::*, input_validators::*};
use solana_client::rpc_client::RpcClient; use solana_client::rpc_client::RpcClient;
use solana_sdk::signature::Keypair; use solana_sdk::signature::Keypair;
use solana_sdk::{ use solana_sdk::{

View File

@ -10,6 +10,7 @@ homepage = "https://solana.com/"
[dependencies] [dependencies]
clap = "2.33.0" clap = "2.33.0"
solana-clap-utils = { path = "../clap-utils", version = "0.21.0" }
solana-core = { path = "../core", version = "0.21.0" } solana-core = { path = "../core", version = "0.21.0" }
solana-client = { path = "../client", version = "0.21.0" } solana-client = { path = "../client", version = "0.21.0" }
solana-logger = { path = "../logger", version = "0.21.0" } solana-logger = { path = "../logger", version = "0.21.0" }

View File

@ -4,6 +4,7 @@ use clap::{
crate_description, crate_name, crate_version, value_t_or_exit, App, AppSettings, Arg, crate_description, crate_name, crate_version, value_t_or_exit, App, AppSettings, Arg,
SubCommand, SubCommand,
}; };
use solana_clap_utils::input_validators::is_pubkey;
use solana_client::rpc_client::RpcClient; use solana_client::rpc_client::RpcClient;
use solana_core::{contact_info::ContactInfo, gossip_service::discover}; use solana_core::{contact_info::ContactInfo, gossip_service::discover};
use solana_sdk::pubkey::Pubkey; use solana_sdk::pubkey::Pubkey;
@ -11,13 +12,6 @@ use std::error;
use std::net::SocketAddr; use std::net::SocketAddr;
use std::process::exit; use std::process::exit;
fn is_pubkey(pubkey: String) -> Result<(), String> {
match pubkey.parse::<Pubkey>() {
Ok(_) => Ok(()),
Err(err) => Err(format!("{:?}", err)),
}
}
fn main() -> Result<(), Box<dyn error::Error>> { fn main() -> Result<(), Box<dyn error::Error>> {
solana_logger::setup_with_filter("solana=info"); solana_logger::setup_with_filter("solana=info");

View File

@ -23,11 +23,11 @@ lazy_static = "1.4.0"
log = "0.4.8" log = "0.4.8"
nix = "0.15.0" nix = "0.15.0"
reqwest = { version = "0.9.22", default-features = false, features = ["rustls-tls"] } reqwest = { version = "0.9.22", default-features = false, features = ["rustls-tls"] }
semver = "0.9.0"
serde = "1.0.102" serde = "1.0.102"
serde_derive = "1.0.102" serde_derive = "1.0.102"
serde_yaml = "0.8.11" serde_yaml = "0.8.11"
sha2 = "0.8.0" sha2 = "0.8.0"
solana-clap-utils = { path = "../clap-utils", version = "0.21.0" }
solana-client = { path = "../client", version = "0.21.0" } solana-client = { path = "../client", version = "0.21.0" }
solana-config-api = { path = "../programs/config_api", version = "0.21.0" } solana-config-api = { path = "../programs/config_api", version = "0.21.0" }
solana-logger = { path = "../logger", version = "0.21.0" } solana-logger = { path = "../logger", version = "0.21.0" }

View File

@ -2,6 +2,7 @@
extern crate lazy_static; extern crate lazy_static;
use clap::{crate_description, crate_name, crate_version, App, AppSettings, Arg, SubCommand}; use clap::{crate_description, crate_name, crate_version, App, AppSettings, Arg, SubCommand};
use solana_clap_utils::input_validators::{is_pubkey, is_release_channel, is_semver, is_url};
use solana_sdk::pubkey::Pubkey; use solana_sdk::pubkey::Pubkey;
mod build_env; mod build_env;
@ -11,42 +12,6 @@ mod defaults;
mod stop_process; mod stop_process;
mod update_manifest; mod update_manifest;
// Return an error if a url cannot be parsed.
fn is_url(string: String) -> Result<(), String> {
match url::Url::parse(&string) {
Ok(url) => {
if url.has_host() {
Ok(())
} else {
Err("no host provided".to_string())
}
}
Err(err) => Err(format!("{:?}", err)),
}
}
// Return an error if a pubkey cannot be parsed.
fn is_pubkey(string: String) -> Result<(), String> {
match string.parse::<Pubkey>() {
Ok(_) => Ok(()),
Err(err) => Err(format!("{:?}", err)),
}
}
fn is_semver(semver: &str) -> Result<(), String> {
match semver::Version::parse(&semver) {
Ok(_) => Ok(()),
Err(err) => Err(format!("{:?}", err)),
}
}
fn is_release_channel(channel: &str) -> Result<(), String> {
match channel {
"edge" | "beta" | "stable" => Ok(()),
_ => Err(format!("Invalid release channel {}", channel)),
}
}
pub fn main() -> Result<(), String> { pub fn main() -> Result<(), String> {
solana_logger::setup(); solana_logger::setup();

View File

@ -17,6 +17,7 @@ log = "0.4.8"
indicatif = "0.13.0" indicatif = "0.13.0"
reqwest = { version = "0.9.22", default-features = false } reqwest = { version = "0.9.22", default-features = false }
serde_json = "1.0.41" serde_json = "1.0.41"
solana-clap-utils = { path = "../clap-utils", version = "0.21.0" }
solana-client = { path = "../client", version = "0.21.0" } solana-client = { path = "../client", version = "0.21.0" }
solana-core = { path = "../core", version = "0.21.0" } solana-core = { path = "../core", version = "0.21.0" }
solana-drone = { path = "../drone", version = "0.21.0" } solana-drone = { path = "../drone", version = "0.21.0" }

View File

@ -3,6 +3,10 @@ use clap::{crate_description, crate_name, value_t, value_t_or_exit, App, Arg};
use console::{style, Emoji}; use console::{style, Emoji};
use indicatif::{ProgressBar, ProgressStyle}; use indicatif::{ProgressBar, ProgressStyle};
use log::*; use log::*;
use solana_clap_utils::{
input_parsers::pubkey_of,
input_validators::{is_keypair, is_pubkey_or_keypair},
};
use solana_client::rpc_client::RpcClient; use solana_client::rpc_client::RpcClient;
use solana_core::cluster_info::{Node, VALIDATOR_PORT_RANGE}; use solana_core::cluster_info::{Node, VALIDATOR_PORT_RANGE};
use solana_core::contact_info::ContactInfo; use solana_core::contact_info::ContactInfo;
@ -229,13 +233,6 @@ fn initialize_ledger_path(
Ok(genesis_hash) Ok(genesis_hash)
} }
// Return an error if a keypair file cannot be parsed.
fn is_keypair(string: String) -> Result<(), String> {
read_keypair_file(&string)
.map(|_| ())
.map_err(|err| format!("{:?}", err))
}
#[allow(clippy::cognitive_complexity)] #[allow(clippy::cognitive_complexity)]
pub fn main() { pub fn main() {
let default_dynamic_port_range = let default_dynamic_port_range =
@ -272,7 +269,7 @@ pub fn main() {
.long("vote-account") .long("vote-account")
.value_name("PUBKEY") .value_name("PUBKEY")
.takes_value(true) .takes_value(true)
.validator(is_keypair) .validator(is_pubkey_or_keypair)
.help("Public key of the vote account to vote with. Default is the public key of the voting keypair"), .help("Public key of the vote account to vote with. Default is the public key of the voting keypair"),
) )
.arg( .arg(
@ -458,11 +455,8 @@ pub fn main() {
Keypair::new() Keypair::new()
}; };
let vote_account = matches let vote_account =
.value_of("vote_account") pubkey_of(&matches, "vote_account").unwrap_or_else(|| voting_keypair.pubkey());
.map_or(voting_keypair.pubkey(), |pubkey| {
pubkey.parse().expect("failed to parse vote_account")
});
let ledger_path = PathBuf::from(matches.value_of("ledger_path").unwrap()); let ledger_path = PathBuf::from(matches.value_of("ledger_path").unwrap());
let entrypoint = matches.value_of("entrypoint"); let entrypoint = matches.value_of("entrypoint");