mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-26 09:57:56 +00:00
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:
@@ -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);
|
||||
|
||||
@@ -114,6 +114,12 @@ pub trait StorageValue<T: FullCodec> {
|
||||
/// Mutate the value if closure returns `Ok`
|
||||
fn try_mutate<R, E, F: FnOnce(&mut Self::Query) -> Result<R, E>>(f: F) -> Result<R, E>;
|
||||
|
||||
/// Mutate the value. Deletes the item if mutated to a `None`.
|
||||
fn mutate_exists<R, F: FnOnce(&mut Option<T>) -> R>(f: F) -> R;
|
||||
|
||||
/// Mutate the value if closure returns `Ok`. Deletes the item if mutated to a `None`.
|
||||
fn try_mutate_exists<R, E, F: FnOnce(&mut Option<T>) -> Result<R, E>>(f: F) -> Result<R, E>;
|
||||
|
||||
/// Clear the storage value.
|
||||
fn kill();
|
||||
|
||||
|
||||
@@ -142,6 +142,18 @@ where
|
||||
<Self as crate::storage::StorageValue<Value>>::try_mutate(f)
|
||||
}
|
||||
|
||||
/// Mutate the value. Deletes the item if mutated to a `None`.
|
||||
pub fn mutate_exists<R, F: FnOnce(&mut Option<Value>) -> R>(f: F) -> R {
|
||||
<Self as crate::storage::StorageValue<Value>>::mutate_exists(f)
|
||||
}
|
||||
|
||||
/// Mutate the value if closure returns `Ok`. Deletes the item if mutated to a `None`.
|
||||
pub fn try_mutate_exists<R, E, F: FnOnce(&mut Option<Value>) -> Result<R, E>>(
|
||||
f: F,
|
||||
) -> Result<R, E> {
|
||||
<Self as crate::storage::StorageValue<Value>>::try_mutate_exists(f)
|
||||
}
|
||||
|
||||
/// Clear the storage value.
|
||||
pub fn kill() {
|
||||
<Self as crate::storage::StorageValue<Value>>::kill()
|
||||
|
||||
Reference in New Issue
Block a user