macro_utils/
tern_python.rs

1// MIT License
2//
3// Copyright (c) 2018 Guillaume Gomez
4//
5// Permission is hereby granted, free of charge, to any person obtaining a copy
6// of this software and associated documentation files (the "Software"), to deal
7// in the Software without restriction, including without limitation the rights
8// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9// copies of the Software, and to permit persons to whom the Software is
10// furnished to do so, subject to the following conditions:
11//
12// The above copyright notice and this permission notice shall be included in all
13// copies or substantial portions of the Software.
14//
15// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21// SOFTWARE.
22
23/// You miss Python-like ternary conditions? Why not having them in Rust then?
24///
25/// ```
26/// # #[macro_use] extern crate macro_utils;
27/// let y = 4;
28/// let x = tern_python! { { "it's even" } if (y & 1 == 0) else { "it's odd" } };
29///
30/// println!("{} is {}", y, x);
31/// ```
32#[macro_export]
33macro_rules! tern_python {
34    ({ $if_expr:expr } if ($cond:expr) else { $else_expr:expr }) => {
35        if $cond {
36            $if_expr
37        } else {
38            $else_expr
39        }
40    };
41}
42
43/// The same as [`tern_python`] macro but shorter:
44///
45/// ```
46/// # #[macro_use] extern crate macro_utils;
47/// let y = 4;
48/// let x = tern_py! { { "it's even" } if (y & 1 == 0) else { "it's odd" } };
49///
50/// println!("{} is {}", y, x);
51/// ```
52///
53/// [`tern_python`]: macro.tern_python.html
54#[macro_export]
55macro_rules! tern_py {
56    ({ $if_expr:expr } if ($cond:expr) else { $else_expr:expr }) => {
57        if $cond {
58            $if_expr
59        } else {
60            $else_expr
61        }
62    };
63}
64
65#[test]
66fn tern_python() {
67    let y = 4;
68    let x = tern_python! { { "it's even" } if (y & 1 == 0) else { "it's odd" } };
69
70    assert_eq!(x, "it's even");
71
72    let x = tern_py! { { "it's even" } if (y & 1 == 0) else { "it's odd" } };
73
74    assert_eq!(x, "it's even");
75}