use crate::types::storage_types;
use desub_current::scale_info::TypeDefPrimitive;
use desub_current::{
scale_info::form::{Form, PortableForm},
Metadata,
};
type TypeDef = desub_current::scale_info::TypeDef<PortableForm>;
use frame_metadata::v14::StorageEntryType;
#[derive(Debug, PartialEq)]
pub struct storage_map_info {
pub pallet_name: String,
pub storage_item_name: String, pub type_id: u32,
pub raw_type: desub_current::scale_info::TypeDef<PortableForm>,
pub storage_type: storage_types,
}
#[derive(Debug)]
pub struct pallet_storage_diff {
pub old_type: storage_map_info,
pub new_type: storage_map_info,
}
struct MyTypeDef;
impl Default for MyTypeDef {
fn default() -> Self {
MyTypeDef }
}
impl Form for MyTypeDef {
type Type = PortableForm;
type String = String;
}
type TypeDef2 = desub_current::scale_info::TypeDef<MyTypeDef>;
impl storage_map_info {
fn new_empty() -> storage_map_info {
let default_value = create_default_type_def();
storage_map_info {
pallet_name: "not set".to_string(),
storage_item_name: "not set".to_string(),
type_id: 0,
storage_type: storage_types::Unknown,
raw_type: default_value,
}
}
}
fn create_default_type_def() -> desub_current::scale_info::TypeDef<PortableForm> {
TypeDef::Primitive(TypeDefPrimitive::Bool)
}
#[maybe_async::maybe_async(?Send)]
pub async fn parse_pallet_storage_types(
raw_metadata: Vec<u8>,
) -> anyhow::Result<Vec<storage_map_info>> {
let metadata_polkadot_scale: &[u8] = &raw_metadata;
let metadata: Metadata = Metadata::from_bytes(metadata_polkadot_scale).expect("valid metadata");
let storage_types = metadata.types.clone();
let og_types = storage_types.types();
let storage_entries = metadata.get_storage_entries();
let mut pallet_list: Vec<storage_map_info> = vec![];
for item in storage_entries {
let current_pallet_name = item.prefix();
for entry_to_scan in item.entries() {
let mut pallet_info: storage_map_info = storage_map_info::new_empty();
pallet_info.pallet_name = current_pallet_name.clone().to_string();
pallet_info.storage_item_name = entry_to_scan.name.clone();
let storage_ent = &entry_to_scan.ty.to_owned();
match storage_ent {
StorageEntryType::Plain(varde) => {
pallet_info.storage_type = storage_types::StorageValue;
pallet_info.type_id = varde.id();
}
StorageEntryType::Map {
hashers: _,
key: _,
value,
} => {
pallet_info.type_id = value.id();
pallet_info.storage_type = storage_types::StorageMap;
}
_ => {
pallet_info.storage_type = storage_types::Unknown;
}
} for co in og_types.iter() {
if co.id() == pallet_info.type_id {
pallet_info.raw_type = co.ty().type_def().clone();
}
}
pallet_list.push(pallet_info);
}
}
Ok(pallet_list)
}