mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-12 07:41:08 +00:00
Expose instancing in metadata (#3188)
* Expose instancing in metadata - Introduces metadata v7 - If a module is using instancing, the storage exposes the instance in metadata - Metadata module name is now the upper case one given to `construct_runtime!` * Remove obsolete macro * Just expose one prefix * Bump spec * Fix prefix generation
This commit is contained in:
Generated
+1
@@ -4009,6 +4009,7 @@ name = "srml-support-test"
|
|||||||
version = "2.0.0"
|
version = "2.0.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"parity-codec 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"sr-io 2.0.0",
|
"sr-io 2.0.0",
|
||||||
"srml-support 2.0.0",
|
"srml-support 2.0.0",
|
||||||
|
|||||||
@@ -75,8 +75,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion {
|
|||||||
// and set impl_version to equal spec_version. If only runtime
|
// and set impl_version to equal spec_version. If only runtime
|
||||||
// implementation changes and behavior does not, then leave spec_version as
|
// implementation changes and behavior does not, then leave spec_version as
|
||||||
// is and increment impl_version.
|
// is and increment impl_version.
|
||||||
spec_version: 118,
|
spec_version: 119,
|
||||||
impl_version: 118,
|
impl_version: 119,
|
||||||
apis: RUNTIME_API_VERSIONS,
|
apis: RUNTIME_API_VERSIONS,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -286,6 +286,15 @@ pub enum StorageEntryModifier {
|
|||||||
Default,
|
Default,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// All metadata of the storage.
|
||||||
|
#[derive(Clone, PartialEq, Eq, Encode)]
|
||||||
|
#[cfg_attr(feature = "std", derive(Decode, Debug, Serialize))]
|
||||||
|
pub struct StorageMetadata {
|
||||||
|
/// The common prefix used by all storage entries.
|
||||||
|
pub prefix: DecodeDifferent<&'static str, StringBuf>,
|
||||||
|
pub entries: DecodeDifferent<&'static [StorageEntryMetadata], Vec<StorageEntryMetadata>>,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Eq, Encode, PartialEq)]
|
#[derive(Eq, Encode, PartialEq)]
|
||||||
#[cfg_attr(feature = "std", derive(Decode, Debug, Serialize))]
|
#[cfg_attr(feature = "std", derive(Decode, Debug, Serialize))]
|
||||||
/// Metadata prefixed by a u32 for reserved usage
|
/// Metadata prefixed by a u32 for reserved usage
|
||||||
@@ -309,8 +318,10 @@ pub enum RuntimeMetadata {
|
|||||||
V4(RuntimeMetadataDeprecated),
|
V4(RuntimeMetadataDeprecated),
|
||||||
/// Version 5 for runtime metadata. No longer used.
|
/// Version 5 for runtime metadata. No longer used.
|
||||||
V5(RuntimeMetadataDeprecated),
|
V5(RuntimeMetadataDeprecated),
|
||||||
/// Version 6 for runtime metadata.
|
/// Version 6 for runtime metadata. No longer used.
|
||||||
V6(RuntimeMetadataV6),
|
V6(RuntimeMetadataDeprecated),
|
||||||
|
/// Version 7 for runtime metadata.
|
||||||
|
V7(RuntimeMetadataV7),
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Enum that should fail.
|
/// Enum that should fail.
|
||||||
@@ -332,17 +343,19 @@ impl Decode for RuntimeMetadataDeprecated {
|
|||||||
/// The metadata of a runtime.
|
/// The metadata of a runtime.
|
||||||
#[derive(Eq, Encode, PartialEq)]
|
#[derive(Eq, Encode, PartialEq)]
|
||||||
#[cfg_attr(feature = "std", derive(Decode, Debug, Serialize))]
|
#[cfg_attr(feature = "std", derive(Decode, Debug, Serialize))]
|
||||||
pub struct RuntimeMetadataV6 {
|
pub struct RuntimeMetadataV7 {
|
||||||
pub modules: DecodeDifferentArray<ModuleMetadata>,
|
pub modules: DecodeDifferentArray<ModuleMetadata>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The latest version of the metadata.
|
||||||
|
pub type RuntimeMetadataLastVersion = RuntimeMetadataV7;
|
||||||
|
|
||||||
/// All metadata about an runtime module.
|
/// All metadata about an runtime module.
|
||||||
#[derive(Clone, PartialEq, Eq, Encode)]
|
#[derive(Clone, PartialEq, Eq, Encode)]
|
||||||
#[cfg_attr(feature = "std", derive(Decode, Debug, Serialize))]
|
#[cfg_attr(feature = "std", derive(Decode, Debug, Serialize))]
|
||||||
pub struct ModuleMetadata {
|
pub struct ModuleMetadata {
|
||||||
pub name: DecodeDifferentStr,
|
pub name: DecodeDifferentStr,
|
||||||
pub prefix: DecodeDifferent<FnEncode<&'static str>, StringBuf>,
|
pub storage: Option<DecodeDifferent<FnEncode<StorageMetadata>, StorageMetadata>>,
|
||||||
pub storage: ODFnA<StorageEntryMetadata>,
|
|
||||||
pub calls: ODFnA<FunctionMetadata>,
|
pub calls: ODFnA<FunctionMetadata>,
|
||||||
pub event: ODFnA<EventMetadata>,
|
pub event: ODFnA<EventMetadata>,
|
||||||
pub constants: DFnA<ModuleConstantMetadata>,
|
pub constants: DFnA<ModuleConstantMetadata>,
|
||||||
@@ -357,8 +370,8 @@ impl Into<primitives::OpaqueMetadata> for RuntimeMetadataPrefixed {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Into<RuntimeMetadataPrefixed> for RuntimeMetadata {
|
impl Into<RuntimeMetadataPrefixed> for RuntimeMetadataLastVersion {
|
||||||
fn into(self) -> RuntimeMetadataPrefixed {
|
fn into(self) -> RuntimeMetadataPrefixed {
|
||||||
RuntimeMetadataPrefixed(META_RESERVED, self)
|
RuntimeMetadataPrefixed(META_RESERVED, RuntimeMetadata::V7(self))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -138,13 +138,14 @@ pub fn decl_storage_impl(input: TokenStream) -> TokenStream {
|
|||||||
&instance_opts.instance,
|
&instance_opts.instance,
|
||||||
&storage_lines,
|
&storage_lines,
|
||||||
);
|
);
|
||||||
let (store_default_struct, store_functions_to_metadata) = store_functions_to_metadata(
|
let (store_default_struct, store_metadata) = store_functions_to_metadata(
|
||||||
&scrate,
|
&scrate,
|
||||||
&traitinstance,
|
&traitinstance,
|
||||||
&traittype,
|
&traittype,
|
||||||
&instance_opts,
|
&instance_opts,
|
||||||
&storage_lines,
|
&storage_lines,
|
||||||
&where_clause,
|
&where_clause,
|
||||||
|
&cratename,
|
||||||
);
|
);
|
||||||
|
|
||||||
let InstanceOpts {
|
let InstanceOpts {
|
||||||
@@ -153,7 +154,6 @@ pub fn decl_storage_impl(input: TokenStream) -> TokenStream {
|
|||||||
..
|
..
|
||||||
} = instance_opts;
|
} = instance_opts;
|
||||||
|
|
||||||
let cratename_string = cratename.to_string();
|
|
||||||
let expanded = quote! {
|
let expanded = quote! {
|
||||||
#scrate_decl
|
#scrate_decl
|
||||||
#decl_storage_items
|
#decl_storage_items
|
||||||
@@ -171,12 +171,8 @@ pub fn decl_storage_impl(input: TokenStream) -> TokenStream {
|
|||||||
{
|
{
|
||||||
#impl_store_fns
|
#impl_store_fns
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
pub fn store_metadata_functions() -> &'static [#scrate::metadata::StorageEntryMetadata] {
|
pub fn storage_metadata() -> #scrate::metadata::StorageMetadata {
|
||||||
#store_functions_to_metadata
|
#store_metadata
|
||||||
}
|
|
||||||
#[doc(hidden)]
|
|
||||||
pub fn store_metadata_name() -> &'static str {
|
|
||||||
#cratename_string
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -583,22 +579,25 @@ fn decl_store_extra_genesis(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn create_and_impl_instance(
|
fn create_and_impl_instance(
|
||||||
prefix: &str,
|
instance_prefix: &str,
|
||||||
ident: &Ident,
|
ident: &Ident,
|
||||||
doc: &TokenStream2,
|
doc: &TokenStream2,
|
||||||
const_names: &[(Ident, String)],
|
const_names: &[(Ident, String)],
|
||||||
scrate: &TokenStream2,
|
scrate: &TokenStream2,
|
||||||
instantiable: &Ident,
|
instantiable: &Ident,
|
||||||
|
cratename: &Ident,
|
||||||
) -> TokenStream2 {
|
) -> TokenStream2 {
|
||||||
let mut const_impls = TokenStream2::new();
|
let mut const_impls = TokenStream2::new();
|
||||||
|
|
||||||
for (const_name, partial_const_value) in const_names {
|
for (const_name, partial_const_value) in const_names {
|
||||||
let const_value = format!("{}{}", partial_const_value, prefix);
|
let const_value = format!("{}{}", instance_prefix, partial_const_value);
|
||||||
const_impls.extend(quote! {
|
const_impls.extend(quote! {
|
||||||
const #const_name: &'static str = #const_value;
|
const #const_name: &'static str = #const_value;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let prefix = format!("{}{}", instance_prefix, cratename.to_string());
|
||||||
|
|
||||||
quote! {
|
quote! {
|
||||||
// Those trait are derived because of wrong bounds for generics
|
// Those trait are derived because of wrong bounds for generics
|
||||||
#[cfg_attr(feature = "std", derive(Debug))]
|
#[cfg_attr(feature = "std", derive(Debug))]
|
||||||
@@ -606,6 +605,7 @@ fn create_and_impl_instance(
|
|||||||
#doc
|
#doc
|
||||||
pub struct #ident;
|
pub struct #ident;
|
||||||
impl #instantiable for #ident {
|
impl #instantiable for #ident {
|
||||||
|
const PREFIX: &'static str = #prefix;
|
||||||
#const_impls
|
#const_impls
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -620,7 +620,6 @@ fn decl_storage_items(
|
|||||||
storage_lines: &ext::Punctuated<DeclStorageLine, Token![;]>,
|
storage_lines: &ext::Punctuated<DeclStorageLine, Token![;]>,
|
||||||
where_clause: &Option<WhereClause>,
|
where_clause: &Option<WhereClause>,
|
||||||
) -> TokenStream2 {
|
) -> TokenStream2 {
|
||||||
|
|
||||||
let mut impls = TokenStream2::new();
|
let mut impls = TokenStream2::new();
|
||||||
|
|
||||||
let InstanceOpts {
|
let InstanceOpts {
|
||||||
@@ -686,6 +685,8 @@ fn decl_storage_items(
|
|||||||
/// Defines storage prefixes, they must be unique.
|
/// Defines storage prefixes, they must be unique.
|
||||||
#hide
|
#hide
|
||||||
pub trait #instantiable: 'static {
|
pub trait #instantiable: 'static {
|
||||||
|
/// The prefix used by any storage entry of an instance.
|
||||||
|
const PREFIX: &'static str;
|
||||||
#const_impls
|
#const_impls
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -707,9 +708,11 @@ fn decl_storage_items(
|
|||||||
);
|
);
|
||||||
|
|
||||||
// Impl Instance trait for instances
|
// Impl Instance trait for instances
|
||||||
for (prefix, ident, doc) in instances {
|
for (instance_prefix, ident, doc) in instances {
|
||||||
impls.extend(
|
impls.extend(
|
||||||
create_and_impl_instance(&prefix, &ident, &doc, &const_names, scrate, &instantiable)
|
create_and_impl_instance(
|
||||||
|
&instance_prefix, &ident, &doc, &const_names, scrate, &instantiable, cratename
|
||||||
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -725,7 +728,13 @@ fn decl_storage_items(
|
|||||||
} else {
|
} else {
|
||||||
impls.extend(
|
impls.extend(
|
||||||
create_and_impl_instance(
|
create_and_impl_instance(
|
||||||
"", &inherent_instance, "e!(#[doc(hidden)]), &const_names, scrate, &instantiable
|
"",
|
||||||
|
&inherent_instance,
|
||||||
|
"e!(#[doc(hidden)]),
|
||||||
|
&const_names,
|
||||||
|
scrate,
|
||||||
|
&instantiable,
|
||||||
|
cratename,
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -780,10 +789,7 @@ fn decl_storage_items(
|
|||||||
impls
|
impls
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn decl_store_items(storage_lines: &ext::Punctuated<DeclStorageLine, Token![;]>) -> TokenStream2 {
|
||||||
fn decl_store_items(
|
|
||||||
storage_lines: &ext::Punctuated<DeclStorageLine, Token![;]>,
|
|
||||||
) -> TokenStream2 {
|
|
||||||
storage_lines.inner.iter().map(|sline| &sline.name)
|
storage_lines.inner.iter().map(|sline| &sline.name)
|
||||||
.fold(TokenStream2::new(), |mut items, name| {
|
.fold(TokenStream2::new(), |mut items, name| {
|
||||||
items.extend(quote!(type #name;));
|
items.extend(quote!(type #name;));
|
||||||
@@ -933,8 +939,8 @@ fn store_functions_to_metadata (
|
|||||||
instance_opts: &InstanceOpts,
|
instance_opts: &InstanceOpts,
|
||||||
storage_lines: &ext::Punctuated<DeclStorageLine, Token![;]>,
|
storage_lines: &ext::Punctuated<DeclStorageLine, Token![;]>,
|
||||||
where_clause: &Option<WhereClause>,
|
where_clause: &Option<WhereClause>,
|
||||||
|
cratename: &Ident,
|
||||||
) -> (TokenStream2, TokenStream2) {
|
) -> (TokenStream2, TokenStream2) {
|
||||||
|
|
||||||
let InstanceOpts {
|
let InstanceOpts {
|
||||||
comma_instance,
|
comma_instance,
|
||||||
equal_default_instance,
|
equal_default_instance,
|
||||||
@@ -1077,11 +1083,14 @@ fn store_functions_to_metadata (
|
|||||||
|
|
||||||
default_getter_struct_def.extend(def_get);
|
default_getter_struct_def.extend(def_get);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let prefix = cratename.to_string();
|
||||||
|
let prefix = instance.as_ref().map_or_else(|| quote!(#prefix), |i| quote!(#i::PREFIX));
|
||||||
|
|
||||||
(default_getter_struct_def, quote!{
|
(default_getter_struct_def, quote!{
|
||||||
{
|
#scrate::metadata::StorageMetadata {
|
||||||
&[
|
prefix: #scrate::metadata::DecodeDifferent::Encode(#prefix),
|
||||||
#items
|
entries: #scrate::metadata::DecodeDifferent::Encode(&[ #items ][..]),
|
||||||
]
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,8 +37,8 @@ fn generate_hidden_includes_mod_name(unique_id: &str) -> Ident {
|
|||||||
|
|
||||||
/// Generates the access to the `srml-support` crate.
|
/// Generates the access to the `srml-support` crate.
|
||||||
pub fn generate_crate_access(unique_id: &str, def_crate: &str) -> TokenStream {
|
pub fn generate_crate_access(unique_id: &str, def_crate: &str) -> TokenStream {
|
||||||
if ::std::env::var("CARGO_PKG_NAME").unwrap() == def_crate {
|
if std::env::var("CARGO_PKG_NAME").unwrap() == def_crate {
|
||||||
quote::quote!( crate )
|
quote::quote!( srml_support )
|
||||||
} else {
|
} else {
|
||||||
let mod_name = generate_hidden_includes_mod_name(unique_id);
|
let mod_name = generate_hidden_includes_mod_name(unique_id);
|
||||||
quote::quote!( self::#mod_name::hidden_include )
|
quote::quote!( self::#mod_name::hidden_include )
|
||||||
|
|||||||
+113
-106
@@ -18,6 +18,9 @@
|
|||||||
|
|
||||||
#![cfg_attr(not(feature = "std"), no_std)]
|
#![cfg_attr(not(feature = "std"), no_std)]
|
||||||
|
|
||||||
|
/// Export ourself as `srml_support` to make tests happy.
|
||||||
|
extern crate self as srml_support;
|
||||||
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate bitmask;
|
extern crate bitmask;
|
||||||
|
|
||||||
@@ -251,9 +254,8 @@ mod tests {
|
|||||||
use codec::Codec;
|
use codec::Codec;
|
||||||
use runtime_io::{with_externalities, Blake2Hasher};
|
use runtime_io::{with_externalities, Blake2Hasher};
|
||||||
pub use srml_metadata::{
|
pub use srml_metadata::{
|
||||||
DecodeDifferent, StorageEntryMetadata,
|
DecodeDifferent, StorageEntryMetadata, StorageMetadata, StorageEntryType,
|
||||||
StorageEntryType, StorageEntryModifier,
|
StorageEntryModifier, DefaultByte, DefaultByteGetter, StorageHasher
|
||||||
DefaultByte, DefaultByteGetter, StorageHasher
|
|
||||||
};
|
};
|
||||||
pub use rstd::marker::PhantomData;
|
pub use rstd::marker::PhantomData;
|
||||||
|
|
||||||
@@ -431,112 +433,117 @@ mod tests {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const EXPECTED_METADATA: &[StorageEntryMetadata] = &[
|
const EXPECTED_METADATA: StorageMetadata = StorageMetadata {
|
||||||
StorageEntryMetadata {
|
prefix: DecodeDifferent::Encode("Example"),
|
||||||
name: DecodeDifferent::Encode("Data"),
|
entries: DecodeDifferent::Encode(
|
||||||
modifier: StorageEntryModifier::Default,
|
&[
|
||||||
ty: StorageEntryType::Map{
|
StorageEntryMetadata {
|
||||||
hasher: StorageHasher::Twox64Concat,
|
name: DecodeDifferent::Encode("Data"),
|
||||||
key: DecodeDifferent::Encode("u32"), value: DecodeDifferent::Encode("u64"), is_linked: true
|
modifier: StorageEntryModifier::Default,
|
||||||
},
|
ty: StorageEntryType::Map{
|
||||||
default: DecodeDifferent::Encode(
|
hasher: StorageHasher::Twox64Concat,
|
||||||
DefaultByteGetter(&__GetByteStructData(PhantomData::<Test>))
|
key: DecodeDifferent::Encode("u32"), value: DecodeDifferent::Encode("u64"), is_linked: true
|
||||||
),
|
},
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
default: DecodeDifferent::Encode(
|
||||||
},
|
DefaultByteGetter(&__GetByteStructData(PhantomData::<Test>))
|
||||||
StorageEntryMetadata {
|
),
|
||||||
name: DecodeDifferent::Encode("GenericData"),
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
modifier: StorageEntryModifier::Default,
|
},
|
||||||
ty: StorageEntryType::Map{
|
StorageEntryMetadata {
|
||||||
hasher: StorageHasher::Twox128,
|
name: DecodeDifferent::Encode("GenericData"),
|
||||||
key: DecodeDifferent::Encode("T::BlockNumber"),
|
modifier: StorageEntryModifier::Default,
|
||||||
value: DecodeDifferent::Encode("T::BlockNumber"),
|
ty: StorageEntryType::Map{
|
||||||
is_linked: true
|
hasher: StorageHasher::Twox128,
|
||||||
},
|
key: DecodeDifferent::Encode("T::BlockNumber"),
|
||||||
default: DecodeDifferent::Encode(
|
value: DecodeDifferent::Encode("T::BlockNumber"),
|
||||||
DefaultByteGetter(&__GetByteStructGenericData(PhantomData::<Test>))
|
is_linked: true
|
||||||
),
|
},
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
default: DecodeDifferent::Encode(
|
||||||
},
|
DefaultByteGetter(&__GetByteStructGenericData(PhantomData::<Test>))
|
||||||
StorageEntryMetadata {
|
),
|
||||||
name: DecodeDifferent::Encode("GenericData2"),
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
modifier: StorageEntryModifier::Optional,
|
},
|
||||||
ty: StorageEntryType::Map{
|
StorageEntryMetadata {
|
||||||
hasher: StorageHasher::Blake2_256,
|
name: DecodeDifferent::Encode("GenericData2"),
|
||||||
key: DecodeDifferent::Encode("T::BlockNumber"),
|
modifier: StorageEntryModifier::Optional,
|
||||||
value: DecodeDifferent::Encode("T::BlockNumber"),
|
ty: StorageEntryType::Map{
|
||||||
is_linked: true
|
hasher: StorageHasher::Blake2_256,
|
||||||
},
|
key: DecodeDifferent::Encode("T::BlockNumber"),
|
||||||
default: DecodeDifferent::Encode(
|
value: DecodeDifferent::Encode("T::BlockNumber"),
|
||||||
DefaultByteGetter(&__GetByteStructGenericData2(PhantomData::<Test>))
|
is_linked: true
|
||||||
),
|
},
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
default: DecodeDifferent::Encode(
|
||||||
},
|
DefaultByteGetter(&__GetByteStructGenericData2(PhantomData::<Test>))
|
||||||
StorageEntryMetadata {
|
),
|
||||||
name: DecodeDifferent::Encode("DataDM"),
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
modifier: StorageEntryModifier::Default,
|
},
|
||||||
ty: StorageEntryType::DoubleMap{
|
StorageEntryMetadata {
|
||||||
hasher: StorageHasher::Twox64Concat,
|
name: DecodeDifferent::Encode("DataDM"),
|
||||||
key1: DecodeDifferent::Encode("u32"),
|
modifier: StorageEntryModifier::Default,
|
||||||
key2: DecodeDifferent::Encode("u32"),
|
ty: StorageEntryType::DoubleMap{
|
||||||
value: DecodeDifferent::Encode("u64"),
|
hasher: StorageHasher::Twox64Concat,
|
||||||
key2_hasher: StorageHasher::Blake2_256,
|
key1: DecodeDifferent::Encode("u32"),
|
||||||
},
|
key2: DecodeDifferent::Encode("u32"),
|
||||||
default: DecodeDifferent::Encode(
|
value: DecodeDifferent::Encode("u64"),
|
||||||
DefaultByteGetter(&__GetByteStructDataDM(PhantomData::<Test>))
|
key2_hasher: StorageHasher::Blake2_256,
|
||||||
),
|
},
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
default: DecodeDifferent::Encode(
|
||||||
},
|
DefaultByteGetter(&__GetByteStructDataDM(PhantomData::<Test>))
|
||||||
StorageEntryMetadata {
|
),
|
||||||
name: DecodeDifferent::Encode("GenericDataDM"),
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
modifier: StorageEntryModifier::Default,
|
},
|
||||||
ty: StorageEntryType::DoubleMap{
|
StorageEntryMetadata {
|
||||||
hasher: StorageHasher::Blake2_256,
|
name: DecodeDifferent::Encode("GenericDataDM"),
|
||||||
key1: DecodeDifferent::Encode("T::BlockNumber"),
|
modifier: StorageEntryModifier::Default,
|
||||||
key2: DecodeDifferent::Encode("T::BlockNumber"),
|
ty: StorageEntryType::DoubleMap{
|
||||||
value: DecodeDifferent::Encode("T::BlockNumber"),
|
hasher: StorageHasher::Blake2_256,
|
||||||
key2_hasher: StorageHasher::Twox128,
|
key1: DecodeDifferent::Encode("T::BlockNumber"),
|
||||||
},
|
key2: DecodeDifferent::Encode("T::BlockNumber"),
|
||||||
default: DecodeDifferent::Encode(
|
value: DecodeDifferent::Encode("T::BlockNumber"),
|
||||||
DefaultByteGetter(&__GetByteStructGenericDataDM(PhantomData::<Test>))
|
key2_hasher: StorageHasher::Twox128,
|
||||||
),
|
},
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
default: DecodeDifferent::Encode(
|
||||||
},
|
DefaultByteGetter(&__GetByteStructGenericDataDM(PhantomData::<Test>))
|
||||||
StorageEntryMetadata {
|
),
|
||||||
name: DecodeDifferent::Encode("GenericData2DM"),
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
modifier: StorageEntryModifier::Optional,
|
},
|
||||||
ty: StorageEntryType::DoubleMap{
|
StorageEntryMetadata {
|
||||||
hasher: StorageHasher::Blake2_256,
|
name: DecodeDifferent::Encode("GenericData2DM"),
|
||||||
key1: DecodeDifferent::Encode("T::BlockNumber"),
|
modifier: StorageEntryModifier::Optional,
|
||||||
key2: DecodeDifferent::Encode("T::BlockNumber"),
|
ty: StorageEntryType::DoubleMap{
|
||||||
value: DecodeDifferent::Encode("T::BlockNumber"),
|
hasher: StorageHasher::Blake2_256,
|
||||||
key2_hasher: StorageHasher::Twox256,
|
key1: DecodeDifferent::Encode("T::BlockNumber"),
|
||||||
},
|
key2: DecodeDifferent::Encode("T::BlockNumber"),
|
||||||
default: DecodeDifferent::Encode(
|
value: DecodeDifferent::Encode("T::BlockNumber"),
|
||||||
DefaultByteGetter(&__GetByteStructGenericData2DM(PhantomData::<Test>))
|
key2_hasher: StorageHasher::Twox256,
|
||||||
),
|
},
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
default: DecodeDifferent::Encode(
|
||||||
},
|
DefaultByteGetter(&__GetByteStructGenericData2DM(PhantomData::<Test>))
|
||||||
StorageEntryMetadata {
|
),
|
||||||
name: DecodeDifferent::Encode("AppendableDM"),
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
modifier: StorageEntryModifier::Default,
|
},
|
||||||
ty: StorageEntryType::DoubleMap{
|
StorageEntryMetadata {
|
||||||
hasher: StorageHasher::Blake2_256,
|
name: DecodeDifferent::Encode("AppendableDM"),
|
||||||
key1: DecodeDifferent::Encode("u32"),
|
modifier: StorageEntryModifier::Default,
|
||||||
key2: DecodeDifferent::Encode("T::BlockNumber"),
|
ty: StorageEntryType::DoubleMap{
|
||||||
value: DecodeDifferent::Encode("Vec<u32>"),
|
hasher: StorageHasher::Blake2_256,
|
||||||
key2_hasher: StorageHasher::Blake2_256,
|
key1: DecodeDifferent::Encode("u32"),
|
||||||
},
|
key2: DecodeDifferent::Encode("T::BlockNumber"),
|
||||||
default: DecodeDifferent::Encode(
|
value: DecodeDifferent::Encode("Vec<u32>"),
|
||||||
DefaultByteGetter(&__GetByteStructGenericData2DM(PhantomData::<Test>))
|
key2_hasher: StorageHasher::Blake2_256,
|
||||||
),
|
},
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
default: DecodeDifferent::Encode(
|
||||||
},
|
DefaultByteGetter(&__GetByteStructGenericData2DM(PhantomData::<Test>))
|
||||||
];
|
),
|
||||||
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
|
},
|
||||||
|
]
|
||||||
|
),
|
||||||
|
};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn store_metadata() {
|
fn store_metadata() {
|
||||||
let metadata = Module::<Test>::store_metadata_functions();
|
let metadata = Module::<Test>::storage_metadata();
|
||||||
assert_eq!(EXPECTED_METADATA, metadata);
|
assert_eq!(EXPECTED_METADATA, metadata);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,16 +15,42 @@
|
|||||||
// along with Substrate. If not, see <http://www.gnu.org/licenses/>.
|
// along with Substrate. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
pub use srml_metadata::{
|
pub use srml_metadata::{
|
||||||
DecodeDifferent, FnEncode, RuntimeMetadata, ModuleMetadata, RuntimeMetadataV6,
|
DecodeDifferent, FnEncode, RuntimeMetadata, ModuleMetadata, RuntimeMetadataLastVersion,
|
||||||
DefaultByteGetter, RuntimeMetadataPrefixed, StorageEntryMetadata,
|
DefaultByteGetter, RuntimeMetadataPrefixed, StorageEntryMetadata, StorageMetadata,
|
||||||
StorageEntryType, StorageEntryModifier, DefaultByte, StorageHasher
|
StorageEntryType, StorageEntryModifier, DefaultByte, StorageHasher
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Implements the metadata support for the given runtime and all its modules.
|
/// Implements the metadata support for the given runtime and all its modules.
|
||||||
///
|
///
|
||||||
/// Example:
|
/// Example:
|
||||||
/// ```compile_fail
|
/// ```
|
||||||
/// impl_runtime_metadata!(for RUNTIME_NAME with modules MODULE0, MODULE2, MODULE3 with Storage);
|
///# mod module0 {
|
||||||
|
///# pub trait Trait {
|
||||||
|
///# type Origin;
|
||||||
|
///# type BlockNumber;
|
||||||
|
///# }
|
||||||
|
///# srml_support::decl_module! {
|
||||||
|
///# pub struct Module<T: Trait> for enum Call where origin: T::Origin {}
|
||||||
|
///# }
|
||||||
|
///#
|
||||||
|
///# srml_support::decl_storage! {
|
||||||
|
///# trait Store for Module<T: Trait> as TestStorage {}
|
||||||
|
///# }
|
||||||
|
///# }
|
||||||
|
///# use module0 as module1;
|
||||||
|
///# use module0 as module2;
|
||||||
|
///# impl module0::Trait for Runtime {
|
||||||
|
///# type Origin = u32;
|
||||||
|
///# type BlockNumber = u32;
|
||||||
|
///# }
|
||||||
|
///
|
||||||
|
/// struct Runtime;
|
||||||
|
/// srml_support::impl_runtime_metadata! {
|
||||||
|
/// for Runtime with modules
|
||||||
|
/// module0::Module as Module0 with,
|
||||||
|
/// module1::Module as Module1 with,
|
||||||
|
/// module2::Module as Module2 with Storage,
|
||||||
|
/// };
|
||||||
/// ```
|
/// ```
|
||||||
///
|
///
|
||||||
/// In this example, just `MODULE3` implements the `Storage` trait.
|
/// In this example, just `MODULE3` implements the `Storage` trait.
|
||||||
@@ -36,11 +62,9 @@ macro_rules! impl_runtime_metadata {
|
|||||||
) => {
|
) => {
|
||||||
impl $runtime {
|
impl $runtime {
|
||||||
pub fn metadata() -> $crate::metadata::RuntimeMetadataPrefixed {
|
pub fn metadata() -> $crate::metadata::RuntimeMetadataPrefixed {
|
||||||
$crate::metadata::RuntimeMetadata::V6 (
|
$crate::metadata::RuntimeMetadataLastVersion {
|
||||||
$crate::metadata::RuntimeMetadataV6 {
|
|
||||||
modules: $crate::__runtime_modules_to_metadata!($runtime;; $( $rest )*),
|
modules: $crate::__runtime_modules_to_metadata!($runtime;; $( $rest )*),
|
||||||
}
|
}.into()
|
||||||
).into()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -52,17 +76,22 @@ macro_rules! __runtime_modules_to_metadata {
|
|||||||
(
|
(
|
||||||
$runtime: ident;
|
$runtime: ident;
|
||||||
$( $metadata:expr ),*;
|
$( $metadata:expr ),*;
|
||||||
$mod:ident::$module:ident $( < $instance:ident > )? $(with)+ $($kw:ident)*,
|
$mod:ident::$module:ident $( < $instance:ident > )? as $name:ident $(with)+ $($kw:ident)*,
|
||||||
$( $rest:tt )*
|
$( $rest:tt )*
|
||||||
) => {
|
) => {
|
||||||
$crate::__runtime_modules_to_metadata!(
|
$crate::__runtime_modules_to_metadata!(
|
||||||
$runtime;
|
$runtime;
|
||||||
$( $metadata, )* $crate::metadata::ModuleMetadata {
|
$( $metadata, )* $crate::metadata::ModuleMetadata {
|
||||||
name: $crate::metadata::DecodeDifferent::Encode(stringify!($mod)),
|
name: $crate::metadata::DecodeDifferent::Encode(stringify!($name)),
|
||||||
prefix: $crate::__runtime_modules_to_metadata_calls_storagename!($mod, $module $( <$instance> )?, $runtime, $(with $kw)*),
|
storage: $crate::__runtime_modules_to_metadata_calls_storage!(
|
||||||
storage: $crate::__runtime_modules_to_metadata_calls_storage!($mod, $module $( <$instance> )?, $runtime, $(with $kw)*),
|
$mod, $module $( <$instance> )?, $runtime, $(with $kw)*
|
||||||
calls: $crate::__runtime_modules_to_metadata_calls_call!($mod, $module $( <$instance> )?, $runtime, $(with $kw)*),
|
),
|
||||||
event: $crate::__runtime_modules_to_metadata_calls_event!($mod, $module $( <$instance> )?, $runtime, $(with $kw)*),
|
calls: $crate::__runtime_modules_to_metadata_calls_call!(
|
||||||
|
$mod, $module $( <$instance> )?, $runtime, $(with $kw)*
|
||||||
|
),
|
||||||
|
event: $crate::__runtime_modules_to_metadata_calls_event!(
|
||||||
|
$mod, $module $( <$instance> )?, $runtime, $(with $kw)*
|
||||||
|
),
|
||||||
constants: $crate::metadata::DecodeDifferent::Encode(
|
constants: $crate::metadata::DecodeDifferent::Encode(
|
||||||
$crate::metadata::FnEncode(
|
$crate::metadata::FnEncode(
|
||||||
$mod::$module::<$runtime $(, $mod::$instance )?>::module_constants_metadata
|
$mod::$module::<$runtime $(, $mod::$instance )?>::module_constants_metadata
|
||||||
@@ -103,7 +132,9 @@ macro_rules! __runtime_modules_to_metadata_calls_call {
|
|||||||
with $_:ident
|
with $_:ident
|
||||||
$(with $kws:ident)*
|
$(with $kws:ident)*
|
||||||
) => {
|
) => {
|
||||||
$crate::__runtime_modules_to_metadata_calls_call!( $mod, $module $( <$instance> )?, $runtime, $(with $kws)* );
|
$crate::__runtime_modules_to_metadata_calls_call! {
|
||||||
|
$mod, $module $( <$instance> )?, $runtime, $(with $kws)*
|
||||||
|
};
|
||||||
};
|
};
|
||||||
(
|
(
|
||||||
$mod: ident,
|
$mod: ident,
|
||||||
@@ -151,42 +182,6 @@ macro_rules! __runtime_modules_to_metadata_calls_event {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
#[macro_export]
|
|
||||||
#[doc(hidden)]
|
|
||||||
macro_rules! __runtime_modules_to_metadata_calls_storagename {
|
|
||||||
(
|
|
||||||
$mod: ident,
|
|
||||||
$module: ident $( <$instance:ident> )?,
|
|
||||||
$runtime: ident,
|
|
||||||
with Storage
|
|
||||||
$(with $kws:ident)*
|
|
||||||
) => {
|
|
||||||
$crate::metadata::DecodeDifferent::Encode(
|
|
||||||
$crate::metadata::FnEncode(
|
|
||||||
$mod::$module::<$runtime $(, $mod::$instance )?>::store_metadata_name
|
|
||||||
)
|
|
||||||
)
|
|
||||||
};
|
|
||||||
(
|
|
||||||
$mod: ident,
|
|
||||||
$module: ident $( <$instance:ident> )?,
|
|
||||||
$runtime: ident,
|
|
||||||
with $_:ident
|
|
||||||
$(with $kws:ident)*
|
|
||||||
) => {
|
|
||||||
$crate::__runtime_modules_to_metadata_calls_storagename!( $mod, $module $( <$instance> )?, $runtime, $(with $kws)* );
|
|
||||||
};
|
|
||||||
(
|
|
||||||
$mod: ident,
|
|
||||||
$module: ident $( <$instance:ident> )?,
|
|
||||||
$runtime: ident,
|
|
||||||
) => {
|
|
||||||
$crate::metadata::DecodeDifferent::Encode(
|
|
||||||
$crate::metadata::FnEncode(|| "")
|
|
||||||
)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
macro_rules! __runtime_modules_to_metadata_calls_storage {
|
macro_rules! __runtime_modules_to_metadata_calls_storage {
|
||||||
@@ -199,7 +194,7 @@ macro_rules! __runtime_modules_to_metadata_calls_storage {
|
|||||||
) => {
|
) => {
|
||||||
Some($crate::metadata::DecodeDifferent::Encode(
|
Some($crate::metadata::DecodeDifferent::Encode(
|
||||||
$crate::metadata::FnEncode(
|
$crate::metadata::FnEncode(
|
||||||
$mod::$module::<$runtime $(, $mod::$instance )?>::store_metadata_functions
|
$mod::$module::<$runtime $(, $mod::$instance )?>::storage_metadata
|
||||||
)
|
)
|
||||||
))
|
))
|
||||||
};
|
};
|
||||||
@@ -210,7 +205,9 @@ macro_rules! __runtime_modules_to_metadata_calls_storage {
|
|||||||
with $_:ident
|
with $_:ident
|
||||||
$(with $kws:ident)*
|
$(with $kws:ident)*
|
||||||
) => {
|
) => {
|
||||||
$crate::__runtime_modules_to_metadata_calls_storage!( $mod, $module $( <$instance> )?, $runtime, $(with $kws)* );
|
$crate::__runtime_modules_to_metadata_calls_storage! {
|
||||||
|
$mod, $module $( <$instance> )?, $runtime, $(with $kws)*
|
||||||
|
};
|
||||||
};
|
};
|
||||||
(
|
(
|
||||||
$mod: ident,
|
$mod: ident,
|
||||||
@@ -381,9 +378,9 @@ mod tests {
|
|||||||
|
|
||||||
impl_runtime_metadata!(
|
impl_runtime_metadata!(
|
||||||
for TestRuntime with modules
|
for TestRuntime with modules
|
||||||
system::Module with Event,
|
system::Module as System with Event,
|
||||||
event_module::Module with Event Call,
|
event_module::Module as Module with Event Call,
|
||||||
event_module2::Module with Event Storage Call,
|
event_module2::Module as Module2 with Event Storage Call,
|
||||||
);
|
);
|
||||||
|
|
||||||
struct ConstantBlockNumberByteGetter;
|
struct ConstantBlockNumberByteGetter;
|
||||||
@@ -407,110 +404,110 @@ mod tests {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const EXPECTED_METADATA: RuntimeMetadata = RuntimeMetadata::V6(
|
const EXPECTED_METADATA: RuntimeMetadataLastVersion = RuntimeMetadataLastVersion {
|
||||||
RuntimeMetadataV6 {
|
modules: DecodeDifferent::Encode(&[
|
||||||
modules: DecodeDifferent::Encode(&[
|
ModuleMetadata {
|
||||||
ModuleMetadata {
|
name: DecodeDifferent::Encode("System"),
|
||||||
name: DecodeDifferent::Encode("system"),
|
storage: None,
|
||||||
prefix: DecodeDifferent::Encode(FnEncode(|| "")),
|
calls: None,
|
||||||
storage: None,
|
event: Some(DecodeDifferent::Encode(
|
||||||
calls: None,
|
FnEncode(||&[
|
||||||
event: Some(DecodeDifferent::Encode(
|
EventMetadata {
|
||||||
FnEncode(||&[
|
name: DecodeDifferent::Encode("SystemEvent"),
|
||||||
EventMetadata {
|
arguments: DecodeDifferent::Encode(&[]),
|
||||||
name: DecodeDifferent::Encode("SystemEvent"),
|
documentation: DecodeDifferent::Encode(&[])
|
||||||
arguments: DecodeDifferent::Encode(&[]),
|
}
|
||||||
documentation: DecodeDifferent::Encode(&[])
|
])
|
||||||
}
|
)),
|
||||||
])
|
constants: DecodeDifferent::Encode(
|
||||||
)),
|
FnEncode(|| &[
|
||||||
constants: DecodeDifferent::Encode(
|
ModuleConstantMetadata {
|
||||||
FnEncode(|| &[
|
name: DecodeDifferent::Encode("BlockNumber"),
|
||||||
ModuleConstantMetadata {
|
ty: DecodeDifferent::Encode("T::BlockNumber"),
|
||||||
name: DecodeDifferent::Encode("BlockNumber"),
|
value: DecodeDifferent::Encode(
|
||||||
ty: DecodeDifferent::Encode("T::BlockNumber"),
|
DefaultByteGetter(&ConstantBlockNumberByteGetter)
|
||||||
value: DecodeDifferent::Encode(
|
),
|
||||||
DefaultByteGetter(&ConstantBlockNumberByteGetter)
|
documentation: DecodeDifferent::Encode(&[" Hi, I am a comment."]),
|
||||||
),
|
},
|
||||||
documentation: DecodeDifferent::Encode(&[" Hi, I am a comment."]),
|
ModuleConstantMetadata {
|
||||||
},
|
name: DecodeDifferent::Encode("GetType"),
|
||||||
ModuleConstantMetadata {
|
ty: DecodeDifferent::Encode("T::AccountId"),
|
||||||
name: DecodeDifferent::Encode("GetType"),
|
value: DecodeDifferent::Encode(
|
||||||
ty: DecodeDifferent::Encode("T::AccountId"),
|
DefaultByteGetter(&ConstantGetTypeByteGetter)
|
||||||
value: DecodeDifferent::Encode(
|
),
|
||||||
DefaultByteGetter(&ConstantGetTypeByteGetter)
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
),
|
},
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
ModuleConstantMetadata {
|
||||||
},
|
name: DecodeDifferent::Encode("ASSOCIATED_CONST"),
|
||||||
ModuleConstantMetadata {
|
ty: DecodeDifferent::Encode("u64"),
|
||||||
name: DecodeDifferent::Encode("ASSOCIATED_CONST"),
|
value: DecodeDifferent::Encode(
|
||||||
ty: DecodeDifferent::Encode("u64"),
|
DefaultByteGetter(&ConstantAssociatedConstByteGetter)
|
||||||
value: DecodeDifferent::Encode(
|
),
|
||||||
DefaultByteGetter(&ConstantAssociatedConstByteGetter)
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
),
|
}
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
])
|
||||||
}
|
),
|
||||||
])
|
},
|
||||||
),
|
ModuleMetadata {
|
||||||
},
|
name: DecodeDifferent::Encode("Module"),
|
||||||
ModuleMetadata {
|
storage: None,
|
||||||
name: DecodeDifferent::Encode("event_module"),
|
calls: Some(
|
||||||
prefix: DecodeDifferent::Encode(FnEncode(|| "")),
|
DecodeDifferent::Encode(FnEncode(|| &[
|
||||||
storage: None,
|
FunctionMetadata {
|
||||||
calls: Some(
|
name: DecodeDifferent::Encode("aux_0"),
|
||||||
DecodeDifferent::Encode(FnEncode(|| &[
|
arguments: DecodeDifferent::Encode(&[]),
|
||||||
FunctionMetadata {
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
name: DecodeDifferent::Encode("aux_0"),
|
}
|
||||||
arguments: DecodeDifferent::Encode(&[]),
|
]))),
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
event: Some(DecodeDifferent::Encode(
|
||||||
}
|
FnEncode(||&[
|
||||||
]))),
|
EventMetadata {
|
||||||
event: Some(DecodeDifferent::Encode(
|
name: DecodeDifferent::Encode("TestEvent"),
|
||||||
FnEncode(||&[
|
arguments: DecodeDifferent::Encode(&["Balance"]),
|
||||||
EventMetadata {
|
documentation: DecodeDifferent::Encode(&[" Hi, I am a comment."])
|
||||||
name: DecodeDifferent::Encode("TestEvent"),
|
}
|
||||||
arguments: DecodeDifferent::Encode(&["Balance"]),
|
])
|
||||||
documentation: DecodeDifferent::Encode(&[" Hi, I am a comment."])
|
)),
|
||||||
}
|
constants: DecodeDifferent::Encode(FnEncode(|| &[])),
|
||||||
])
|
},
|
||||||
)),
|
ModuleMetadata {
|
||||||
constants: DecodeDifferent::Encode(FnEncode(|| &[])),
|
name: DecodeDifferent::Encode("Module2"),
|
||||||
},
|
storage: Some(DecodeDifferent::Encode(
|
||||||
ModuleMetadata {
|
FnEncode(|| StorageMetadata {
|
||||||
name: DecodeDifferent::Encode("event_module2"),
|
prefix: DecodeDifferent::Encode("TestStorage"),
|
||||||
prefix: DecodeDifferent::Encode(FnEncode(||"TestStorage")),
|
entries: DecodeDifferent::Encode(
|
||||||
storage: Some(DecodeDifferent::Encode(
|
&[
|
||||||
FnEncode(||&[
|
StorageEntryMetadata {
|
||||||
StorageEntryMetadata {
|
name: DecodeDifferent::Encode("StorageMethod"),
|
||||||
name: DecodeDifferent::Encode("StorageMethod"),
|
modifier: StorageEntryModifier::Optional,
|
||||||
modifier: StorageEntryModifier::Optional,
|
ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")),
|
||||||
ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")),
|
default: DecodeDifferent::Encode(
|
||||||
default: DecodeDifferent::Encode(
|
DefaultByteGetter(
|
||||||
DefaultByteGetter(
|
&event_module2::__GetByteStructStorageMethod(
|
||||||
&event_module2::__GetByteStructStorageMethod(
|
std::marker::PhantomData::<TestRuntime>
|
||||||
std::marker::PhantomData::<TestRuntime>
|
)
|
||||||
)
|
)
|
||||||
)
|
),
|
||||||
),
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
}
|
||||||
}
|
]
|
||||||
])
|
)
|
||||||
)),
|
}),
|
||||||
calls: Some(DecodeDifferent::Encode(FnEncode(|| &[]))),
|
)),
|
||||||
event: Some(DecodeDifferent::Encode(
|
calls: Some(DecodeDifferent::Encode(FnEncode(|| &[]))),
|
||||||
FnEncode(||&[
|
event: Some(DecodeDifferent::Encode(
|
||||||
EventMetadata {
|
FnEncode(||&[
|
||||||
name: DecodeDifferent::Encode("TestEvent"),
|
EventMetadata {
|
||||||
arguments: DecodeDifferent::Encode(&["Balance"]),
|
name: DecodeDifferent::Encode("TestEvent"),
|
||||||
documentation: DecodeDifferent::Encode(&[])
|
arguments: DecodeDifferent::Encode(&["Balance"]),
|
||||||
}
|
documentation: DecodeDifferent::Encode(&[])
|
||||||
])
|
}
|
||||||
)),
|
])
|
||||||
constants: DecodeDifferent::Encode(FnEncode(|| &[])),
|
)),
|
||||||
},
|
constants: DecodeDifferent::Encode(FnEncode(|| &[])),
|
||||||
])
|
},
|
||||||
}
|
])
|
||||||
);
|
};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn runtime_metadata() {
|
fn runtime_metadata() {
|
||||||
|
|||||||
@@ -576,7 +576,9 @@ macro_rules! __decl_runtime_metadata {
|
|||||||
$runtime;
|
$runtime;
|
||||||
{
|
{
|
||||||
$( $parsed )*
|
$( $parsed )*
|
||||||
$module $( < $module_instance > )? { $( $( $leading_module )* )? $( $modules )* }
|
$module $( < $module_instance > )? as $name {
|
||||||
|
$( $( $leading_module )* )? $( $modules )*
|
||||||
|
}
|
||||||
};
|
};
|
||||||
$( $rest )*
|
$( $rest )*
|
||||||
);
|
);
|
||||||
@@ -618,11 +620,18 @@ macro_rules! __decl_runtime_metadata {
|
|||||||
// end of decl
|
// end of decl
|
||||||
(
|
(
|
||||||
$runtime:ident;
|
$runtime:ident;
|
||||||
{ $( $parsed_modules:ident $( < $module_instance:ident > )? { $( $withs:ident )* } )* };
|
{
|
||||||
|
$(
|
||||||
|
$parsed_modules:ident $( < $module_instance:ident > )? as $parsed_name:ident {
|
||||||
|
$( $withs:ident )*
|
||||||
|
}
|
||||||
|
)*
|
||||||
|
};
|
||||||
) => {
|
) => {
|
||||||
$crate::impl_runtime_metadata!(
|
$crate::impl_runtime_metadata!(
|
||||||
for $runtime with modules
|
for $runtime with modules
|
||||||
$( $parsed_modules::Module $( < $module_instance > )? with $( $withs )* , )*
|
$( $parsed_modules::Module $( < $module_instance > )? as $parsed_name
|
||||||
|
with $( $withs )* , )*
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -390,325 +390,330 @@ mod tests {
|
|||||||
type BlockNumber = u32;
|
type BlockNumber = u32;
|
||||||
}
|
}
|
||||||
|
|
||||||
const EXPECTED_METADATA: &[StorageEntryMetadata] = &[
|
const EXPECTED_METADATA: StorageMetadata = StorageMetadata {
|
||||||
StorageEntryMetadata {
|
prefix: DecodeDifferent::Encode("TestStorage"),
|
||||||
name: DecodeDifferent::Encode("U32"),
|
entries: DecodeDifferent::Encode(
|
||||||
modifier: StorageEntryModifier::Optional,
|
&[
|
||||||
ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")),
|
StorageEntryMetadata {
|
||||||
default: DecodeDifferent::Encode(
|
name: DecodeDifferent::Encode("U32"),
|
||||||
DefaultByteGetter(&__GetByteStructU32(PhantomData::<TraitImpl>))
|
modifier: StorageEntryModifier::Optional,
|
||||||
),
|
ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")),
|
||||||
documentation: DecodeDifferent::Encode(&[ " Hello, this is doc!" ]),
|
default: DecodeDifferent::Encode(
|
||||||
},
|
DefaultByteGetter(&__GetByteStructU32(PhantomData::<TraitImpl>))
|
||||||
StorageEntryMetadata {
|
),
|
||||||
name: DecodeDifferent::Encode("PUBU32"),
|
documentation: DecodeDifferent::Encode(&[ " Hello, this is doc!" ]),
|
||||||
modifier: StorageEntryModifier::Optional,
|
},
|
||||||
ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")),
|
StorageEntryMetadata {
|
||||||
default: DecodeDifferent::Encode(
|
name: DecodeDifferent::Encode("PUBU32"),
|
||||||
DefaultByteGetter(&__GetByteStructPUBU32(PhantomData::<TraitImpl>))
|
modifier: StorageEntryModifier::Optional,
|
||||||
),
|
ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")),
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
default: DecodeDifferent::Encode(
|
||||||
},
|
DefaultByteGetter(&__GetByteStructPUBU32(PhantomData::<TraitImpl>))
|
||||||
StorageEntryMetadata {
|
),
|
||||||
name: DecodeDifferent::Encode("U32MYDEF"),
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
modifier: StorageEntryModifier::Optional,
|
},
|
||||||
ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")),
|
StorageEntryMetadata {
|
||||||
default: DecodeDifferent::Encode(
|
name: DecodeDifferent::Encode("U32MYDEF"),
|
||||||
DefaultByteGetter(&__GetByteStructU32MYDEF(PhantomData::<TraitImpl>))
|
modifier: StorageEntryModifier::Optional,
|
||||||
),
|
ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")),
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
default: DecodeDifferent::Encode(
|
||||||
},
|
DefaultByteGetter(&__GetByteStructU32MYDEF(PhantomData::<TraitImpl>))
|
||||||
StorageEntryMetadata {
|
),
|
||||||
name: DecodeDifferent::Encode("PUBU32MYDEF"),
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
modifier: StorageEntryModifier::Optional,
|
},
|
||||||
ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")),
|
StorageEntryMetadata {
|
||||||
default: DecodeDifferent::Encode(
|
name: DecodeDifferent::Encode("PUBU32MYDEF"),
|
||||||
DefaultByteGetter(&__GetByteStructPUBU32MYDEF(PhantomData::<TraitImpl>))
|
modifier: StorageEntryModifier::Optional,
|
||||||
),
|
ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")),
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
default: DecodeDifferent::Encode(
|
||||||
},
|
DefaultByteGetter(&__GetByteStructPUBU32MYDEF(PhantomData::<TraitImpl>))
|
||||||
StorageEntryMetadata {
|
),
|
||||||
name: DecodeDifferent::Encode("GETU32"),
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
modifier: StorageEntryModifier::Default,
|
},
|
||||||
ty: StorageEntryType::Plain(DecodeDifferent::Encode("T::Origin")),
|
StorageEntryMetadata {
|
||||||
default: DecodeDifferent::Encode(
|
name: DecodeDifferent::Encode("GETU32"),
|
||||||
DefaultByteGetter(&__GetByteStructGETU32(PhantomData::<TraitImpl>))
|
modifier: StorageEntryModifier::Default,
|
||||||
),
|
ty: StorageEntryType::Plain(DecodeDifferent::Encode("T::Origin")),
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
default: DecodeDifferent::Encode(
|
||||||
},
|
DefaultByteGetter(&__GetByteStructGETU32(PhantomData::<TraitImpl>))
|
||||||
StorageEntryMetadata {
|
),
|
||||||
name: DecodeDifferent::Encode("PUBGETU32"),
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
modifier: StorageEntryModifier::Default,
|
},
|
||||||
ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")),
|
StorageEntryMetadata {
|
||||||
default: DecodeDifferent::Encode(
|
name: DecodeDifferent::Encode("PUBGETU32"),
|
||||||
DefaultByteGetter(&__GetByteStructPUBGETU32(PhantomData::<TraitImpl>))
|
modifier: StorageEntryModifier::Default,
|
||||||
),
|
ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")),
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
default: DecodeDifferent::Encode(
|
||||||
},
|
DefaultByteGetter(&__GetByteStructPUBGETU32(PhantomData::<TraitImpl>))
|
||||||
StorageEntryMetadata {
|
),
|
||||||
name: DecodeDifferent::Encode("GETU32WITHCONFIG"),
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
modifier: StorageEntryModifier::Default,
|
},
|
||||||
ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")),
|
StorageEntryMetadata {
|
||||||
default: DecodeDifferent::Encode(
|
name: DecodeDifferent::Encode("GETU32WITHCONFIG"),
|
||||||
DefaultByteGetter(&__GetByteStructGETU32WITHCONFIG(PhantomData::<TraitImpl>))
|
modifier: StorageEntryModifier::Default,
|
||||||
),
|
ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")),
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
default: DecodeDifferent::Encode(
|
||||||
},
|
DefaultByteGetter(&__GetByteStructGETU32WITHCONFIG(PhantomData::<TraitImpl>))
|
||||||
StorageEntryMetadata {
|
),
|
||||||
name: DecodeDifferent::Encode("PUBGETU32WITHCONFIG"),
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
modifier: StorageEntryModifier::Default,
|
},
|
||||||
ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")),
|
StorageEntryMetadata {
|
||||||
default: DecodeDifferent::Encode(
|
name: DecodeDifferent::Encode("PUBGETU32WITHCONFIG"),
|
||||||
DefaultByteGetter(&__GetByteStructPUBGETU32WITHCONFIG(PhantomData::<TraitImpl>))
|
modifier: StorageEntryModifier::Default,
|
||||||
),
|
ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")),
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
default: DecodeDifferent::Encode(
|
||||||
},
|
DefaultByteGetter(&__GetByteStructPUBGETU32WITHCONFIG(PhantomData::<TraitImpl>))
|
||||||
StorageEntryMetadata {
|
),
|
||||||
name: DecodeDifferent::Encode("GETU32MYDEF"),
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
modifier: StorageEntryModifier::Optional,
|
},
|
||||||
ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")),
|
StorageEntryMetadata {
|
||||||
default: DecodeDifferent::Encode(
|
name: DecodeDifferent::Encode("GETU32MYDEF"),
|
||||||
DefaultByteGetter(&__GetByteStructGETU32MYDEF(PhantomData::<TraitImpl>))
|
modifier: StorageEntryModifier::Optional,
|
||||||
),
|
ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")),
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
default: DecodeDifferent::Encode(
|
||||||
},
|
DefaultByteGetter(&__GetByteStructGETU32MYDEF(PhantomData::<TraitImpl>))
|
||||||
StorageEntryMetadata {
|
),
|
||||||
name: DecodeDifferent::Encode("PUBGETU32MYDEF"),
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
modifier: StorageEntryModifier::Default,
|
},
|
||||||
ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")),
|
StorageEntryMetadata {
|
||||||
default: DecodeDifferent::Encode(
|
name: DecodeDifferent::Encode("PUBGETU32MYDEF"),
|
||||||
DefaultByteGetter(&__GetByteStructPUBGETU32MYDEF(PhantomData::<TraitImpl>))
|
modifier: StorageEntryModifier::Default,
|
||||||
),
|
ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")),
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
default: DecodeDifferent::Encode(
|
||||||
},
|
DefaultByteGetter(&__GetByteStructPUBGETU32MYDEF(PhantomData::<TraitImpl>))
|
||||||
StorageEntryMetadata {
|
),
|
||||||
name: DecodeDifferent::Encode("GETU32WITHCONFIGMYDEF"),
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
modifier: StorageEntryModifier::Default,
|
},
|
||||||
ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")),
|
StorageEntryMetadata {
|
||||||
default: DecodeDifferent::Encode(
|
name: DecodeDifferent::Encode("GETU32WITHCONFIGMYDEF"),
|
||||||
DefaultByteGetter(&__GetByteStructGETU32WITHCONFIGMYDEF(PhantomData::<TraitImpl>))
|
modifier: StorageEntryModifier::Default,
|
||||||
),
|
ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")),
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
default: DecodeDifferent::Encode(
|
||||||
},
|
DefaultByteGetter(&__GetByteStructGETU32WITHCONFIGMYDEF(PhantomData::<TraitImpl>))
|
||||||
StorageEntryMetadata {
|
),
|
||||||
name: DecodeDifferent::Encode("PUBGETU32WITHCONFIGMYDEF"),
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
modifier: StorageEntryModifier::Default,
|
},
|
||||||
ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")),
|
StorageEntryMetadata {
|
||||||
default: DecodeDifferent::Encode(
|
name: DecodeDifferent::Encode("PUBGETU32WITHCONFIGMYDEF"),
|
||||||
DefaultByteGetter(&__GetByteStructPUBGETU32WITHCONFIGMYDEF(PhantomData::<TraitImpl>))
|
modifier: StorageEntryModifier::Default,
|
||||||
),
|
ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")),
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
default: DecodeDifferent::Encode(
|
||||||
},
|
DefaultByteGetter(&__GetByteStructPUBGETU32WITHCONFIGMYDEF(PhantomData::<TraitImpl>))
|
||||||
StorageEntryMetadata {
|
),
|
||||||
name: DecodeDifferent::Encode("PUBGETU32WITHCONFIGMYDEFOPT"),
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
modifier: StorageEntryModifier::Optional,
|
},
|
||||||
ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")),
|
StorageEntryMetadata {
|
||||||
default: DecodeDifferent::Encode(
|
name: DecodeDifferent::Encode("PUBGETU32WITHCONFIGMYDEFOPT"),
|
||||||
DefaultByteGetter(&__GetByteStructPUBGETU32WITHCONFIGMYDEFOPT(PhantomData::<TraitImpl>))
|
modifier: StorageEntryModifier::Optional,
|
||||||
),
|
ty: StorageEntryType::Plain(DecodeDifferent::Encode("u32")),
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
default: DecodeDifferent::Encode(
|
||||||
},
|
DefaultByteGetter(&__GetByteStructPUBGETU32WITHCONFIGMYDEFOPT(PhantomData::<TraitImpl>))
|
||||||
|
),
|
||||||
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
|
},
|
||||||
|
|
||||||
StorageEntryMetadata {
|
StorageEntryMetadata {
|
||||||
name: DecodeDifferent::Encode("MAPU32"),
|
name: DecodeDifferent::Encode("MAPU32"),
|
||||||
modifier: StorageEntryModifier::Optional,
|
modifier: StorageEntryModifier::Optional,
|
||||||
ty: StorageEntryType::Map {
|
ty: StorageEntryType::Map {
|
||||||
hasher: StorageHasher::Blake2_256,
|
hasher: StorageHasher::Blake2_256,
|
||||||
key: DecodeDifferent::Encode("u32"),
|
key: DecodeDifferent::Encode("u32"),
|
||||||
value: DecodeDifferent::Encode("String"),
|
value: DecodeDifferent::Encode("String"),
|
||||||
is_linked: false,
|
is_linked: false,
|
||||||
},
|
},
|
||||||
default: DecodeDifferent::Encode(
|
default: DecodeDifferent::Encode(
|
||||||
DefaultByteGetter(&__GetByteStructMAPU32(PhantomData::<TraitImpl>))
|
DefaultByteGetter(&__GetByteStructMAPU32(PhantomData::<TraitImpl>))
|
||||||
),
|
),
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
},
|
},
|
||||||
StorageEntryMetadata {
|
StorageEntryMetadata {
|
||||||
name: DecodeDifferent::Encode("PUBMAPU32"),
|
name: DecodeDifferent::Encode("PUBMAPU32"),
|
||||||
modifier: StorageEntryModifier::Optional,
|
modifier: StorageEntryModifier::Optional,
|
||||||
ty: StorageEntryType::Map {
|
ty: StorageEntryType::Map {
|
||||||
hasher: StorageHasher::Blake2_256,
|
hasher: StorageHasher::Blake2_256,
|
||||||
key: DecodeDifferent::Encode("u32"),
|
key: DecodeDifferent::Encode("u32"),
|
||||||
value: DecodeDifferent::Encode("String"),
|
value: DecodeDifferent::Encode("String"),
|
||||||
is_linked: false,
|
is_linked: false,
|
||||||
},
|
},
|
||||||
default: DecodeDifferent::Encode(
|
default: DecodeDifferent::Encode(
|
||||||
DefaultByteGetter(&__GetByteStructPUBMAPU32(PhantomData::<TraitImpl>))
|
DefaultByteGetter(&__GetByteStructPUBMAPU32(PhantomData::<TraitImpl>))
|
||||||
),
|
),
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
},
|
},
|
||||||
StorageEntryMetadata {
|
StorageEntryMetadata {
|
||||||
name: DecodeDifferent::Encode("MAPU32MYDEF"),
|
name: DecodeDifferent::Encode("MAPU32MYDEF"),
|
||||||
modifier: StorageEntryModifier::Optional,
|
modifier: StorageEntryModifier::Optional,
|
||||||
ty: StorageEntryType::Map {
|
ty: StorageEntryType::Map {
|
||||||
hasher: StorageHasher::Blake2_256,
|
hasher: StorageHasher::Blake2_256,
|
||||||
key: DecodeDifferent::Encode("u32"),
|
key: DecodeDifferent::Encode("u32"),
|
||||||
value: DecodeDifferent::Encode("String"),
|
value: DecodeDifferent::Encode("String"),
|
||||||
is_linked: false,
|
is_linked: false,
|
||||||
},
|
},
|
||||||
default: DecodeDifferent::Encode(
|
default: DecodeDifferent::Encode(
|
||||||
DefaultByteGetter(&__GetByteStructMAPU32MYDEF(PhantomData::<TraitImpl>))
|
DefaultByteGetter(&__GetByteStructMAPU32MYDEF(PhantomData::<TraitImpl>))
|
||||||
),
|
),
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
},
|
},
|
||||||
StorageEntryMetadata {
|
StorageEntryMetadata {
|
||||||
name: DecodeDifferent::Encode("PUBMAPU32MYDEF"),
|
name: DecodeDifferent::Encode("PUBMAPU32MYDEF"),
|
||||||
modifier: StorageEntryModifier::Optional,
|
modifier: StorageEntryModifier::Optional,
|
||||||
ty: StorageEntryType::Map {
|
ty: StorageEntryType::Map {
|
||||||
hasher: StorageHasher::Blake2_256,
|
hasher: StorageHasher::Blake2_256,
|
||||||
key: DecodeDifferent::Encode("u32"),
|
key: DecodeDifferent::Encode("u32"),
|
||||||
value: DecodeDifferent::Encode("String"),
|
value: DecodeDifferent::Encode("String"),
|
||||||
is_linked: false,
|
is_linked: false,
|
||||||
},
|
},
|
||||||
default: DecodeDifferent::Encode(
|
default: DecodeDifferent::Encode(
|
||||||
DefaultByteGetter(&__GetByteStructPUBMAPU32MYDEF(PhantomData::<TraitImpl>))
|
DefaultByteGetter(&__GetByteStructPUBMAPU32MYDEF(PhantomData::<TraitImpl>))
|
||||||
),
|
),
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
},
|
},
|
||||||
StorageEntryMetadata {
|
StorageEntryMetadata {
|
||||||
name: DecodeDifferent::Encode("GETMAPU32"),
|
name: DecodeDifferent::Encode("GETMAPU32"),
|
||||||
modifier: StorageEntryModifier::Default,
|
modifier: StorageEntryModifier::Default,
|
||||||
ty: StorageEntryType::Map {
|
ty: StorageEntryType::Map {
|
||||||
hasher: StorageHasher::Blake2_256,
|
hasher: StorageHasher::Blake2_256,
|
||||||
key: DecodeDifferent::Encode("u32"),
|
key: DecodeDifferent::Encode("u32"),
|
||||||
value: DecodeDifferent::Encode("String"),
|
value: DecodeDifferent::Encode("String"),
|
||||||
is_linked: false,
|
is_linked: false,
|
||||||
},
|
},
|
||||||
default: DecodeDifferent::Encode(
|
default: DecodeDifferent::Encode(
|
||||||
DefaultByteGetter(&__GetByteStructGETMAPU32(PhantomData::<TraitImpl>))
|
DefaultByteGetter(&__GetByteStructGETMAPU32(PhantomData::<TraitImpl>))
|
||||||
),
|
),
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
},
|
},
|
||||||
StorageEntryMetadata {
|
StorageEntryMetadata {
|
||||||
name: DecodeDifferent::Encode("PUBGETMAPU32"),
|
name: DecodeDifferent::Encode("PUBGETMAPU32"),
|
||||||
modifier: StorageEntryModifier::Default,
|
modifier: StorageEntryModifier::Default,
|
||||||
ty: StorageEntryType::Map {
|
ty: StorageEntryType::Map {
|
||||||
hasher: StorageHasher::Blake2_256,
|
hasher: StorageHasher::Blake2_256,
|
||||||
key: DecodeDifferent::Encode("u32"),
|
key: DecodeDifferent::Encode("u32"),
|
||||||
value: DecodeDifferent::Encode("String"),
|
value: DecodeDifferent::Encode("String"),
|
||||||
is_linked: false,
|
is_linked: false,
|
||||||
},
|
},
|
||||||
default: DecodeDifferent::Encode(
|
default: DecodeDifferent::Encode(
|
||||||
DefaultByteGetter(&__GetByteStructPUBGETMAPU32(PhantomData::<TraitImpl>))
|
DefaultByteGetter(&__GetByteStructPUBGETMAPU32(PhantomData::<TraitImpl>))
|
||||||
),
|
),
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
},
|
},
|
||||||
StorageEntryMetadata {
|
StorageEntryMetadata {
|
||||||
name: DecodeDifferent::Encode("GETMAPU32MYDEF"),
|
name: DecodeDifferent::Encode("GETMAPU32MYDEF"),
|
||||||
modifier: StorageEntryModifier::Default,
|
modifier: StorageEntryModifier::Default,
|
||||||
ty: StorageEntryType::Map {
|
ty: StorageEntryType::Map {
|
||||||
hasher: StorageHasher::Blake2_256,
|
hasher: StorageHasher::Blake2_256,
|
||||||
key: DecodeDifferent::Encode("u32"),
|
key: DecodeDifferent::Encode("u32"),
|
||||||
value: DecodeDifferent::Encode("String"),
|
value: DecodeDifferent::Encode("String"),
|
||||||
is_linked: false,
|
is_linked: false,
|
||||||
},
|
},
|
||||||
default: DecodeDifferent::Encode(
|
default: DecodeDifferent::Encode(
|
||||||
DefaultByteGetter(&__GetByteStructGETMAPU32MYDEF(PhantomData::<TraitImpl>))
|
DefaultByteGetter(&__GetByteStructGETMAPU32MYDEF(PhantomData::<TraitImpl>))
|
||||||
),
|
),
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
},
|
},
|
||||||
StorageEntryMetadata {
|
StorageEntryMetadata {
|
||||||
name: DecodeDifferent::Encode("PUBGETMAPU32MYDEF"),
|
name: DecodeDifferent::Encode("PUBGETMAPU32MYDEF"),
|
||||||
modifier: StorageEntryModifier::Default,
|
modifier: StorageEntryModifier::Default,
|
||||||
ty: StorageEntryType::Map {
|
ty: StorageEntryType::Map {
|
||||||
hasher: StorageHasher::Blake2_256,
|
hasher: StorageHasher::Blake2_256,
|
||||||
key: DecodeDifferent::Encode("u32"),
|
key: DecodeDifferent::Encode("u32"),
|
||||||
value: DecodeDifferent::Encode("String"),
|
value: DecodeDifferent::Encode("String"),
|
||||||
is_linked: false,
|
is_linked: false,
|
||||||
},
|
},
|
||||||
default: DecodeDifferent::Encode(
|
default: DecodeDifferent::Encode(
|
||||||
DefaultByteGetter(&__GetByteStructPUBGETMAPU32MYDEF(PhantomData::<TraitImpl>))
|
DefaultByteGetter(&__GetByteStructPUBGETMAPU32MYDEF(PhantomData::<TraitImpl>))
|
||||||
),
|
),
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
},
|
},
|
||||||
StorageEntryMetadata {
|
StorageEntryMetadata {
|
||||||
name: DecodeDifferent::Encode("LINKEDMAPU32"),
|
name: DecodeDifferent::Encode("LINKEDMAPU32"),
|
||||||
modifier: StorageEntryModifier::Optional,
|
modifier: StorageEntryModifier::Optional,
|
||||||
ty: StorageEntryType::Map {
|
ty: StorageEntryType::Map {
|
||||||
hasher: StorageHasher::Blake2_256,
|
hasher: StorageHasher::Blake2_256,
|
||||||
key: DecodeDifferent::Encode("u32"),
|
key: DecodeDifferent::Encode("u32"),
|
||||||
value: DecodeDifferent::Encode("String"),
|
value: DecodeDifferent::Encode("String"),
|
||||||
is_linked: true,
|
is_linked: true,
|
||||||
},
|
},
|
||||||
default: DecodeDifferent::Encode(
|
default: DecodeDifferent::Encode(
|
||||||
DefaultByteGetter(&__GetByteStructLINKEDMAPU32(PhantomData::<TraitImpl>))
|
DefaultByteGetter(&__GetByteStructLINKEDMAPU32(PhantomData::<TraitImpl>))
|
||||||
),
|
),
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
},
|
},
|
||||||
StorageEntryMetadata {
|
StorageEntryMetadata {
|
||||||
name: DecodeDifferent::Encode("PUBLINKEDMAPU32MYDEF"),
|
name: DecodeDifferent::Encode("PUBLINKEDMAPU32MYDEF"),
|
||||||
modifier: StorageEntryModifier::Optional,
|
modifier: StorageEntryModifier::Optional,
|
||||||
ty: StorageEntryType::Map {
|
ty: StorageEntryType::Map {
|
||||||
hasher: StorageHasher::Blake2_256,
|
hasher: StorageHasher::Blake2_256,
|
||||||
key: DecodeDifferent::Encode("u32"),
|
key: DecodeDifferent::Encode("u32"),
|
||||||
value: DecodeDifferent::Encode("String"),
|
value: DecodeDifferent::Encode("String"),
|
||||||
is_linked: true,
|
is_linked: true,
|
||||||
},
|
},
|
||||||
default: DecodeDifferent::Encode(
|
default: DecodeDifferent::Encode(
|
||||||
DefaultByteGetter(&__GetByteStructPUBLINKEDMAPU32MYDEF(PhantomData::<TraitImpl>))
|
DefaultByteGetter(&__GetByteStructPUBLINKEDMAPU32MYDEF(PhantomData::<TraitImpl>))
|
||||||
),
|
),
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
},
|
},
|
||||||
StorageEntryMetadata {
|
StorageEntryMetadata {
|
||||||
name: DecodeDifferent::Encode("GETLINKEDMAPU32"),
|
name: DecodeDifferent::Encode("GETLINKEDMAPU32"),
|
||||||
modifier: StorageEntryModifier::Default,
|
modifier: StorageEntryModifier::Default,
|
||||||
ty: StorageEntryType::Map {
|
ty: StorageEntryType::Map {
|
||||||
hasher: StorageHasher::Blake2_256,
|
hasher: StorageHasher::Blake2_256,
|
||||||
key: DecodeDifferent::Encode("u32"),
|
key: DecodeDifferent::Encode("u32"),
|
||||||
value: DecodeDifferent::Encode("String"),
|
value: DecodeDifferent::Encode("String"),
|
||||||
is_linked: true,
|
is_linked: true,
|
||||||
},
|
},
|
||||||
default: DecodeDifferent::Encode(
|
default: DecodeDifferent::Encode(
|
||||||
DefaultByteGetter(&__GetByteStructGETLINKEDMAPU32(PhantomData::<TraitImpl>))
|
DefaultByteGetter(&__GetByteStructGETLINKEDMAPU32(PhantomData::<TraitImpl>))
|
||||||
),
|
),
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
},
|
},
|
||||||
StorageEntryMetadata {
|
StorageEntryMetadata {
|
||||||
name: DecodeDifferent::Encode("PUBGETLINKEDMAPU32MYDEF"),
|
name: DecodeDifferent::Encode("PUBGETLINKEDMAPU32MYDEF"),
|
||||||
modifier: StorageEntryModifier::Default,
|
modifier: StorageEntryModifier::Default,
|
||||||
ty: StorageEntryType::Map {
|
ty: StorageEntryType::Map {
|
||||||
hasher: StorageHasher::Blake2_256,
|
hasher: StorageHasher::Blake2_256,
|
||||||
key: DecodeDifferent::Encode("u32"),
|
key: DecodeDifferent::Encode("u32"),
|
||||||
value: DecodeDifferent::Encode("String"),
|
value: DecodeDifferent::Encode("String"),
|
||||||
is_linked: true,
|
is_linked: true,
|
||||||
},
|
},
|
||||||
default: DecodeDifferent::Encode(
|
default: DecodeDifferent::Encode(
|
||||||
DefaultByteGetter(&__GetByteStructPUBGETLINKEDMAPU32MYDEF(PhantomData::<TraitImpl>))
|
DefaultByteGetter(&__GetByteStructPUBGETLINKEDMAPU32MYDEF(PhantomData::<TraitImpl>))
|
||||||
),
|
),
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
},
|
},
|
||||||
StorageEntryMetadata {
|
StorageEntryMetadata {
|
||||||
name: DecodeDifferent::Encode("COMPLEXTYPE1"),
|
name: DecodeDifferent::Encode("COMPLEXTYPE1"),
|
||||||
modifier: StorageEntryModifier::Default,
|
modifier: StorageEntryModifier::Default,
|
||||||
ty: StorageEntryType::Plain(DecodeDifferent::Encode("::std::vec::Vec<<T as Trait>::Origin>")),
|
ty: StorageEntryType::Plain(DecodeDifferent::Encode("::std::vec::Vec<<T as Trait>::Origin>")),
|
||||||
default: DecodeDifferent::Encode(
|
default: DecodeDifferent::Encode(
|
||||||
DefaultByteGetter(&__GetByteStructCOMPLEXTYPE1(PhantomData::<TraitImpl>))
|
DefaultByteGetter(&__GetByteStructCOMPLEXTYPE1(PhantomData::<TraitImpl>))
|
||||||
),
|
),
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
},
|
},
|
||||||
StorageEntryMetadata {
|
StorageEntryMetadata {
|
||||||
name: DecodeDifferent::Encode("COMPLEXTYPE2"),
|
name: DecodeDifferent::Encode("COMPLEXTYPE2"),
|
||||||
modifier: StorageEntryModifier::Default,
|
modifier: StorageEntryModifier::Default,
|
||||||
ty: StorageEntryType::Plain(DecodeDifferent::Encode("(Vec<Vec<(u16, Box<()>)>>, u32)")),
|
ty: StorageEntryType::Plain(DecodeDifferent::Encode("(Vec<Vec<(u16, Box<()>)>>, u32)")),
|
||||||
default: DecodeDifferent::Encode(
|
default: DecodeDifferent::Encode(
|
||||||
DefaultByteGetter(&__GetByteStructCOMPLEXTYPE2(PhantomData::<TraitImpl>))
|
DefaultByteGetter(&__GetByteStructCOMPLEXTYPE2(PhantomData::<TraitImpl>))
|
||||||
),
|
),
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
},
|
},
|
||||||
StorageEntryMetadata {
|
StorageEntryMetadata {
|
||||||
name: DecodeDifferent::Encode("COMPLEXTYPE3"),
|
name: DecodeDifferent::Encode("COMPLEXTYPE3"),
|
||||||
modifier: StorageEntryModifier::Default,
|
modifier: StorageEntryModifier::Default,
|
||||||
ty: StorageEntryType::Plain(DecodeDifferent::Encode("([u32; 25])")),
|
ty: StorageEntryType::Plain(DecodeDifferent::Encode("([u32; 25])")),
|
||||||
default: DecodeDifferent::Encode(
|
default: DecodeDifferent::Encode(
|
||||||
DefaultByteGetter(&__GetByteStructCOMPLEXTYPE3(PhantomData::<TraitImpl>))
|
DefaultByteGetter(&__GetByteStructCOMPLEXTYPE3(PhantomData::<TraitImpl>))
|
||||||
),
|
),
|
||||||
documentation: DecodeDifferent::Encode(&[]),
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
},
|
},
|
||||||
];
|
]
|
||||||
|
),
|
||||||
|
};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn store_metadata() {
|
fn store_metadata() {
|
||||||
let metadata = Module::<TraitImpl>::store_metadata_functions();
|
let metadata = Module::<TraitImpl>::storage_metadata();
|
||||||
assert_eq!(EXPECTED_METADATA, metadata);
|
assert_eq!(EXPECTED_METADATA, metadata);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ srml-support = { version = "2", path = "../", default-features = false }
|
|||||||
inherents = { package = "substrate-inherents", path = "../../../core/inherents", default-features = false }
|
inherents = { package = "substrate-inherents", path = "../../../core/inherents", default-features = false }
|
||||||
primitives = { package = "substrate-primitives", path = "../../../core/primitives", default-features = false }
|
primitives = { package = "substrate-primitives", path = "../../../core/primitives", default-features = false }
|
||||||
trybuild = "1"
|
trybuild = "1"
|
||||||
|
pretty_assertions = "0.6.1"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = ["std"]
|
default = ["std"]
|
||||||
|
|||||||
@@ -19,6 +19,10 @@ use runtime_io::{with_externalities, Blake2Hasher};
|
|||||||
use srml_support::{
|
use srml_support::{
|
||||||
Parameter, traits::Get, parameter_types,
|
Parameter, traits::Get, parameter_types,
|
||||||
runtime_primitives::{generic, BuildStorage, traits::{BlakeTwo256, Block as _, Verify}},
|
runtime_primitives::{generic, BuildStorage, traits::{BlakeTwo256, Block as _, Verify}},
|
||||||
|
metadata::{
|
||||||
|
DecodeDifferent, StorageMetadata, StorageEntryModifier, StorageEntryType, DefaultByteGetter,
|
||||||
|
StorageEntryMetadata, StorageHasher
|
||||||
|
},
|
||||||
};
|
};
|
||||||
use inherents::{
|
use inherents::{
|
||||||
ProvideInherent, InherentData, InherentIdentifier, RuntimeString, MakeFatalError
|
ProvideInherent, InherentData, InherentIdentifier, RuntimeString, MakeFatalError
|
||||||
@@ -408,3 +412,96 @@ fn storage_with_instance_basic_operation() {
|
|||||||
assert_eq!(DoubleMap::get(&key1, &key2), 0);
|
assert_eq!(DoubleMap::get(&key1, &key2), 0);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const EXPECTED_METADATA: StorageMetadata = StorageMetadata {
|
||||||
|
prefix: DecodeDifferent::Encode("Instance2Module2"),
|
||||||
|
entries: DecodeDifferent::Encode(
|
||||||
|
&[
|
||||||
|
StorageEntryMetadata {
|
||||||
|
name: DecodeDifferent::Encode("Value"),
|
||||||
|
modifier: StorageEntryModifier::Default,
|
||||||
|
ty: StorageEntryType::Plain(DecodeDifferent::Encode("T::Amount")),
|
||||||
|
default: DecodeDifferent::Encode(
|
||||||
|
DefaultByteGetter(
|
||||||
|
&module2::__GetByteStructValue(
|
||||||
|
std::marker::PhantomData::<(Runtime, module2::Instance2)>
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
|
},
|
||||||
|
StorageEntryMetadata {
|
||||||
|
name: DecodeDifferent::Encode("Map"),
|
||||||
|
modifier: StorageEntryModifier::Default,
|
||||||
|
ty: StorageEntryType::Map {
|
||||||
|
hasher: StorageHasher::Blake2_256,
|
||||||
|
key: DecodeDifferent::Encode("u64"),
|
||||||
|
value: DecodeDifferent::Encode("u64"),
|
||||||
|
is_linked: false,
|
||||||
|
},
|
||||||
|
default: DecodeDifferent::Encode(
|
||||||
|
DefaultByteGetter(
|
||||||
|
&module2::__GetByteStructMap(
|
||||||
|
std::marker::PhantomData::<(Runtime, module2::Instance2)>
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
|
},
|
||||||
|
StorageEntryMetadata {
|
||||||
|
name: DecodeDifferent::Encode("LinkedMap"),
|
||||||
|
modifier: StorageEntryModifier::Default,
|
||||||
|
ty: StorageEntryType::Map {
|
||||||
|
hasher: StorageHasher::Blake2_256,
|
||||||
|
key: DecodeDifferent::Encode("u64"),
|
||||||
|
value: DecodeDifferent::Encode("u64"),
|
||||||
|
is_linked: true,
|
||||||
|
},
|
||||||
|
default: DecodeDifferent::Encode(
|
||||||
|
DefaultByteGetter(
|
||||||
|
&module2::__GetByteStructLinkedMap(
|
||||||
|
std::marker::PhantomData::<(Runtime, module2::Instance2)>
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
|
},
|
||||||
|
StorageEntryMetadata {
|
||||||
|
name: DecodeDifferent::Encode("DoubleMap"),
|
||||||
|
modifier: StorageEntryModifier::Default,
|
||||||
|
ty: StorageEntryType::DoubleMap {
|
||||||
|
hasher: StorageHasher::Blake2_256,
|
||||||
|
key2_hasher: StorageHasher::Blake2_256,
|
||||||
|
key1: DecodeDifferent::Encode("u64"),
|
||||||
|
key2: DecodeDifferent::Encode("u64"),
|
||||||
|
value: DecodeDifferent::Encode("u64"),
|
||||||
|
},
|
||||||
|
default: DecodeDifferent::Encode(
|
||||||
|
DefaultByteGetter(
|
||||||
|
&module2::__GetByteStructDoubleMap(
|
||||||
|
std::marker::PhantomData::<(Runtime, module2::Instance2)>
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
documentation: DecodeDifferent::Encode(&[]),
|
||||||
|
}
|
||||||
|
]
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_instance_storage_metadata() {
|
||||||
|
let metadata = Module2_2::storage_metadata();
|
||||||
|
pretty_assertions::assert_eq!(EXPECTED_METADATA, metadata);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn instance_prefix_is_prefix_of_entries() {
|
||||||
|
use module2::Instance;
|
||||||
|
|
||||||
|
let prefix = module2::Instance2::PREFIX;
|
||||||
|
assert!(module2::Instance2::PREFIX_FOR_Value.starts_with(prefix));
|
||||||
|
assert!(module2::Instance2::PREFIX_FOR_Map.starts_with(prefix));
|
||||||
|
assert!(module2::Instance2::PREFIX_FOR_LinkedMap.starts_with(prefix));
|
||||||
|
assert!(module2::Instance2::PREFIX_FOR_DoubleMap.starts_with(prefix));
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user