bin/drk: use RpcClient

This commit is contained in:
ghassmo
2022-05-13 11:48:07 +03:00
parent e16204496b
commit 8d1402f3f1

View File

@@ -1,20 +1,16 @@
use std::{process::exit, str::FromStr, time::Instant};
use clap::{Parser, Subcommand};
use log::{debug, error};
use serde_json::{json, Value};
use log::error;
use serde_json::json;
use simplelog::{ColorChoice, TermLogger, TerminalMode};
use url::Url;
use darkfi::{
cli_desc,
crypto::address::Address,
rpc::{
jsonrpc,
jsonrpc::{JsonRequest, JsonResult},
},
rpc::{jsonrpc, rpcclient::RpcClient},
util::{cli::log_config, NetworkName},
Error::JsonRpcError,
Result,
};
@@ -93,44 +89,19 @@ enum DrkSubcommand {
}
struct Drk {
pub rpc_endpoint: Url,
pub rpc_client: RpcClient,
}
impl Drk {
async fn request(&self, r: JsonRequest, endpoint: Option<Url>) -> Result<Value> {
debug!(target: "rpc", "--> {}", serde_json::to_string(&r)?);
let ep =
if endpoint.is_some() { endpoint.unwrap().clone() } else { self.rpc_endpoint.clone() };
let reply = match jsonrpc::send_request(&ep, json!(r)).await {
Ok(v) => v,
Err(e) => return Err(e),
};
match reply {
JsonResult::Resp(r) => {
debug!(target: "rpc", "<-- {}", serde_json::to_string(&r)?);
Ok(r.result)
}
JsonResult::Err(e) => {
debug!(target: "rpc", "<-- {}", serde_json::to_string(&e)?);
Err(JsonRpcError(e.error.message.to_string()))
}
JsonResult::Notif(n) => {
debug!(target: "rpc", "<-- {}", serde_json::to_string(&n)?);
Err(JsonRpcError("Unexpected reply".to_string()))
}
}
async fn close_connection(&self) -> Result<()> {
self.rpc_client.close().await
}
async fn ping(&self) -> Result<()> {
let start = Instant::now();
let req = jsonrpc::request(json!("ping"), json!([]));
let rep = match self.request(req, None).await {
let rep = match self.rpc_client.request(req).await {
Ok(v) => v,
Err(e) => {
error!("Got an error: {}", e);
@@ -149,7 +120,7 @@ impl Drk {
address.unwrap()
} else {
let req = jsonrpc::request(json!("wallet.get_key"), json!([0_i64]));
let rep = match self.request(req, None).await {
let rep = match self.rpc_client.request(req).await {
Ok(v) => v,
Err(e) => {
error!("Error while fetching default key from wallet: {}", e);
@@ -162,7 +133,8 @@ impl Drk {
println!("Requesting airdrop for {}", addr);
let req = jsonrpc::request(json!("airdrop"), json!([json!(addr.to_string()), amount]));
let rep = match self.request(req, Some(endpoint)).await {
let rpc_client = RpcClient::new(endpoint).await?;
let rep = match rpc_client.request(req).await {
Ok(v) => v,
Err(e) => {
error!("Failed requesting airdrop: {}", e);
@@ -170,13 +142,15 @@ impl Drk {
}
};
rpc_client.close().await?;
println!("Success! Transaction ID: {}", rep);
Ok(())
}
async fn wallet_keygen(&self) -> Result<()> {
let req = jsonrpc::request(json!("wallet.keygen"), json!([]));
let rep = match self.request(req, None).await {
let rep = match self.rpc_client.request(req).await {
Ok(v) => v,
Err(e) => {
error!("Error while generating new key in wallet: {}", e);
@@ -190,7 +164,7 @@ impl Drk {
async fn wallet_balance(&self) -> Result<()> {
let req = jsonrpc::request(json!("wallet.get_balances"), json!([]));
let rep = match self.request(req, None).await {
let rep = match self.rpc_client.request(req).await {
Ok(v) => v,
Err(e) => {
error!("Error fetching balances from wallet: {}", e);
@@ -205,7 +179,7 @@ impl Drk {
async fn wallet_address(&self) -> Result<()> {
let req = jsonrpc::request(json!("wallet.get_key"), json!([0_i64]));
let rep = match self.request(req, None).await {
let rep = match self.rpc_client.request(req).await {
Ok(v) => v,
Err(e) => {
error!("Error fetching default keypair from wallet: {}", e);
@@ -219,7 +193,7 @@ impl Drk {
async fn wallet_all_addresses(&self) -> Result<()> {
let req = jsonrpc::request(json!("wallet.get_key"), json!([-1]));
let rep = match self.request(req, None).await {
let rep = match self.rpc_client.request(req).await {
Ok(v) => v,
Err(e) => {
error!("Error fetching keypairs from wallet: {}", e);
@@ -244,7 +218,7 @@ impl Drk {
json!("tx.transfer"),
json!([network.to_string(), token_id, recipient.to_string(), amount]),
);
let rep = match self.request(req, None).await {
let rep = match self.rpc_client.request(req).await {
Ok(v) => v,
Err(e) => {
error!("Error building and sending transaction: {}", e);
@@ -264,7 +238,8 @@ async fn main() -> Result<()> {
let (lvl, conf) = log_config(args.verbose.into())?;
TermLogger::init(lvl, conf, TerminalMode::Mixed, ColorChoice::Auto)?;
let drk = Drk { rpc_endpoint: args.endpoint };
let rpc_client = RpcClient::new(args.endpoint).await?;
let drk = Drk { rpc_client };
match args.command {
DrkSubcommand::Ping => drk.ping().await,
@@ -297,5 +272,7 @@ async fn main() -> Result<()> {
DrkSubcommand::Transfer { recipient, amount, network, token_id } => {
drk.tx_transfer(network, token_id, recipient, amount).await
}
}
}?;
drk.close_connection().await
}