From 98398b4b458253298c96812945f80649378c652a Mon Sep 17 00:00:00 2001 From: Michal Kucharczyk <1728078+michalkucharczyk@users.noreply.github.com> Date: Wed, 17 May 2023 08:57:09 +0200 Subject: [PATCH] frame::support: macro generating GenesisBuild::build for RuntimeGenesisConfig --- .../src/construct_runtime/expand/config.rs | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/frame/support/procedural/src/construct_runtime/expand/config.rs b/frame/support/procedural/src/construct_runtime/expand/config.rs index f74e8cbf4d088..02cb6fd065ead 100644 --- a/frame/support/procedural/src/construct_runtime/expand/config.rs +++ b/frame/support/procedural/src/construct_runtime/expand/config.rs @@ -30,6 +30,7 @@ pub fn expand_outer_config( let mut types = TokenStream::new(); let mut fields = TokenStream::new(); let mut build_storage_calls = TokenStream::new(); + let mut genesis_build_calls = TokenStream::new(); let mut query_genesis_config_part_macros = Vec::new(); for decl in pallet_decls { @@ -54,6 +55,9 @@ pub fn expand_outer_config( fields.extend(quote!(#attr pub #field_name: #config,)); build_storage_calls .extend(expand_config_build_storage_call(scrate, attr, runtime, decl, field_name)); + genesis_build_calls.extend(expand_config_genesis_build_call( + scrate, &config, attr, runtime, decl, field_name, + )); query_genesis_config_part_macros.push(quote! { #path::__substrate_genesis_config_check::is_genesis_config_defined!(#pallet_name); #[cfg(feature = "std")] @@ -95,6 +99,12 @@ pub fn expand_outer_config( Ok(()) } } + + impl #scrate::traits::GenesisBuild for RuntimeGenesisConfig { + fn build(&self) { + #genesis_build_calls + } + } } } @@ -143,3 +153,24 @@ fn expand_config_build_storage_call( <#runtime, #instance>::build_module_genesis_storage(&self.#field_name, storage)?; } } + +fn expand_config_genesis_build_call( + scrate: &TokenStream, + pallet_genesis_config: &Ident, + attr: &TokenStream, + runtime: &Ident, + decl: &Pallet, + field_name: &Ident, +) -> TokenStream { + let path = &decl.path; + let instance = if let Some(inst) = decl.instance.as_ref() { + quote!(#path::#inst) + } else { + quote!(#path::__InherentHiddenInstance) + }; + + quote! { + #attr + <#pallet_genesis_config as #scrate::traits::GenesisBuild::<#runtime, #instance>>::build(&self.#field_name); + } +}