use super::DefaultConfig;
use anyhow::Result;
use colored::Colorize;
use contract_extrinsics::{
ContractArtifacts,
ContractStorage,
ContractStorageRpc,
ErrorVariant,
};
use std::{
fmt::Debug,
path::PathBuf,
};
use subxt::Config;
#[derive(Debug, clap::Args)]
#[clap(name = "storage", about = "Inspect contract storage")]
pub struct StorageCommand {
#[clap(name = "contract", long, env = "CONTRACT")]
contract: <DefaultConfig as Config>::AccountId,
#[clap(long)]
raw: bool,
#[clap(value_parser, conflicts_with = "manifest_path")]
file: Option<PathBuf>,
#[clap(long, value_parser)]
manifest_path: Option<PathBuf>,
#[clap(
name = "url",
long,
value_parser,
default_value = "ws://localhost:9944"
)]
url: url::Url,
}
impl StorageCommand {
pub async fn run(&self) -> Result<(), ErrorVariant> {
let rpc = ContractStorageRpc::<DefaultConfig>::new(&self.url).await?;
let storage_layout = ContractStorage::<DefaultConfig>::new(rpc);
if self.raw {
let storage_data = storage_layout
.load_contract_storage_data(&self.contract)
.await?;
println!(
"{json}",
json = serde_json::to_string_pretty(&storage_data)?
);
return Ok(())
}
let contract_artifacts = ContractArtifacts::from_manifest_or_file(
self.manifest_path.as_ref(),
self.file.as_ref(),
);
match contract_artifacts {
Ok(contract_artifacts) => {
let ink_metadata = contract_artifacts.ink_project_metadata()?;
let contract_storage = storage_layout
.load_contract_storage_with_layout(&ink_metadata, &self.contract)
.await?;
println!(
"{json}",
json = serde_json::to_string_pretty(&contract_storage)?
);
}
Err(_) => {
eprintln!(
"{} Displaying raw storage: no valid contract metadata artifacts found",
"Info:".cyan().bold(),
);
let storage_data = storage_layout
.load_contract_storage_data(&self.contract)
.await?;
println!(
"{json}",
json = serde_json::to_string_pretty(&storage_data)?
);
return Ok(())
}
}
Ok(())
}
}