nolog/core/
level_inner.rs

1// Copyright (c) 2022-present Vadim Glinka
2//
3// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
4// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
5// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
6// option.
7
8#[macro_export] macro_rules!
9level_helper { 
10    // On:  [#], [x], [v], [+], [true], [bool_var], [on]
11    // Off: [ ], [_], [-], [false], [bool_var], [off]
12    //
13    //
14    //        +----------+                                      +------------------------+    
15    //        | one line |                                      | lines separated by `;` |
16    //        +----------+                                      +------------------------+  
17    //          v      v                                                v        v
18    // +----------+  +----------------------+     +------------------------+  +------------------------------------+ 
19    // | one line |  | one line (key-value) |     | lines separated by `;` |  | lines (key-value) separated by `;` |
20    // +----------+  +----------------------+     +------------------------+  +------------------------------------+ 
21    //     |  |  |           |   |    |                       |  |    |                      |  |    |
22    //     v  |  v           v   |    v                       v  |    v                      v  |    v
23    // +----+ | +-----+   +----+ | +-----+                +----+ | +-----+               +----+ | +-----+
24    // | On | | | Off |   | On | | | Off |                | On | | | Off |               | On | | | Off |
25    // +----+ | +-----+   +----+ | +-----+                +----+ | +-----+               +----+ | +-----+
26    //        v                  v                               v                              V
27    // +------------+      +------------+                  +------------+                 +------------+
28    // | var (bool) |      | var (bool) |                  | var (bool) |                 | var (bool) |
29    // +------------+      +------------+                  +------------+                 +------------+
30    //
31    //
32    //
33    //
34    // Off, one line
35    ( [$level:tt] [ ];   $(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($msg:expr),* ) => {};
36    ( [$level:tt] [_];   $(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($msg:expr),* ) => {};
37    ( [$level:tt] [-];   $(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($msg:expr),* ) => {};
38    ( [$level:tt] [off]; $(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($msg:expr),* ) => {};
39    // On, one line
40    ( [$level:tt] [#];  $(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($msg:expr),* ) => {
41        level_helper!([$level] $(->[$indent $(,$linebefore $(,$lineafter)?)?])? $($msg),*);
42    };
43    ( [$level:tt] [x];  $(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($msg:expr),* ) => {
44        level_helper!([$level] $(->[$indent $(,$linebefore $(,$lineafter)?)?])? $($msg),*);
45    };
46    ( [$level:tt] [v];  $(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($msg:expr),* ) => {
47        level_helper!([$level] $(->[$indent $(,$linebefore $(,$lineafter)?)?])? $($msg),*);
48    };
49    ( [$level:tt] [+];  $(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($msg:expr),* ) => {
50        level_helper!([$level] $(->[$indent $(,$linebefore $(,$lineafter)?)?])? $($msg),*);
51    };
52    ( [$level:tt] [on]; $(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($msg:expr),* ) => {
53        level_helper!([$level] $(->[$indent $(,$linebefore $(,$lineafter)?)?])? $($msg),*);
54    };
55    //
56    // Off, one line (key-value)
57    ( [$level:tt] [ ];   $(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($key:expr),* => $(->[$indent_v:tt])? $($value:expr),* ) => {};
58    ( [$level:tt] [_];   $(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($key:expr),* => $(->[$indent_v:tt])? $($value:expr),* ) => {};
59    ( [$level:tt] [-];   $(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($key:expr),* => $(->[$indent_v:tt])? $($value:expr),* ) => {};
60    ( [$level:tt] [off]; $(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($key:expr),* => $(->[$indent_v:tt])? $($value:expr),* ) => {};
61    // On, one line (key-value)
62    ( [$level:tt] [#];  $(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($key:expr),* => $(->[$indent_v:tt])? $($value:expr),* ) => { 
63        level_helper!([$level] $(->[$indent $(,$linebefore $(,$lineafter)?)?])? $($key),* => $(->[$indent_v])? $($value),*);
64    };
65    ( [$level:tt] [x];  $(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($key:expr),* => $(->[$indent_v:tt])? $($value:expr),* ) => { 
66        level_helper!([$level] $(->[$indent $(,$linebefore $(,$lineafter)?)?])? $($key),* => $(->[$indent_v])? $($value),*);
67    };
68    ( [$level:tt] [v];  $(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($key:expr),* => $(->[$indent_v:tt])? $($value:expr),* ) => { 
69        level_helper!([$level] $(->[$indent $(,$linebefore $(,$lineafter)?)?])? $($key),* => $(->[$indent_v])? $($value),*);
70    };
71    ( [$level:tt] [+];  $(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($key:expr),* => $(->[$indent_v:tt])? $($value:expr),* ) => { 
72        level_helper!([$level] $(->[$indent $(,$linebefore $(,$lineafter)?)?])? $($key),* => $(->[$indent_v])? $($value),*);
73    };
74    ( [$level:tt] [on]; $(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($key:expr),* => $(->[$indent_v:tt])? $($value:expr),* ) => { 
75        level_helper!([$level] $(->[$indent $(,$linebefore $(,$lineafter)?)?])? $($key),* => $(->[$indent_v])? $($value),*);
76    };
77    //
78    //
79    // Off, lines separated by `;`
80    ( [$level:tt] [ ];   $($(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($msg:expr),*;)* ) => {};
81    ( [$level:tt] [_];   $($(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($msg:expr),*;)* ) => {};
82    ( [$level:tt] [-];   $($(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($msg:expr),*;)* ) => {};
83    ( [$level:tt] [off]; $($(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($msg:expr),*;)* ) => {};
84    // On, lines separated by `;`
85    ( [$level:tt] [#];  $($(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($msg:expr),*;)* ) => {
86        $( level_helper!([$level] $(->[$indent $(,$linebefore $(,$lineafter)?)?])? $($msg),*); )*
87    };
88    ( [$level:tt] [x];  $($(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($msg:expr),*;)* ) => {
89        $( level_helper!([$level] $(->[$indent $(,$linebefore $(,$lineafter)?)?])? $($msg),*); )*
90    };
91    ( [$level:tt] [v];  $($(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($msg:expr),*;)* ) => {
92        $( level_helper!([$level] $(->[$indent $(,$linebefore $(,$lineafter)?)?])? $($msg),*); )*
93    };
94    ( [$level:tt] [+];  $($(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($msg:expr),*;)* ) => {
95        $( level_helper!([$level] $(->[$indent $(,$linebefore $(,$lineafter)?)?])? $($msg),*); )*
96    };
97    ( [$level:tt] [on]; $($(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($msg:expr),*;)* ) => {
98        $( level_helper!([$level] $(->[$indent $(,$linebefore $(,$lineafter)?)?])? $($msg),*); )*
99    };
100    //
101    // Off, lines (key-value) separated by `;`
102    ( [$level:tt] [ ];   $($(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($key:expr),* => $(->[$indent_v:tt])? $($value:expr),*;)* ) => {};
103    ( [$level:tt] [_];   $($(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($key:expr),* => $(->[$indent_v:tt])? $($value:expr),*;)* ) => {};
104    ( [$level:tt] [-];   $($(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($key:expr),* => $(->[$indent_v:tt])? $($value:expr),*;)* ) => {};
105    ( [$level:tt] [off]; $($(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($key:expr),* => $(->[$indent_v:tt])? $($value:expr),*;)* ) => {};
106    // On, lines (key-value) separated by `;`
107    ( [$level:tt] [#];  $($(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($key:expr),* => $(->[$indent_v:tt])? $($value:expr),*;)* ) => {
108        $( level_helper!([$level] $(->[$indent $(,$linebefore $(,$lineafter)?)?])? $($key),* => $(->[$indent_v])? $($value),*); )*
109    };
110    ( [$level:tt] [x];  $($(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($key:expr),* => $(->[$indent_v:tt])? $($value:expr),*;)* ) => {
111        $( level_helper!([$level] $(->[$indent $(,$linebefore $(,$lineafter)?)?])? $($key),* => $(->[$indent_v])? $($value),*); )*
112    };
113    ( [$level:tt] [v];  $($(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($key:expr),* => $(->[$indent_v:tt])? $($value:expr),*;)* ) => {
114        $( level_helper!([$level] $(->[$indent $(,$linebefore $(,$lineafter)?)?])? $($key),* => $(->[$indent_v])? $($value),*); )*
115    };
116    ( [$level:tt] [+];  $($(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($key:expr),* => $(->[$indent_v:tt])? $($value:expr),*;)* ) => {
117        $( level_helper!([$level] $(->[$indent $(,$linebefore $(,$lineafter)?)?])? $($key),* => $(->[$indent_v])? $($value),*); )*
118    };
119    ( [$level:tt] [on]; $($(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($key:expr),* => $(->[$indent_v:tt])? $($value:expr),*;)* ) => {
120        $( level_helper!([$level] $(->[$indent $(,$linebefore $(,$lineafter)?)?])? $($key),* => $(->[$indent_v])? $($value),*); )*
121    };
122    //
123    // var (bool), one line
124    ( [$level:tt] [$var:tt]; $(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($msg:expr),* ) => {
125        //  debug!([(is_log_enabled_fn())]; "msg");
126        //          ^                   ^
127        // fn doesn't work without parentheses
128        #[allow(unused_parens)]
129        // `($var)` doesn't help
130        if $var { level_helper!([$level] $(->[$indent $(,$linebefore $(,$lineafter)?)?])? $($msg),*); }
131    };
132    //
133    // var (bool), one line (key-value)
134    ( [$level:tt] [$var:tt]; $(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($key:expr),* => $(->[$indent_v:tt])? $($value:expr),* ) => { 
135        #[allow(unused_parens)]
136        if $var { level_helper!([$level] $(->[$indent $(,$linebefore $(,$lineafter)?)?])? $($key),* => $(->[$indent_v])? $($value),*); }
137    };
138    //
139    // var (bool), lines separated by `;`
140    ( [$level:tt] [$var:tt]; $($(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($msg:expr),*;)* ) => {
141        #[allow(unused_parens)]
142        if $var { $( level_helper!([$level] $(->[$indent $(,$linebefore $(,$lineafter)?)?])? $($msg),*); )* }
143    };
144    //
145    // var (bool), lines (key-value) separated by `;`
146    ( [$level:tt] [$var:tt]; $($(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($key:expr),* => $(->[$indent_v:tt])? $($value:expr),*;)* ) => {
147        #[allow(unused_parens)]
148        if $var { $( level_helper!([$level] $(->[$indent $(,$linebefore $(,$lineafter)?)?])? $($key),* => $(->[$indent_v])? $($value),*); )* }
149    };
150    //
151    //
152    // lines separated by `;` (without on/off)
153    ( [$level:tt] $($(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($msg:expr),*;)* ) => {
154        // `one line` invocation for each line
155        $( level_helper!([$level] $(->[$indent $(,$linebefore $(,$lineafter)?)?])? $($msg),*); )*
156    };
157    // lines (key-value) separated by `;` (without on/off)
158    ( [$level:tt] $($(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($key:expr),* => $(->[$indent_v:tt])? $($value:expr),*;)* ) => {
159        // `one line (key-value)` invocation for each line
160        $( level_helper!([$level] $(->[$indent $(,$linebefore $(,$lineafter)?)?])? $($key),* => $(->[$indent_v])? $($value),*); )*
161    };
162    //
163    //
164    // one line
165    ( [$level:tt] $(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($msg:expr),* ) => {
166        $($(newline!($linebefore);)?)?
167        msg_render!($level, indent!($($indent)?), $($msg),*);
168        $($($(newline!($lineafter);)?)?)?
169    };
170    // one line (key-value)
171    ( [$level:tt] $(->[$indent:tt $(,$linebefore:tt $(,$lineafter:tt)?)?])? $($key:expr),* => $(->[$indent_v:tt])? $($value:expr),* ) => { 
172        $($(newline!($linebefore);)?)?
173        msg_render!($level, indent_kv!($($indent)?), $($key),* => indent!($($indent_v)?), $($value),*);
174        $($($(newline!($lineafter);)?)?)?
175    };
176}
177
178#[macro_export]
179#[cfg(feature = "trace")] macro_rules!
180trace_inner { ( $($a:tt)* ) => { level_helper!([[trace]] $($a)*); } }
181
182#[macro_export]
183#[cfg(feature = "debug")] macro_rules!
184debug_inner { ( $($a:tt)* ) => { level_helper!([[debug]] $($a)*); } }
185
186#[macro_export]
187#[cfg(feature = "info")] macro_rules!
188info_inner { ( $($a:tt)* )  => { level_helper!([[info]] $($a)*); } }
189
190#[macro_export]
191#[cfg(feature = "warn")] macro_rules!
192warn_inner { ( $($a:tt)* )  => { level_helper!([[warn]] $($a)*); } }
193
194#[macro_export]
195#[cfg(feature = "error")] macro_rules!
196error_inner { ( $($a:tt)* ) => { level_helper!([[error]] $($a)*); } }
197
198#[macro_export]
199#[cfg(feature = "crit")] macro_rules!
200crit_inner { ( $($a:tt)* )  => { level_helper!([[crit]] $($a)*); } }
201