[][src]Crate if_chain

This crate provides a single macro called if_chain!.

if_chain! lets you write long chains of nested if and if let statements without the associated rightward drift. It also supports multiple patterns (e.g. if let Foo(a) | Bar(a) = b) in places where Rust would normally not allow them.

See the associated blog post for the background behind this crate.

Note about recursion limits

If you run into "recursion limit reached" errors while using this macro, try adding

This example is not tested
#![recursion_limit = "1000"]

to the top of your crate.

Examples

Quick start

This example is not tested
if_chain! {
    if let Some(y) = x;
    if y.len() == 2;
    if let Some(z) = y;
    then {
        do_stuff_with(z);
    }
}

becomes

This example is not tested
if let Some(y) = x {
    if y.len() == 2 {
        if let Some(z) = y {
            do_stuff_with(z);
        }
    }
}

Fallback values with else

This example is not tested
if_chain! {
    if let Some(y) = x;
    if let Some(z) = y;
    then {
        do_stuff_with(z)
    } else {
        do_something_else()
    }
}

becomes

This example is not tested
if let Some(y) = x {
    if let Some(z) = y {
        do_stuff_with(z)
    } else {
        do_something_else()
    }
} else {
    do_something_else()
}

Intermediate variables with let

This example is not tested
if_chain! {
    if let Some(y) = x;
    let z = y.some().complicated().expression();
    if z == 42;
    then {
       do_stuff_with(y);
    }
}

becomes

This example is not tested
if let Some(y) = x {
    let z = y.some().complicated().expression();
    if z == 42 {
        do_stuff_with(y);
    }
}

Type ascription

This example is not tested
let mut x = some_generic_computation();
if_chain! {
    if x > 7;
    let y: u32 = another_generic_computation();
    then { x += y }
    else { x += 1 }
}

becomes

This example is not tested
let mut x = some_generic_computation();
if x > 7 {
    let y: u32 = another_generic_computation();
    x += y
} else {
    x += 1
}

Multiple patterns

This example is not tested
if_chain! {
    if let Foo(y) | Bar(y) | Baz(y) = x;
    let Bubbles(z) | Buttercup(z) | Blossom(z) = y;
    then { do_stuff_with(z) }
}

becomes

This example is not tested
match x {
    Foo(y) | Bar(y) | Baz(y) => match y {
        Bubbles(z) | Buttercup(z) | Blossom(z) => do_stuff_with(z)
    },
    _ => {}
}

Note that if you use a plain let, then if_chain! assumes that the pattern is irrefutable (always matches) and doesn't add a fallback branch.

Macros

if_chain

Macro for writing nested if let expressions.