use crate::rpc::{self, auth::AuthNewParams, prelude::*};
use chrono::Duration;
use clap::Subcommand;
use super::print_rpc_res_bytes;
#[derive(Debug, Subcommand)]
pub enum AuthCommands {
CreateToken {
#[arg(short, long)]
perm: String,
#[arg(long, default_value = "2 months")]
expire_in: humantime::Duration,
},
ApiInfo {
#[arg(short, long)]
perm: String,
#[arg(long, default_value = "2 months")]
expire_in: humantime::Duration,
},
}
impl AuthCommands {
pub async fn run(self, client: rpc::Client) -> anyhow::Result<()> {
match self {
Self::CreateToken { perm, expire_in } => {
let perm: String = perm.parse()?;
let perms = AuthNewParams::process_perms(perm)?;
let token_exp = Duration::from_std(expire_in.into())?;
let res = AuthNew::call(&client, AuthNewParams { perms, token_exp }.into()).await?;
print_rpc_res_bytes(res)
}
Self::ApiInfo { perm, expire_in } => {
let perm: String = perm.parse()?;
let perms = AuthNewParams::process_perms(perm)?;
let token_exp = Duration::from_std(expire_in.into())?;
let token = String::from_utf8(
AuthNew::call(&client, AuthNewParams { perms, token_exp }.into()).await?,
)?;
let addr = multiaddr::from_url(client.base_url().as_str())?;
println!("FULLNODE_API_INFO=\"{}:{}\"", token, addr);
Ok(())
}
}
}
}