dao-cli: use rpc client api

This commit is contained in:
ghassmo
2022-05-13 07:22:18 +03:00
parent 9f58f0aa21
commit 3dd0eeee00

View File

@@ -1,11 +1,14 @@
use async_std::sync::Arc;
use async_executor::Executor;
use clap::{IntoApp, Parser, Subcommand};
use log::debug;
use serde_json::{json, Value};
use smol::future;
use url::Url;
use darkfi::{
rpc::{jsonrpc, jsonrpc::JsonResult},
Error, Result,
rpc::{jsonrpc, rpcclient::RpcClient},
Result,
};
#[derive(Subcommand)]
@@ -25,51 +28,22 @@ pub struct CliDao {
#[clap(subcommand)]
pub command: Option<CliDaoSubCommands>,
}
pub struct Client {
url: String,
pub struct Rpc {
client: RpcClient,
}
impl Client {
pub fn new(url: String) -> Self {
Self { url }
}
async fn request(&self, r: jsonrpc::JsonRequest) -> Result<Value> {
let reply: JsonResult = match jsonrpc::send_request(&Url::parse(&self.url)?, 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(Error::JsonRpcError(e.error.message.to_string()))
}
JsonResult::Notif(n) => {
debug!(target: "RPC", "<-- {}", serde_json::to_string(&n)?);
Err(Error::JsonRpcError("Unexpected reply".to_string()))
}
}
}
impl Rpc {
// --> {"jsonrpc": "2.0", "method": "say_hello", "params": [], "id": 42}
// <-- {"jsonrpc": "2.0", "result": "hello world", "id": 42}
async fn say_hello(&self) -> Result<Value> {
let req = jsonrpc::request(json!("say_hello"), json!([]));
Ok(self.request(req).await?)
Ok(self.client.request(req).await?)
}
}
async fn start(options: CliDao) -> Result<()> {
async fn start(options: CliDao, executor: Arc<Executor<'_>>) -> Result<()> {
let rpc_addr = "tcp://127.0.0.1:7777";
let client = Client::new(rpc_addr.to_string());
let client = Rpc { client: RpcClient::new(Url::parse(rpc_addr)?, executor).await? };
match options.command {
Some(CliDaoSubCommands::Hello {}) => {
let reply = client.say_hello().await?;
@@ -101,5 +75,11 @@ async fn main() -> Result<()> {
//let config = Config::<DrkConfig>::load(config_path)?;
start(args).await
let executor = Arc::new(Executor::new());
let task = executor.spawn(start(args, executor.clone()));
// Run the executor until the task completes.
future::block_on(executor.run(task))?;
Ok(())
}