Macro konst::result::unwrap_ctx[][src]

macro_rules! unwrap_ctx {
    ($e : expr $(,) ?) => { ... };
}
Expand description

For unwrapping Results in const contexts with some error message.

The error type must have a method with this signature:

pub const fn panic(&self) -> ! {

The Results returned by Parser methods can all be used with this macro.

Example

Basic

use konst::{Parser, unwrap_ctx};

let mut parser = Parser::from_str("hello world");

parser = unwrap_ctx!(parser.strip_prefix("hello "));

assert_eq!(parser.bytes(), "world".as_bytes());

Defining error type

use konst::unwrap_ctx;

const UNWRAPPED: u32 = {
    let res: Result<u32, FooError> = Ok(100);
    unwrap_ctx!(res)
};

assert_eq!(UNWRAPPED, 100);


use std::fmt::{self, Display};

#[derive(Debug, Clone, PartialEq)]
pub struct FooError(usize);

impl FooError {
    pub const fn panic(&self) -> ! {
        let offset = self.0;
        [/*Foo errored at offset*/][offset]
    }
}

impl Display for FooError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        fmt::Debug::fmt(self, f)
    }
}

impl std::error::Error for FooError {}

If res was an error instead, this is the error message you would see:

error: any use of this value will cause an error
  --> src/result.rs:55:9
   |
6  | / const UNWRAPPED: u32 = {
7  | |     let res: Result<u32, FooError> = Err(FooError(100));
8  | |     // let res: Result<u32, FooError> = Ok(100);
9  | |     unwrap_ctx!(res)
10 | | };
   | |__-
...
23 |           [/*Foo errored at offset*/][offset]
   |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |           |
   |           index out of bounds: the length is 0 but the index is 100
   |           inside `FooError::panic` at src/result.rs:23:9
   |           inside `UNWRAPPED` at src/result_macros_.rs:6:35
   |
   = note: `#[deny(const_err)]` on by default