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));