5 releases
0.2.0 | Jan 23, 2024 |
---|---|
0.1.3 | Apr 7, 2023 |
0.1.2 | Feb 4, 2021 |
0.1.1 | Jan 26, 2021 |
0.1.0 | Jan 26, 2021 |
#77 in Debugging
264,150 downloads per month
Used in 83 crates
(6 directly)
8KB
always-assert
Recoverable assertions, inspired by the use of assert()
in SQLite.
use always_assert::never;
fn apply_transaction(&mut self, tx: Transaction) -> Result<(), TransactionAborted> {
let delta = self.compute_delta(&tx);
if never!(!self.check_internal_invariant(&delta)) {
// Ok, something in this transaction messed up our internal state.
// This really shouldn't be happening, and this signifies a bug.
// Luckily, we can recover by just rejecting the transaction.
return abort_transaction(tx);
}
self.commit(delta);
Ok(())
}
lib.rs
:
Recoverable assertions, inspired by the use of assert()
in
SQLite.
never!
and always!
return the actual value of the condition if
debug_assertions
are disabled.
Use them when terminating on assertion failure is worse than continuing.
One example would be a critical application like a database:
use always_assert::never;
fn apply_transaction(&mut self, tx: Transaction) -> Result<(), TransactionAborted> {
let delta = self.compute_delta(&tx);
if never!(!self.check_internal_invariant(&delta)) {
// Ok, something in this transaction messed up our internal state.
// This really shouldn't be happening, and this signifies a bug.
// Luckily, we can recover by just rejecting the transaction.
return abort_transaction(tx);
}
self.commit(delta);
Ok(())
}
Another example is assertions about non-critical functionality in usual apps
use always_assert::never;
let english_message = "super app installed!"
let mut local_message = localize(english_message);
if never!(local_message.is_empty(), "missing localization for {}", english_message) {
// We localized all the messages but this one slipper through the cracks?
// Better to show the english one then than to fail outright;
local_message = english_message;
}
println!("{}", local_message);
Dependencies
~82KB