use crate::{convert::convert, metadata_wrapper::MetadataWrapper, print_magic_and_version, RuntimeInfo};
use calm_io::stdoutln;
use frame_metadata::{decode_different::DecodeDifferent, RuntimeMetadata};
use wasm_loader::Source;
use wasm_testbed::{WasmTestBed, WasmTestbedError};
pub struct Subwasm {
testbed: WasmTestBed,
runtime_info: RuntimeInfo,
}
impl Subwasm {
pub fn new(source: &Source) -> Self {
let testbed = WasmTestBed::new(source)
.map_err(|e| {
eprintln!("{}", e);
if let WasmTestbedError::Decoding(data) = e {
print_magic_and_version(&data);
}
const REPO: &str = env!("CARGO_PKG_REPOSITORY");
const NAME: &str = env!("CARGO_PKG_NAME");
const VERSION: &str = env!("CARGO_PKG_VERSION");
println!("🗣️ If you think it should have worked, please open an issue at {}/issues", REPO);
println!("and attach your runtime and mention using {} v{}", NAME, VERSION);
println!("The source was {} ", source);
panic!("Could not load runtime");
})
.unwrap();
let runtime_info = RuntimeInfo::new(&testbed);
Self { testbed, runtime_info }
}
pub fn runtime_info(&self) -> &RuntimeInfo {
&self.runtime_info
}
pub fn display_module(&self, filter: String) {
let metadata = self.testbed.runtime_metadata_prefixed();
let wrapper = MetadataWrapper(&metadata.1);
wrapper.display_single_module(&filter);
}
pub fn display_modules_list(&self) {
let metadata = self.testbed.runtime_metadata_prefixed();
let wrapper = MetadataWrapper(&metadata.1);
wrapper.display_modules_list();
}
pub fn display_metadata_json(&self) {
let pallet_filter: Option<String> = None;
let metadata = self.testbed.metadata();
let serialized = if let Some(ref pallet) = pallet_filter {
match metadata {
RuntimeMetadata::V12(v12) => {
let modules = convert(&v12.modules);
let pallet_metadata = modules
.iter()
.find(|module| module.name == DecodeDifferent::Decoded(pallet.into()))
.expect("pallet not found in metadata");
serde_json::to_string_pretty(&pallet_metadata)
}
_ => panic!("Unsupported metadata version"),
}
} else {
serde_json::to_string_pretty(&metadata)
};
let serialized = serialized.unwrap();
let _ = match stdoutln!("{}", serialized) {
Ok(_) => Ok(()),
Err(e) => match e.kind() {
std::io::ErrorKind::BrokenPipe => Ok(()),
_ => Err(e),
},
};
}
}