[][src]Macro srml_support_procedural::decl_storage

decl_storage!() { /* proc-macro */ }

Declares strongly-typed wrappers around codec-compatible types in storage.

Example

decl_storage! {
    trait Store for Module<T: Trait> as Example {
        Foo get(foo) config(): u32=12;
        Bar: map u32 => u32;
        pub Zed build(|config| vec![(0, 0)]): linked_map u32 => u32;
    }
}

Declaration is set with this header (pub) trait Store for Module<T: Trait> as Example with Store a (pub) trait generated associating each storage to the Module and as Example setting the prefix used for storages of this module. Example must be unique: another module with same name and same inner storage item name will conflict.

Basic storage consists of a name and a type; supported types are:

And it can be extended as such:

#vis #name get(#getter) config(#field_name) build(#closure): #type = #default;

Storage items are accessible in multiple ways:

GenesisConfig

An optional GenesisConfig struct for storage initialization can be defined, either when at least one storage field requires default initialization (both get and config or build), or specifically as in:

decl_storage! {
    trait Store for Module<T: Trait> as Example {

        // Your storage items
    }
    add_extra_genesis {
        config(genesis_field): GenesisFieldType;
        config(genesis_field2): GenesisFieldType;
        ...
        build(|_: &mut StorageOverlay, _: &mut ChildrenStorageOverlay, _: &GenesisConfig<T>| {
            // Modification of storage
        })
    }
}

This struct can be exposed as Config by the decl_runtime! macro.

Module with instances

The decl_storage! macro supports building modules with instances with the following syntax: (DefaultInstance type is optional)

trait Store for Module<T: Trait<I>, I: Instance=DefaultInstance> as Example {}

Then the genesis config is generated with two generic parameter GenesisConfig<T, I> and storage items are now accessible using two generic parameters, e.g.: <Dummy<T, I>>::get() or Dummy::<T, I>::get()