allow storage value build to put no value (#4319)

This commit is contained in:
thiolliere
2019-12-07 15:30:57 +01:00
committed by Gavin Wood
parent cbd85e65b6
commit b8ac094649
2 changed files with 75 additions and 10 deletions
@@ -44,32 +44,55 @@ impl BuilderDef {
let storage_trait = &line.storage_trait;
let value_type = &line.value_type;
// Contains the data to inset at genesis either from build or config.
// Defines the data variable to use for insert at genesis either from build or config.
let mut data = None;
if let Some(builder) = &line.build {
is_generic |= ext::expr_contains_ident(&builder, &def.module_runtime_generic);
is_generic |= line.is_generic;
data = Some(quote_spanned!(builder.span() => &(#builder)(self)));
data = Some(match &line.storage_type {
StorageLineTypeDef::Simple(_) if line.is_option =>
quote_spanned!(builder.span() =>
let data = (#builder)(self);
let data = Option::as_ref(&data);
),
_ => quote_spanned!(builder.span() => let data = &(#builder)(self); ),
});
} else if let Some(config) = &line.config {
is_generic |= line.is_generic;
data = Some(quote!(&self.#config;));
data = Some(match &line.storage_type {
StorageLineTypeDef::Simple(_) if line.is_option =>
quote!( let data = Some(&self.#config); ),
_ => quote!( let data = &self.#config; ),
});
};
if let Some(data) = data {
blocks.push(match &line.storage_type {
StorageLineTypeDef::Simple(_) => {
StorageLineTypeDef::Simple(_) if line.is_option => {
quote!{{
let v: &#value_type = #data;
#data
let v: Option<&#value_type>= data;
if let Some(v) = v {
<#storage_struct as #scrate::#storage_trait>::put::<&#value_type>(v);
}
}}
},
StorageLineTypeDef::Simple(_) if !line.is_option => {
quote!{{
#data
let v: &#value_type = data;
<#storage_struct as #scrate::#storage_trait>::put::<&#value_type>(v);
}}
},
StorageLineTypeDef::Simple(_) => unreachable!(),
StorageLineTypeDef::Map(map) | StorageLineTypeDef::LinkedMap(map) => {
let key = &map.key;
quote!{{
let data: &#scrate::rstd::vec::Vec<(#key, #value_type)> = #data;
#data
let data: &#scrate::rstd::vec::Vec<(#key, #value_type)> = data;
data.iter().for_each(|(k, v)| {
<#storage_struct as #scrate::#storage_trait>::insert::<
&#key, &#value_type
@@ -81,7 +104,8 @@ impl BuilderDef {
let key1 = &map.key1;
let key2 = &map.key2;
quote!{{
let data: &#scrate::rstd::vec::Vec<(#key1, #key2, #value_type)> = #data;
#data
let data: &#scrate::rstd::vec::Vec<(#key1, #key2, #value_type)> = data;
data.iter().for_each(|(k1, k2, v)| {
<#storage_struct as #scrate::#storage_trait>::insert::<
&#key1, &#key2, &#value_type