mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-13 16:21:06 +00:00
V15 Metadata: Support accessing custom types (#1106)
* work in progress * add custom types access * nit * custom values client * adjust light client * adjust doc comments * adjust book for custom values in code gen * format and check docs * use ignore in docs in book
This commit is contained in:
@@ -5,10 +5,10 @@
|
||||
use super::TryFromError;
|
||||
use crate::utils::variant_index::VariantIndex;
|
||||
use crate::{
|
||||
utils::ordered_map::OrderedMap, ArcStr, ConstantMetadata, ExtrinsicMetadata, Metadata,
|
||||
OuterEnumsMetadata, PalletMetadataInner, RuntimeApiMetadataInner, RuntimeApiMethodMetadata,
|
||||
RuntimeApiMethodParamMetadata, SignedExtensionMetadata, StorageEntryMetadata,
|
||||
StorageEntryModifier, StorageEntryType, StorageHasher, StorageMetadata,
|
||||
utils::ordered_map::OrderedMap, ArcStr, ConstantMetadata, CustomMetadata, ExtrinsicMetadata,
|
||||
Metadata, OuterEnumsMetadata, PalletMetadataInner, RuntimeApiMetadataInner,
|
||||
RuntimeApiMethodMetadata, RuntimeApiMethodParamMetadata, SignedExtensionMetadata,
|
||||
StorageEntryMetadata, StorageEntryModifier, StorageEntryType, StorageHasher, StorageMetadata,
|
||||
};
|
||||
use frame_metadata::v15;
|
||||
use scale_info::form::PortableForm;
|
||||
@@ -93,6 +93,7 @@ mod from_v15 {
|
||||
event_enum_ty: m.outer_enums.event_enum_ty.id,
|
||||
error_enum_ty: m.outer_enums.error_enum_ty.id,
|
||||
},
|
||||
custom: CustomMetadata { map: m.custom.map },
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
+42
-1
@@ -20,7 +20,7 @@ mod from_into;
|
||||
mod utils;
|
||||
|
||||
use scale_info::{form::PortableForm, PortableRegistry, Variant};
|
||||
use std::collections::HashMap;
|
||||
use std::collections::{BTreeMap, HashMap};
|
||||
use std::sync::Arc;
|
||||
use utils::ordered_map::OrderedMap;
|
||||
use utils::variant_index::VariantIndex;
|
||||
@@ -51,6 +51,8 @@ pub struct Metadata {
|
||||
dispatch_error_ty: Option<u32>,
|
||||
/// Details about each of the runtime API traits.
|
||||
apis: OrderedMap<ArcStr, RuntimeApiMetadataInner>,
|
||||
/// Allows users to add custom types to the metadata. A map that associates a string key to a `CustomValueMetadata`.
|
||||
custom: CustomMetadata,
|
||||
}
|
||||
|
||||
impl Metadata {
|
||||
@@ -132,6 +134,11 @@ impl Metadata {
|
||||
})
|
||||
}
|
||||
|
||||
/// Returns custom user defined types
|
||||
pub fn custom(&self) -> &CustomMetadata {
|
||||
&self.custom
|
||||
}
|
||||
|
||||
/// Obtain a unique hash representing this metadata or specific parts of it.
|
||||
pub fn hasher(&self) -> MetadataHasher {
|
||||
MetadataHasher::new(self)
|
||||
@@ -631,6 +638,40 @@ pub struct RuntimeApiMethodParamMetadata {
|
||||
pub ty: u32,
|
||||
}
|
||||
|
||||
/// Metadata of custom types with custom values, basically the same as `frame_metadata::v15::CustomMetadata<PortableForm>>`.
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct CustomMetadata {
|
||||
map: BTreeMap<String, frame_metadata::v15::CustomValueMetadata<PortableForm>>,
|
||||
}
|
||||
|
||||
impl CustomMetadata {
|
||||
/// Get a certain [CustomMetadataValue] by its name.
|
||||
pub fn get(&self, name: &str) -> Option<CustomMetadataValue<'_>> {
|
||||
self.map.get(name).map(|e| CustomMetadataValue {
|
||||
type_id: e.ty.id,
|
||||
data: &e.value,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/// Basically the same as `frame_metadata::v15::CustomValueMetadata<PortableForm>>`, but borrowed.
|
||||
pub struct CustomMetadataValue<'a> {
|
||||
type_id: u32,
|
||||
data: &'a [u8],
|
||||
}
|
||||
|
||||
impl<'a> CustomMetadataValue<'a> {
|
||||
/// the scale encoded value
|
||||
pub fn bytes(&self) -> &'a [u8] {
|
||||
self.data
|
||||
}
|
||||
|
||||
/// the type id in the TypeRegistry
|
||||
pub fn type_id(&self) -> u32 {
|
||||
self.type_id
|
||||
}
|
||||
}
|
||||
|
||||
// Support decoding metadata from the "wire" format directly into this.
|
||||
// Errors may be lost in the case that the metadata content is somehow invalid.
|
||||
impl codec::Decode for Metadata {
|
||||
|
||||
Reference in New Issue
Block a user