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:
Bastian Köcher
2019-07-24 21:40:34 +02:00
committed by GitHub
parent 2b6f664caf
commit f7ff339ebd
11 changed files with 756 additions and 617 deletions
+1
View File
@@ -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",
+2 -2
View File
@@ -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,
}; };
+20 -7
View File
@@ -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, &quote!(#[doc(hidden)]), &const_names, scrate, &instantiable "",
&inherent_instance,
&quote!(#[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
View File
@@ -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);
} }
} }
+156 -159
View File
@@ -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() {
+12 -3
View File
@@ -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);
} }
+1
View File
@@ -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));
}