use super::ModuleTypes;
use crate::{Result, TypeRange};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Serialize, Deserialize, Default, Eq, PartialEq, Clone)]
pub struct Extrinsics {
default: ModuleTypes,
overrides: HashMap<String, Vec<TypeRange>>,
}
impl Extrinsics {
pub fn new(raw_json: &str) -> Result<Self> {
serde_json::from_str(raw_json).map_err(Into::into)
}
pub fn get_chain_types(&self, chain: &str, spec: u32) -> Option<&ModuleTypes> {
self.overrides.get(chain)?.iter().find(|f| crate::is_in_range(spec, f)).map(|o| &o.types)
}
pub fn get(&self, ty: &str, spec: u32, chain: &str) -> Option<&desub_legacy::RustTypeMarker> {
if let Some(ty) = self.get_chain_types(chain, spec).map(|c| c.get(ty)).flatten() {
Some(ty)
} else {
self.default.get(ty)
}
}
}
#[cfg(test)]
mod tests {
use super::*;
const TEST_STR: &str = r#"
{
"default": {
"Foo": "H256"
},
"overrides": {
"kusama": [
{
"minmax": [
0,
1006
],
"types": {
"Foo": "H512"
}
}
]
}
}
"#;
#[test]
fn should_deserialize_extrinsics() {
let _extrinsics: Extrinsics = Extrinsics::new(TEST_STR).unwrap();
}
}