#fail #unwrap #macro #safe #unwrapping #require #annotating

no-std safe_unwrap

The safe_unwrap crate allows unwrapping and annotating that the unwrap will never fail. Does not require std.

6 releases (3 breaking)

Uses old Rust 2015

0.4.1 Apr 10, 2018
0.4.0 Mar 13, 2018
0.3.1 Mar 13, 2018
0.2.0 Apr 26, 2017
0.1.1 Dec 30, 2016

#1713 in Rust patterns

Download history 129/week @ 2024-07-22 150/week @ 2024-07-29 106/week @ 2024-08-05 41/week @ 2024-08-12 144/week @ 2024-08-19 53/week @ 2024-08-26 48/week @ 2024-09-02 39/week @ 2024-09-09 39/week @ 2024-09-16 54/week @ 2024-09-23 29/week @ 2024-09-30 154/week @ 2024-10-07 88/week @ 2024-10-14 75/week @ 2024-10-21 58/week @ 2024-10-28 95/week @ 2024-11-04

317 downloads per month

MIT license

9KB
133 lines

safe_unwrap

The safe_unwrap macros allows unwrapping and annotating that the unwrap will never fail.

An example:

#[macro_use]
extern crate safe_unwrap;

fn main() {
  let res = Some(42);

  // we know that unwrapping res will never fail, so it is safe to call unwrap
  let val = safe_unwrap!("is constant value", res);

  assert_eq!(val, 42);
}

In release builds, safe_unwrap!(expr) is equivalent to expr.unwrap(); in debug builds, expect() will be called with a message indicating that the assumed invariant has been violated.

The crate does not require std.


lib.rs:

Annotate unwraps as manually checked

The safe_unwrap macros allows unwrapping and annotating that the unwrap will never fail.

An example:

#[macro_use]
extern crate safe_unwrap;

fn main() {
   let res = Some(42);

   // we know that unwrapping res will never fail, so it is safe to call unwrap
   let val = safe_unwrap!("is constant value", res);

   assert_eq!(val, 42);
}

In release builds, safe_unwrap!(expr) is equivalent to expr.unwrap(); in debug builds, expect() will be called with a message indicating that the assumed invariant has been violated.

Alternative, for Result and Option types, you can risk a small bit of overhead in exchange for nicer syntax:

extern crate safe_unwrap;
use safe_unwrap::SafeUnwrap;

fn main() {
    let res = Some(42);

    // works only for Result and Option types
    let val = res.safe_unwrap("is constant value");

    assert_eq!(val, 42);

    #[cfg(feature = "std")]
    {
        // With `std`, two additional methods are available.
        let val = res.unwrap_or_abort("is constant value");
        assert_eq!(val, 42);
        let val = res.unwrap_or_exit("is constant value");
        assert_eq!(val, 42);
    }
}

The semantics of .safe_unwrap are otherwise the same as the safe_unwrap! macro. The tradeoff here is that you are at the mercy of the LLVM optimizer to remove the unused static string "is constant value" from the resulting executable (often works in release mode).

std support

By default, no_std is supported. With the std feature, SafeUnwrap has two additional methods, which require the standard library. They work the same way as safe_unwrap, but:

  • unwrap_or_abort aborts the process instead of panicking.
  • unwrap_or_exit exits with code 1 instead of panicking.

No runtime deps

Features