Result<Option<>> rather than Option<Option<>> (#9119)

* Clearer API to code against.
This commit is contained in:
Squirrel
2021-06-23 13:41:46 +01:00
committed by GitHub
parent 07449840bd
commit 6ccb5dc713
7 changed files with 121 additions and 86 deletions
@@ -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();
});