diff --git a/bin/drk/src/main.rs b/bin/drk/src/main.rs index 01915a41c..e6d7dbc2f 100644 --- a/bin/drk/src/main.rs +++ b/bin/drk/src/main.rs @@ -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) -> Result { - 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 }