use super::DefaultConfig;
use anyhow::{
anyhow,
Result,
};
use contract_extrinsics::{
fetch_contract_info,
ErrorVariant,
};
use std::fmt::Debug;
use subxt::{
Config,
OnlineClient,
};
use tokio::runtime::Runtime;
#[derive(Debug, clap::Args)]
#[clap(name = "info", about = "Get infos from a contract")]
pub struct InfoCommand {
#[clap(name = "contract", long, env = "CONTRACT")]
contract: <DefaultConfig as Config>::AccountId,
#[clap(
name = "url",
long,
value_parser,
default_value = "ws://localhost:9944"
)]
url: url::Url,
#[clap(name = "output-json", long)]
output_json: bool,
}
impl InfoCommand {
pub fn run(&self) -> Result<(), ErrorVariant> {
tracing::debug!(
"Getting contract information for AccountId {:?}",
self.contract
);
Runtime::new()?.block_on(async {
let url = self.url.clone();
let client = OnlineClient::<DefaultConfig>::from_url(url).await?;
let info_result = fetch_contract_info(&self.contract, &client).await?;
match info_result {
Some(info_to_json) => {
if self.output_json {
println!("{}", info_to_json.to_json()?);
} else {
info_to_json.basic_display_format_contract_info();
}
Ok(())
}
None => {
Err(anyhow!(
"No contract information was found for account id {}",
self.contract
)
.into())
}
}
})
}
}