Improve account manager CLI (#1404)

## Proposed Changes

Fixes some sharp edges on the new `lighthouse account validator list` command, and the account manager CLI.

* Validator names/keys are always printed in the same order due to the use of a sorted `BTreeMap`
* The `validator list` subcommand now respects the `--validator-dir` flag, instead of always looking in `~/.lighthouse/validators`
* The `--help` now shows a description for the `wallet` subcommand instead of just `TODO`
This commit is contained in:
Michael Sproul 2020-07-29 04:32:52 +00:00
parent eaa9f9744f
commit f53dedb27d
4 changed files with 21 additions and 10 deletions

View File

@ -50,7 +50,7 @@ pub fn cli_app<'a, 'b>() -> App<'a, 'b> {
.long(VALIDATOR_DIR_FLAG) .long(VALIDATOR_DIR_FLAG)
.value_name("VALIDATOR_DIRECTORY") .value_name("VALIDATOR_DIRECTORY")
.help( .help(
"The path the validator client data directory. \ "The path to the validator client data directory. \
Defaults to ~/.lighthouse/validators", Defaults to ~/.lighthouse/validators",
) )
.takes_value(true), .takes_value(true),

View File

@ -1,12 +1,23 @@
use crate::VALIDATOR_DIR_FLAG; use crate::VALIDATOR_DIR_FLAG;
use clap::{App, ArgMatches}; use clap::{App, Arg, ArgMatches};
use std::path::PathBuf; use std::path::PathBuf;
use validator_dir::Manager as ValidatorManager; use validator_dir::Manager as ValidatorManager;
pub const CMD: &str = "list"; pub const CMD: &str = "list";
pub fn cli_app<'a, 'b>() -> App<'a, 'b> { pub fn cli_app<'a, 'b>() -> App<'a, 'b> {
App::new(CMD).about("Lists the names of all validators.") App::new(CMD)
.arg(
Arg::with_name(VALIDATOR_DIR_FLAG)
.long(VALIDATOR_DIR_FLAG)
.value_name("VALIDATOR_DIRECTORY")
.help(
"The path to search for validator directories. \
Defaults to ~/.lighthouse/validators",
)
.takes_value(true),
)
.about("Lists the names of all validators.")
} }
pub fn cli_run(matches: &ArgMatches<'_>) -> Result<(), String> { pub fn cli_run(matches: &ArgMatches<'_>) -> Result<(), String> {

View File

@ -11,7 +11,7 @@ pub const CMD: &str = "wallet";
pub fn cli_app<'a, 'b>() -> App<'a, 'b> { pub fn cli_app<'a, 'b>() -> App<'a, 'b> {
App::new(CMD) App::new(CMD)
.about("TODO") .about("Manage wallets, from which validator keys can be derived.")
.arg( .arg(
Arg::with_name(BASE_DIR_FLAG) Arg::with_name(BASE_DIR_FLAG)
.long(BASE_DIR_FLAG) .long(BASE_DIR_FLAG)

View File

@ -2,7 +2,7 @@ use crate::{Error as ValidatorDirError, ValidatorDir};
use bls::Keypair; use bls::Keypair;
use rayon::prelude::*; use rayon::prelude::*;
use slog::{info, warn, Logger}; use slog::{info, warn, Logger};
use std::collections::HashMap; use std::collections::BTreeMap;
use std::fs::read_dir; use std::fs::read_dir;
use std::io; use std::io;
use std::iter::FromIterator; use std::iter::FromIterator;
@ -163,13 +163,13 @@ impl Manager {
/// ## Errors /// ## Errors
/// ///
/// Returns an error if a directory is unable to be read. /// Returns an error if a directory is unable to be read.
pub fn directory_names(&self) -> Result<HashMap<String, PathBuf>, Error> { pub fn directory_names(&self) -> Result<BTreeMap<String, PathBuf>, Error> {
Ok(HashMap::from_iter(self.iter_dir()?.into_iter().filter_map( Ok(BTreeMap::from_iter(
|path| { self.iter_dir()?.into_iter().filter_map(|path| {
path.file_name() path.file_name()
.and_then(|os_string| os_string.to_str().map(|s| s.to_string())) .and_then(|os_string| os_string.to_str().map(|s| s.to_string()))
.map(|filename| (filename, path)) .map(|filename| (filename, path))
}, }),
))) ))
} }
} }