Check if a value is "truthy"
```rust // non-zero numbers are truthy 0u32.truthy() // false 0f32.truthy() // false 1u32.truthy() // true 1f32.truthy() // true
// empty strings are not truthy "".truthy() // false " ".truthy() // true
// Options are truthy if not None and their value is truthy let none: Option<()> = None; let falsyinner = Some(false); let truthyinner = Some(true); none.truthy() // false falsyinner.truthy() // false truthyinner.truthy() // true
// Results are truthy if Ok and value is truthy let falsyerr: Result<(), _> = Err(false); let truthyerr: Result<(), > = Err(true); let falsyok: Result<_, ()> = Ok(false); let truthy_ok: Result<_, ()> = Ok(true);
falsyerr.truthy() // false truthyerr.truthy() // false falsyok.truthy() // false truthyok.truthy() // true
// Empty vecs and arrays are falsy let emptyarray: [();0] = []; let emptyvec: Vec<()> = Vec::new();
emptyarray.truthy() // false emptyvec.truthy() // false
// The truthy behavior of arrays and vecs also applies to tuples from size 0 to 12 let emptytuple = (); let notemptytuple = (1, "2", '3'); emptytuple.truthy() // false notemptytuple.truthy() // true ```
truthy!
macrorust
let my_bool = x.truthy() && y.truthy() || !z.truthy();
The above code can be a bit annoying, having to repeat .truthy()
multiple times. The truthy!
macro appends .truthy()
to save you time.
rust
let my_bool = truthy!(x && y || !z);
You can run the example with cargo run --example truthy_macro
.
The truthy!
macro cannot take non-boolean expressions. The only valid tokens in truthy!
are
(
, )
, !
, &&
, ||
, and identities. For example, the following would fail to compile.
rust
truthy!(Some(1).unwrap() && 0 + 1);
To get around this, you would need to assign the expressions before using truthy!
.
rust
let x = Some(1).unwrap();
let y = 0 + 1;
truthy!(x && y);
and-or
This crate has an and-or
feature, which will provide the functions truthy_and
and truthy_or
to
any type that implements Truthy
and Sized
.
For example, true.truthy_and("It was truthy!")
returns Some("It was truthy!")
.
You can run the example with cargo run --features and-or --example and_or
.