mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-13 15:11:03 +00:00
Result<Option<>> rather than Option<Option<>> (#9119)
* Clearer API to code against.
This commit is contained in:
@@ -61,7 +61,7 @@
|
||||
//! }
|
||||
//! ```
|
||||
|
||||
use crate::offchain::storage::StorageValueRef;
|
||||
use crate::offchain::storage::{StorageRetrievalError, MutateStorageError, StorageValueRef};
|
||||
use crate::traits::AtLeast32BitUnsigned;
|
||||
use codec::{Codec, Decode, Encode};
|
||||
use sp_core::offchain::{Duration, Timestamp};
|
||||
@@ -279,19 +279,20 @@ impl<'a, L: Lockable> StorageLock<'a, L> {
|
||||
|
||||
/// Extend active lock's deadline
|
||||
fn extend_active_lock(&mut self) -> Result<<L as Lockable>::Deadline, ()> {
|
||||
let res = self.value_ref.mutate(|s: Option<Option<L::Deadline>>| -> Result<<L as Lockable>::Deadline, ()> {
|
||||
let res = self.value_ref.mutate(
|
||||
|s: Result<Option<L::Deadline>, StorageRetrievalError>| -> Result<<L as Lockable>::Deadline, ()> {
|
||||
match s {
|
||||
// lock is present and is still active, extend the lock.
|
||||
Some(Some(deadline)) if !<L as Lockable>::has_expired(&deadline) =>
|
||||
Ok(Some(deadline)) if !<L as Lockable>::has_expired(&deadline) =>
|
||||
Ok(self.lockable.deadline()),
|
||||
// other cases
|
||||
_ => Err(()),
|
||||
}
|
||||
});
|
||||
match res {
|
||||
Ok(Ok(deadline)) => Ok(deadline),
|
||||
Ok(Err(_)) => Err(()),
|
||||
Err(e) => Err(e),
|
||||
Ok(deadline) => Ok(deadline),
|
||||
Err(MutateStorageError::ConcurrentModification(_)) => Err(()),
|
||||
Err(MutateStorageError::ValueFunctionFailed(e)) => Err(e),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -301,25 +302,25 @@ impl<'a, L: Lockable> StorageLock<'a, L> {
|
||||
new_deadline: L::Deadline,
|
||||
) -> Result<(), <L as Lockable>::Deadline> {
|
||||
let res = self.value_ref.mutate(
|
||||
|s: Option<Option<L::Deadline>>|
|
||||
|s: Result<Option<L::Deadline>, StorageRetrievalError>|
|
||||
-> Result<<L as Lockable>::Deadline, <L as Lockable>::Deadline> {
|
||||
match s {
|
||||
// no lock set, we can safely acquire it
|
||||
None => Ok(new_deadline),
|
||||
Ok(None) => Ok(new_deadline),
|
||||
// write was good, but read failed
|
||||
Some(None) => Ok(new_deadline),
|
||||
Err(_) => Ok(new_deadline),
|
||||
// lock is set, but it is expired. We can re-acquire it.
|
||||
Some(Some(deadline)) if <L as Lockable>::has_expired(&deadline) =>
|
||||
Ok(Some(deadline)) if <L as Lockable>::has_expired(&deadline) =>
|
||||
Ok(new_deadline),
|
||||
// lock is present and is still active
|
||||
Some(Some(deadline)) => Err(deadline),
|
||||
Ok(Some(deadline)) => Err(deadline),
|
||||
}
|
||||
},
|
||||
);
|
||||
match res {
|
||||
Ok(Ok(_)) => Ok(()),
|
||||
Ok(Err(deadline)) => Err(deadline),
|
||||
Err(e) => Err(e),
|
||||
Ok(_) => Ok(()),
|
||||
Err(MutateStorageError::ConcurrentModification(deadline)) => Err(deadline),
|
||||
Err(MutateStorageError::ValueFunctionFailed(e)) => Err(e),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -488,14 +489,14 @@ mod tests {
|
||||
|
||||
val.set(&VAL_1);
|
||||
|
||||
assert_eq!(val.get::<u32>(), Some(Some(VAL_1)));
|
||||
assert_eq!(val.get::<u32>(), Ok(Some(VAL_1)));
|
||||
}
|
||||
|
||||
{
|
||||
let _guard = lock.lock();
|
||||
val.set(&VAL_2);
|
||||
|
||||
assert_eq!(val.get::<u32>(), Some(Some(VAL_2)));
|
||||
assert_eq!(val.get::<u32>(), Ok(Some(VAL_2)));
|
||||
}
|
||||
});
|
||||
// lock must have been cleared at this point
|
||||
@@ -518,7 +519,7 @@ mod tests {
|
||||
|
||||
val.set(&VAL_1);
|
||||
|
||||
assert_eq!(val.get::<u32>(), Some(Some(VAL_1)));
|
||||
assert_eq!(val.get::<u32>(), Ok(Some(VAL_1)));
|
||||
|
||||
guard.forget();
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user