cli_log/
time.rs

1/// print the time that executing some expression took
2/// but only when relevant according to log level.
3///
4/// The goal of this macro is to avoid doing useless
5/// `Instant::now`.
6///
7/// Arguments:
8/// - log level, optional (default is `Debug`)
9/// - a category, optional (only if name is set)
10/// - a name, optional (stringified expression is used by default)
11/// - the expression whose duration we want to log depending on the level
12///
13/// Examples:
14///
15/// ```
16/// # use log::*;
17/// # use cli_log::*;
18/// # fn do_stuff(arg: usize) -> Result<usize, String> {
19/// #    Ok(arg)
20/// # }
21/// # fn main() -> Result<(), String> {
22/// let result = time!(do_stuff(4));
23/// let result = time!(Debug, do_stuff(3))?;
24/// let result = time!("World creation", do_stuff(7));
25/// let sum = time!(Debug, "summing", 2 + 2);
26/// let sum = time!(Debug, "summing", 2 + 2);
27/// let mult = time!("operations", "mult 4", 3 * 4);
28/// let mult = time!(Info, "operations", "mult 4", 3 * 4);
29/// # Ok(())
30/// # }
31/// ```
32#[macro_export]
33macro_rules! time {
34    ($timed: expr $(,)?) => {{
35        use cli_log::{
36            Level::*,
37            *,
38        };
39        if log_enabled!(Debug) {
40            let start = std::time::Instant::now();
41            match $timed {
42                value => {
43                    log!(Debug, "{} took {:?}", stringify!($timed), start.elapsed());
44                    value
45                }
46            }
47        } else {
48            $timed
49        }
50    }};
51    ($level: ident, $timed: expr $(,)?) => {{
52        use cli_log::{
53            Level::*,
54            *,
55        };
56        if log_enabled!($level) {
57            let start = std::time::Instant::now();
58            match $timed {
59                value => {
60                    log!($level, "{} took {:?}", stringify!($timed), start.elapsed());
61                    value
62                }
63            }
64        } else {
65            $timed
66        }
67    }};
68    ($name: expr, $timed: expr $(,)?) => {{
69        use cli_log::{
70            Level::*,
71            *,
72        };
73        if log_enabled!(Debug) {
74            let start = std::time::Instant::now();
75            match $timed {
76                value => {
77                    log!(Debug, "{} took {:?}", $name, start.elapsed());
78                    value
79                }
80            }
81        } else {
82            $timed
83        }
84    }};
85    ($level: ident, $name: expr, $timed: expr $(,)?) => {{
86        use cli_log::{
87            Level::*,
88            *,
89        };
90        if log_enabled!($level) {
91            let start = std::time::Instant::now();
92            match $timed {
93                value => {
94                    log!($level, "{} took {:?}", $name, start.elapsed());
95                    value
96                }
97            }
98        } else {
99            $timed
100        }
101    }};
102    ($cat: expr, $name :expr,  $timed: expr $(,)?) => {{
103        use cli_log::{
104            Level::*,
105            *,
106        };
107        if log_enabled!(Debug) {
108            let start = std::time::Instant::now();
109            match $timed {
110                value => {
111                    log!(Debug, "{} on {:?} took {:?}", $cat, $name, start.elapsed());
112                    value
113                }
114            }
115        } else {
116            $timed
117        }
118    }};
119    ($level: ident, $cat: expr, $name :expr,  $timed: expr $(,)?) => {{
120        use cli_log::{
121            Level::*,
122            *,
123        };
124        if log_enabled!($level) {
125            let start = std::time::Instant::now();
126            match $timed {
127                value => {
128                    log!($level, "{} on {:?} took {:?}", $cat, $name, start.elapsed());
129                    value
130                }
131            }
132        } else {
133            $timed
134        }
135    }};
136}