### 4 releases

0.1.3 | Jul 20, 2018 |
---|---|

0.1.2 | Feb 17, 2017 |

0.1.1 | Dec 29, 2016 |

0.1.0 | Dec 28, 2016 |

#**10** in Rust patterns

**36,654** downloads per month

Used in **46** crates (12 directly)

**MIT/Apache**

8KB

104 lines

# if_chain

This crate provides a single macro called

.`if_chain!`

lets you write long chains of nested `if_chain!`

and `if`

statements without the associated rightward drift. It also supports multiple patterns (e.g. `if` `let`

) in places where Rust would normally not allow them.`if` `let` Foo`(`a`)` `|` Bar`(`a`)` `=` b

For more information on this crate, see the documentation and associated blog post.

###
`lib.rs`

:

This crate provides a single macro called

.`if_chain!`

lets you write long chains of nested `if_chain!`

and `if`

statements without the associated rightward drift. It also supports multiple
patterns (e.g. `if` `let`

) in places where Rust would
normally not allow them.`if` `let` Foo`(`a`)` `|` Bar`(`a`)` `=` b

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

`#!``[``recursion_limit` `=` `"`1000`"``]`

to the top of your crate.

# Examples

## Quick start

`if_chain!` `{`
`if` `let` `Some``(`y`)` `=` x`;`
`if` y`.``len``(``)` `=``=` `2``;`
`if` `let` `Some``(`z`)` `=` y`;`
then `{`
`do_stuff_with``(`z`)``;`
`}`
`}`

becomes

`if` `let` `Some``(`y`)` `=` x `{`
`if` y`.``len``(``)` `=``=` `2` `{`
`if` `let` `Some``(`z`)` `=` y `{`
`do_stuff_with``(`z`)``;`
`}`
`}`
`}`

## Fallback values with `else`

`else``if_chain!` `{`
`if` `let` `Some``(`y`)` `=` x`;`
`if` `let` `Some``(`z`)` `=` y`;`
then `{`
`do_stuff_with``(`z`)`
`}` `else` `{`
`do_something_else``(``)`
`}`
`}`

becomes

`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`

`let``if_chain!` `{`
`if` `let` `Some``(`y`)` `=` x`;`
`let` z `=` y`.``some``(``)``.``complicated``(``)``.``expression``(``)``;`
`if` z `=``=` `42``;`
then `{`
`do_stuff_with``(`y`)``;`
`}`
`}`

becomes

`if` `let` `Some``(`y`)` `=` x `{`
`let` z `=` y`.``some``(``)``.``complicated``(``)``.``expression``(``)``;`
`if` z `=``=` `42` `{`
`do_stuff_with``(`y`)``;`
`}`
`}`

## Multiple patterns

`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

`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

, then `let`

assumes that the
pattern is `if_chain!`*irrefutable* (always matches) and doesn't add a fallback branch.