diff --git a/crates/radicle-cli/src/terminal/args.rs b/crates/radicle-cli/src/terminal/args.rs index 19c697a0..3cb4993b 100644 --- a/crates/radicle-cli/src/terminal/args.rs +++ b/crates/radicle-cli/src/terminal/args.rs @@ -244,6 +244,21 @@ impl std::fmt::Display for BlockTarget { } } +#[derive(Debug, thiserror::Error)] +#[error("invalid Node ID specified (Node ID parsing failed with: '{nid}', DID parsing failed with: '{did}'))")] +pub(crate) struct NodeIdParseError { + did: radicle::identity::did::DidError, + nid: radicle::crypto::PublicKeyError, +} + +pub(crate) fn parse_nid(value: &str) -> Result { + value.parse::().map(NodeId::from).or_else(|did| { + value + .parse::() + .map_err(|nid| NodeIdParseError { nid, did }) + }) +} + #[derive(Clone, Debug)] pub(crate) struct ScopeParser;