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

#124 in Debugging

Download history 57572/week @ 2024-11-17 56363/week @ 2024-11-24 53339/week @ 2024-12-01 63420/week @ 2024-12-08 51109/week @ 2024-12-15 26653/week @ 2024-12-22 34030/week @ 2024-12-29 51508/week @ 2025-01-05 63000/week @ 2025-01-12 55688/week @ 2025-01-19 47754/week @ 2025-01-26 59892/week @ 2025-02-02 62365/week @ 2025-02-09 60151/week @ 2025-02-16 54822/week @ 2025-02-23 51510/week @ 2025-03-02

232,564 downloads per month
Used in 130 crates (5 directly)

MIT/Apache

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

~83KB