konst

Macro try_rebind

Source
macro_rules! try_rebind {
    (
        $pattern:tt = $expression:expr $(,)?
    ) => { ... };
}
Expand description

Like the ? operator, but also reassigns variables with the value in the Ok variant.

Note: the Ok variant can only be destructured into a single variable or a tuple.

§Let pattern

You can declare new variables with let patterns like this:

try_rebind!{(let foo, bar) = Ok((10, 20))}
try_rebind!{(let (a, b, c), bar) = Ok(((10, 10, 10), 20))}

foo in here is a new variable initialized with 10 (same for a, b, and c), while bar is a pre-existing variable that is assigned 20.

This pattern only works when destructuring tuples.

§Examples

§Parsing

Inside of parse_int_pair, parser always refers to the same variable.

use konst::{
    parsing::{Parser, ParseValueResult},
    try_rebind, unwrap_ctx,
};

const fn parse_int_pair(mut parser: Parser<'_>) -> ParseValueResult<'_, (u64, u64)> {

    // `parser` is reassigned if the `parse_u64` method returns an `Ok`.
    // (this also happens in every other invocation of `try_rebind` in this example)
    try_rebind!{(let aa, parser) = parser.parse_u64()}

    try_rebind!{parser = parser.strip_prefix(',')}

    try_rebind!{(let bb, parser) = parser.parse_u64()}

    Ok(((aa, bb), parser))
}

const PAIR: (u64, u64) = {
    let parser = Parser::new("100,200");
    unwrap_ctx!(parse_int_pair(parser)).0
};

assert_eq!(PAIR, (100, 200));