mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-07-02 05:57:23 +00:00
d743a8b71f
* first implementation
* remove done comment
* origin done
* impl log for instance
* impl inherent for instance
* Fix wasm build + full example build
this requires parity codec implements codec for core::marker::PhantomData
* patch parity-codec link to github branch
* improve internal names and fix instance prefix
* Fix in macros
* add test modules for support
this allow to test for construct_runtime as well.
The reason to have put that in another crate is:
* if we put test in `tests/` dir of srml/support then decl_storage fails to get
srml-support access because it believes it is inside srml-support
crate and so derive access to `quote!{ crate }` but this is wrong
(and I don't see any way to prevent that, and it only bother us so I
don't think that matters that much)
* if we put test inside lib.rs then contruct_runtime cannot be used
because it call some macros that are defined with macros
(decl_outer_event and decl_outer_origin) and thus rustc complains.
* defaultinstance to its own struct to avoid errors
* enforce <T, I> for Event and Config, impl test
* add origin, log, inherent to test
* test more code generation
* basic storage test
* fix typo
* rename a few imports and field
* delete wip test in example and runtime
* change default prefix to make it backward compatible with test
* rename Instance to I and Instantiable to Instance
note: the name of generic parameter I is only enforce by decl_module!
and this could be rewritten
* doc
* clean old TODOs
* update parity-codec to 3.2
* update node impl version + builds
* fix warning
* fix unrelated grandpa test
* refactor code
77 lines
2.7 KiB
Rust
77 lines
2.7 KiB
Rust
// Copyright 2017-2019 Parity Technologies (UK) Ltd.
|
|
// This file is part of Substrate.
|
|
|
|
// Substrate is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
|
|
// Substrate is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with Substrate. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
// tag::description[]
|
|
//! Proc macro of Support code for the runtime.
|
|
// end::description[]
|
|
|
|
#![recursion_limit="256"]
|
|
|
|
extern crate proc_macro;
|
|
|
|
mod storage;
|
|
|
|
use proc_macro::TokenStream;
|
|
|
|
/// Declares strongly-typed wrappers around codec-compatible types in storage.
|
|
///
|
|
/// ## Example
|
|
///
|
|
/// ```nocompile
|
|
/// decl_storage! {
|
|
/// trait Store for Module<T: Trait> as Example {
|
|
/// Dummy get(dummy) config(): Option<T::Balance>;
|
|
/// Foo get(foo) config(): T::Balance;
|
|
/// }
|
|
/// }
|
|
/// ```
|
|
///
|
|
/// For now we implement a convenience trait with pre-specialised associated types, one for each
|
|
/// storage item. This allows you to gain access to publicly visible storage items from a
|
|
/// module type. Currently you must disambiguate by using `<Module as Store>::Item` rather than
|
|
/// the simpler `Module::Item`. Hopefully the rust guys with fix this soon.
|
|
///
|
|
/// An optional `GenesisConfig` struct for storage initialization can be defined, either specifically as in :
|
|
/// ```nocompile
|
|
/// decl_storage! {
|
|
/// trait Store for Module<T: Trait> as Example {
|
|
/// }
|
|
/// add_extra_genesis {
|
|
/// config(genesis_field): GenesisFieldType;
|
|
/// build(|_: &mut StorageOverlay, _: &mut ChildrenStorageOverlay, _: &GenesisConfig<T>| {
|
|
/// })
|
|
/// }
|
|
/// }
|
|
/// ```
|
|
/// or when at least one storage field requires default initialization (both `get` and `config` or `build`).
|
|
/// This struct can be expose as `Config` by `decl_runtime` macro.
|
|
///
|
|
/// ### Module with instances
|
|
///
|
|
/// `decl_storage!` macro support building modules with instances with the following syntax: (DefaultInstance type
|
|
/// is optionnal)
|
|
/// ```nocompile
|
|
/// 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 storages are now accessible using two generic parameters like:
|
|
/// `<Dummy<T, I>>::get()` or `Dummy::<T, I>::get()`
|
|
#[proc_macro]
|
|
pub fn decl_storage(input: TokenStream) -> TokenStream {
|
|
storage::transformation::decl_storage_impl(input)
|
|
}
|