use contract_build::name_value_println;
use contract_extrinsics::{
ErrorVariant,
RawParams,
RpcRequest,
};
use subxt::ext::scale_value;
use super::{
CLIChainOpts,
MAX_KEY_COL_WIDTH,
};
#[derive(Debug, clap::Args)]
#[clap(name = "rpc", about = "Make a raw RPC call")]
pub struct RpcCommand {
method: String,
#[clap(num_args = 0..)]
params: Vec<String>,
#[clap(long)]
output_json: bool,
#[clap(flatten)]
chain_cli_opts: CLIChainOpts,
}
impl RpcCommand {
pub async fn run(&self) -> Result<(), ErrorVariant> {
let request = RpcRequest::new(&self.chain_cli_opts.chain().url()).await?;
let params = RawParams::new(&self.params)?;
let result = request.raw_call(&self.method, params).await;
match (result, self.output_json) {
(Err(err), false) => Err(anyhow::anyhow!("Method call failed: {err}"))?,
(Err(err), true) => {
Err(anyhow::anyhow!(serde_json::to_string_pretty(
&ErrorVariant::from(err)
)?))?
}
(Ok(res), false) => {
let output: scale_value::Value = serde_json::from_str(res.get())?;
name_value_println!("Result", output, MAX_KEY_COL_WIDTH);
Ok(())
}
(Ok(res), true) => {
let json: serde_json::Value = serde_json::from_str(res.get())?;
println!("{}", serde_json::to_string_pretty(&json)?);
Ok(())
}
}
}
}