use eyre::Result;
use crate::output::OutputFormat;
fn parse_blockchain(s: &str) -> Result<circle_user_controlled_wallets::models::common::Blockchain> {
serde_json::from_str::<circle_user_controlled_wallets::models::common::Blockchain>(&format!(
"\"{}\"",
s
))
.map_err(|e| eyre::eyre!("Unrecognised blockchain '{}': {e}", s))
}
#[derive(Debug, clap::Subcommand)]
pub enum UserCommand {
CreateUser {
#[arg(long)]
user_id: String,
},
GetUser {
id: String,
},
ListUsers {
#[arg(long)]
page_size: Option<u32>,
},
GetUserToken {
#[arg(long)]
user_id: String,
},
ListWallets {
#[arg(long, env = "CIRCLE_USER_TOKEN")]
user_token: String,
#[arg(long)]
blockchain: Option<String>,
#[arg(long)]
page_size: Option<u32>,
},
GetWallet {
#[arg(long, env = "CIRCLE_USER_TOKEN")]
user_token: String,
id: String,
},
ListTransactions {
#[arg(long, env = "CIRCLE_USER_TOKEN")]
user_token: String,
#[arg(long)]
page_size: Option<u32>,
},
GetTransaction {
#[arg(long, env = "CIRCLE_USER_TOKEN")]
user_token: String,
id: String,
},
ValidateAddress {
#[arg(long)]
address: String,
#[arg(long)]
blockchain: String,
},
}
pub(crate) async fn run(
cmd: UserCommand,
api_key: &str,
base_url: &str,
output: OutputFormat,
) -> Result<()> {
let client =
circle_user_controlled_wallets::UserWalletsClient::with_base_url(api_key, base_url);
match cmd {
UserCommand::CreateUser { user_id } => {
use circle_user_controlled_wallets::models::user::CreateUserRequest;
let req = CreateUserRequest { user_id };
let result = client.create_user(&req).await.map_err(|e| eyre::eyre!("{e}"))?;
crate::output::print_result(&result, output);
Ok(())
}
UserCommand::GetUser { id } => {
let result = client.get_user(&id).await.map_err(|e| eyre::eyre!("{e}"))?;
crate::output::print_result(&result, output);
Ok(())
}
UserCommand::ListUsers { page_size } => {
use circle_user_controlled_wallets::models::{
common::PageParams, user::ListUsersParams,
};
let params = ListUsersParams {
pin_status: None,
page: PageParams { page_size, ..Default::default() },
};
let result = client.list_users(¶ms).await.map_err(|e| eyre::eyre!("{e}"))?;
crate::output::print_result(&result, output);
Ok(())
}
UserCommand::GetUserToken { user_id } => {
use circle_user_controlled_wallets::models::user::GetUserTokenRequest;
let req = GetUserTokenRequest { user_id };
let result = client.get_user_token(&req).await.map_err(|e| eyre::eyre!("{e}"))?;
crate::output::print_result(&result, output);
Ok(())
}
UserCommand::ListWallets { user_token, blockchain, page_size } => {
use circle_user_controlled_wallets::models::{
common::PageParams, wallet::ListWalletsParams,
};
let blockchain = blockchain.map(|s| parse_blockchain(&s)).transpose()?;
let params = ListWalletsParams {
blockchain,
page: PageParams { page_size, ..Default::default() },
..Default::default()
};
let result =
client.list_wallets(&user_token, ¶ms).await.map_err(|e| eyre::eyre!("{e}"))?;
crate::output::print_result(&result, output);
Ok(())
}
UserCommand::GetWallet { user_token, id } => {
let result =
client.get_wallet(&user_token, &id).await.map_err(|e| eyre::eyre!("{e}"))?;
crate::output::print_result(&result, output);
Ok(())
}
UserCommand::ListTransactions { user_token, page_size } => {
use circle_user_controlled_wallets::models::{
common::PageParams, transaction::ListTransactionsParams,
};
let params = ListTransactionsParams {
page: PageParams { page_size, ..Default::default() },
..Default::default()
};
let result = client
.list_transactions(&user_token, ¶ms)
.await
.map_err(|e| eyre::eyre!("{e}"))?;
crate::output::print_result(&result, output);
Ok(())
}
UserCommand::GetTransaction { user_token, id } => {
let result =
client.get_transaction(&user_token, &id).await.map_err(|e| eyre::eyre!("{e}"))?;
crate::output::print_result(&result, output);
Ok(())
}
UserCommand::ValidateAddress { address, blockchain } => {
use circle_user_controlled_wallets::models::transaction::ValidateAddressRequest;
let req =
ValidateAddressRequest { address, blockchain: parse_blockchain(&blockchain)? };
let result = client.validate_address(&req).await.map_err(|e| eyre::eyre!("{e}"))?;
crate::output::print_result(&result, output);
Ok(())
}
}
}