clap-utils: Use `uriparse` crate to parse `SignerSource`

This commit is contained in:
Trent Nelson 2021-04-15 01:01:58 -06:00 committed by Trent Nelson
parent c5ab3ba6f1
commit 5d1ef5d01d
4 changed files with 69 additions and 10 deletions

11
Cargo.lock generated
View File

@ -4092,6 +4092,7 @@ dependencies = [
"solana-sdk", "solana-sdk",
"thiserror", "thiserror",
"tiny-bip39 0.8.0", "tiny-bip39 0.8.0",
"uriparse",
"url 2.2.0", "url 2.2.0",
] ]
@ -6480,6 +6481,16 @@ version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
[[package]]
name = "uriparse"
version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e515b1ada404168e145ac55afba3c42f04cf972201a8552d42e2abb17c1b7221"
dependencies = [
"fnv",
"lazy_static",
]
[[package]] [[package]]
name = "url" name = "url"
version = "1.7.2" version = "1.7.2"

View File

@ -16,6 +16,7 @@ solana-remote-wallet = { path = "../remote-wallet", version = "=1.7.0" }
solana-sdk = { path = "../sdk", version = "=1.7.0" } solana-sdk = { path = "../sdk", version = "=1.7.0" }
thiserror = "1.0.21" thiserror = "1.0.21"
tiny-bip39 = "0.8.0" tiny-bip39 = "0.8.0"
uriparse = "0.6.3"
url = "2.1.0" url = "2.1.0"
chrono = "0.4" chrono = "0.4"

View File

@ -20,6 +20,7 @@ use solana_sdk::{
}, },
}; };
use std::{ use std::{
convert::TryFrom,
error, error,
io::{stdin, stdout, Write}, io::{stdin, stdout, Write},
process::exit, process::exit,
@ -142,16 +143,27 @@ pub(crate) enum SignerSource {
} }
pub(crate) fn parse_signer_source<S: AsRef<str>>(source: S) -> SignerSource { pub(crate) fn parse_signer_source<S: AsRef<str>>(source: S) -> SignerSource {
if path == "-" { let source = source.as_ref();
SignerSource::Stdin match uriparse::URIReference::try_from(source) {
} else if path == ASK_KEYWORD { Err(_) => SignerSource::Filepath(source.to_string()),
SignerSource::Ask Ok(uri) => {
} else if path.starts_with("usb://") { if let Some(scheme) = uri.scheme() {
SignerSource::Usb(path.to_string()) let scheme = scheme.as_str().to_ascii_lowercase();
} else if let Ok(pubkey) = Pubkey::from_str(path) { match scheme.as_str() {
SignerSource::Pubkey(pubkey) "usb" => SignerSource::Usb(source.to_string()),
} else { _ => SignerSource::Filepath(source.to_string()),
SignerSource::Filepath(path.to_string()) }
} else {
match source {
"-" => SignerSource::Stdin,
ASK_KEYWORD => SignerSource::Ask,
_ => match Pubkey::from_str(source) {
Ok(pubkey) => SignerSource::Pubkey(pubkey),
Err(_) => SignerSource::Filepath(source.to_string()),
},
}
}
}
} }
} }
@ -443,4 +455,28 @@ mod tests {
]; ];
assert_eq!(signer_pubkeys, expect); assert_eq!(signer_pubkeys, expect);
} }
#[test]
fn test_parse_signer_source() {
assert!(matches!(parse_signer_source("-"), SignerSource::Stdin));
assert!(matches!(
parse_signer_source(ASK_KEYWORD),
SignerSource::Ask
));
let pubkey = Pubkey::new_unique();
assert!(
matches!(parse_signer_source(&pubkey.to_string()), SignerSource::Pubkey(p) if p == pubkey)
);
let path = "/absolute/path".to_string();
assert!(matches!(parse_signer_source(&path), SignerSource::Filepath(p) if p == path));
let path = "relative/path".to_string();
assert!(matches!(parse_signer_source(&path), SignerSource::Filepath(p) if p == path));
let usb = "usb://ledger".to_string();
assert!(matches!(parse_signer_source(&usb), SignerSource::Usb(u) if u == usb));
// Catchall into SignerSource::Filepath
let junk = "sometextthatisnotapubkey".to_string();
assert!(Pubkey::from_str(&junk).is_err());
assert!(matches!(parse_signer_source(&junk), SignerSource::Filepath(j) if j == junk));
}
} }

View File

@ -2994,6 +2994,7 @@ dependencies = [
"solana-sdk", "solana-sdk",
"thiserror", "thiserror",
"tiny-bip39", "tiny-bip39",
"uriparse",
"url", "url",
] ]
@ -4244,6 +4245,16 @@ version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
[[package]]
name = "uriparse"
version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e515b1ada404168e145ac55afba3c42f04cf972201a8552d42e2abb17c1b7221"
dependencies = [
"fnv",
"lazy_static",
]
[[package]] [[package]]
name = "url" name = "url"
version = "2.2.1" version = "2.2.1"