use clap::{Args, Subcommand};
use super::common::CommonChainArgs;
fn parse_namespace_id(s: &str) -> Result<u64, String> {
let id: u64 = s
.parse()
.map_err(|_| format!("invalid namespace id {s:?}: expected a non-negative integer"))?;
if id == 0 {
return Err("namespace id must be >= 1 (0 is reserved)".to_string());
}
Ok(id)
}
#[derive(Args, Debug)]
pub struct PublishArgs {
#[command(subcommand)]
pub command: PublishCommand,
}
#[derive(Subcommand, Debug)]
pub enum PublishCommand {
Namespace(NamespaceArgs),
Assign(AssignArgs),
Revoke(RevokeArgs),
}
#[derive(Args, Debug)]
pub struct NamespaceArgs {
#[command(subcommand)]
pub command: NamespaceCommand,
}
#[derive(Subcommand, Debug)]
pub enum NamespaceCommand {
Create(NamespaceCreateArgs),
}
#[derive(Args, Debug)]
pub struct NamespaceCreateArgs {
#[command(flatten)]
pub chain: PublishChainArgs,
}
#[derive(Args, Debug)]
pub struct AssignArgs {
#[arg(value_name = "NAMESPACE", value_parser = parse_namespace_id)]
pub namespace: u64,
#[arg(value_name = "OPERATORS", required = true, num_args = 1..)]
pub operators: Vec<String>,
#[command(flatten)]
pub chain: PublishChainArgs,
}
#[derive(Args, Debug)]
pub struct RevokeArgs {
#[arg(value_name = "NAMESPACE", value_parser = parse_namespace_id)]
pub namespace: u64,
#[arg(value_name = "OPERATOR")]
pub operator: String,
#[command(flatten)]
pub chain: PublishChainArgs,
}
#[derive(Args, Debug)]
pub struct PublishChainArgs {
#[command(flatten)]
pub common: CommonChainArgs,
#[arg(long, value_name = "ADDR")]
pub publisher_registry_address: Option<String>,
#[arg(long, value_name = "ADDR")]
pub origin_assignment_address: Option<String>,
}
#[cfg(test)]
#[allow(clippy::unwrap_used)]
mod tests;