mutate_exists for StorageValue with ValueQuery (#13245)

* mutate_exists for StorageValue with ValueQuery

Signed-off-by: muraca <mmuraca247@gmail.com>

* added `#[crate::storage_alias]` to tests

Signed-off-by: muraca <mmuraca247@gmail.com>

* added StorageEntryMetadata

Signed-off-by: muraca <mmuraca247@gmail.com>

* Update frame/support/src/lib.rs

---------

Signed-off-by: muraca <mmuraca247@gmail.com>
Co-authored-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io>
This commit is contained in:
Matteo Muraca
2023-01-28 00:47:17 +01:00
committed by GitHub
parent c9361bed1a
commit a9277002b9
4 changed files with 105 additions and 0 deletions
@@ -118,6 +118,30 @@ impl<T: FullCodec, G: StorageValue<T>> storage::StorageValue<T> for G {
ret
}
fn mutate_exists<R, F>(f: F) -> R
where
F: FnOnce(&mut Option<T>) -> R,
{
Self::try_mutate_exists(|v| Ok::<R, Never>(f(v)))
.expect("`Never` can not be constructed; qed")
}
fn try_mutate_exists<R, E, F>(f: F) -> Result<R, E>
where
F: FnOnce(&mut Option<T>) -> Result<R, E>,
{
let mut val = G::from_query_to_optional_value(Self::get());
let ret = f(&mut val);
if ret.is_ok() {
match val {
Some(ref val) => Self::put(val),
None => Self::kill(),
}
}
ret
}
fn take() -> G::Query {
let key = Self::storage_value_final_key();
let value = unhashed::get(&key);