Skip to main content

v_log/
macros.rs

1// Copyright 2026 redweasel. See the COPYRIGHT
2// file at the top-level directory of this distribution and at
3// http://rust-lang.org/COPYRIGHT.
4//
5// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8// option. This file may not be copied, modified, or distributed
9// except according to those terms.
10
11//! Import this as `use v_log::macros::*` to import only the macros.
12
13pub use crate::{arrow, clear, label, message, point, polyline, vlog_enabled};
14
15/// Clear a surface of the vlogger, including the messages that have been sent to it.
16///
17/// # Examples
18///
19/// ```
20/// use v_log::clear;
21///
22/// clear!("main_surface");
23/// ```
24#[macro_export]
25macro_rules! clear {
26    // clear!(vlogger: my_vlogger, target: "my_target", "my_surface")
27    (vlogger: $vlogger:expr, $surface:expr) => {
28        $crate::__private_api::clear(
29            $crate::__vlog_vlogger!($vlogger),
30            $crate::__private_api::module_path!(),
31            $surface,
32        )
33    };
34
35    // clear!(vlogger: my_vlogger, "my_surface")
36    (vlogger: $vlogger:expr, target: $target:expr, $surface:expr) => {
37        $crate::__private_api::clear($crate::__vlog_vlogger!($vlogger), $target, $surface)
38    };
39
40    // clear!(target: "my_target", "my_surface")
41    (target: $target:expr, $surface:expr) => {
42        $crate::__private_api::clear(
43            $crate::__vlog_vlogger!(__vlog_global_vlogger),
44            $target,
45            $surface,
46        )
47    };
48
49    // clear!("my_surface")
50    ($surface:expr) => {
51        $crate::__private_api::clear(
52            $crate::__vlog_vlogger!(__vlog_global_vlogger),
53            $crate::__private_api::module_path!(),
54            $surface,
55        )
56    };
57}
58
59/// Logs a message to the vlogger.
60///
61/// # Examples
62///
63/// ```
64/// use v_log::message;
65///
66/// let pos = [3.234, -1.223];
67///
68/// message!("main_surface", color: Healthy, "Correct position");
69/// message!("main_surface", "Position is: x: {}, y: {}", pos[0], pos[1]);
70/// ```
71#[macro_export]
72macro_rules! message {
73    // message!(vlogger: my_vlogger, target: "my_target", "my_surface", color: Base, "a {} event", "log")
74    (vlogger: $vlogger:expr, target: $target:expr, $surface:expr, $($arg:tt)+) => ({
75        $crate::__message!(
76            $crate::__vlog_vlogger!($vlogger),
77            $surface,
78            &$crate::__abs_module_path!($target),
79            $($arg)+
80        )
81    });
82
83    // message!(vlogger: my_vlogger, "my_surface", color: Base, "a {} event", "log")
84    (vlogger: $vlogger:expr, $surface:expr, $($arg:tt)+) => ({
85        $crate::__message!(
86            $crate::__vlog_vlogger!($vlogger),
87            $surface,
88            &$crate::__abs_module_path!(),
89            $($arg)+
90        )
91    });
92
93    // message!(target: "my_target", "my_surface", color: Base, "a {} event", "log")
94    (target: $target:expr, $surface:expr, $($arg:tt)+) => ({
95        $crate::__message!(
96            $crate::__vlog_vlogger!(__vlog_global_vlogger),
97            $surface,
98            &$crate::__abs_module_path!($target),
99            $($arg)+
100        )
101    });
102
103    // message!("my_surface", color: Base, "a {} event", "log")
104    ($surface:expr, $($arg:tt)+) => (
105        $crate::__message!(
106            $crate::__vlog_vlogger!(__vlog_global_vlogger),
107            $surface,
108            &$crate::__abs_module_path!(),
109            $($arg)+
110        )
111    )
112}
113
114/// Sends a point to the vlogger.
115///
116/// # Examples
117///
118/// ```
119/// use v_log::point;
120///
121/// let pos1 = [3.234, -1.223];
122/// let pos2 = [2.713, 0.577];
123///
124/// point!("main_surface", pos1, 5.0, Base, "o", "Position is: x: {}, y: {}", pos1[0], pos1[1]);
125/// point!("main_surface", pos2, 5.0, Base);
126/// ```
127#[macro_export]
128macro_rules! point {
129    // point!(vlogger: my_vlogger, target: "my_target", "my_surface", [1.0, 2.0], 5.0, Base, "o", "a {} event", "log")
130    (vlogger: $vlogger:expr, target: $target:expr, $surface:expr, $($arg:tt)+) => ({
131        $crate::__point!(
132            $crate::__vlog_vlogger!($vlogger),
133            $surface,
134            &$crate::__abs_module_path!($target),
135            $($arg)+
136        )
137    });
138
139    // point!(vlogger: my_vlogger, "my_surface", [1.0, 2.0], 5.0, Base, "o", "a {} event", "log")
140    (vlogger: $vlogger:expr, $surface:expr, $($arg:tt)+) => ({
141        $crate::__point!(
142            $crate::__vlog_vlogger!($vlogger),
143            $surface,
144            &$crate::__abs_module_path!(),
145            $($arg)+
146        )
147    });
148
149    // point!(target: "my_target", "my_surface", [1.0, 2.0], 5.0, Base, "o", "a {} event", "log")
150    (target: $target:expr, $surface:expr, $($arg:tt)+) => ({
151        $crate::__point!(
152            $crate::__vlog_vlogger!(__vlog_global_vlogger),
153            $surface,
154            &$crate::__abs_module_path!($target),
155            $($arg)+
156        )
157    });
158
159    // point!("my_surface", [1.0, 2.0], 5.0, Base, "o", "a {} event", "log")
160    ($surface:expr, $($arg:tt)+) => (
161        $crate::__point!(
162            $crate::__vlog_vlogger!(__vlog_global_vlogger),
163            $surface,
164            &$crate::__abs_module_path!(),
165            $($arg)+
166        )
167    )
168}
169
170/// Sends a label/text annotation to the vlogger.
171///
172/// # Examples
173///
174/// ```
175/// use v_log::label;
176///
177/// let pos = [3.234, -1.223];
178///
179/// label!("main_surface", pos, (12.0, Base, "<"), "Position is: x: {}, y: {}", pos[0], pos[1]);
180/// label!("main_surface", pos, "Flexible position"); // with size 12.0, flexible alignment and "Base" color
181/// ```
182#[macro_export]
183macro_rules! label {
184    // label!(vlogger: my_vlogger, target: "my_target", "my_surface", [1.0, 2.0], (12.0, Base, "<"), "a {} label", "log")
185    (vlogger: $vlogger:expr, target: $target:expr, $surface:expr, $($arg:tt)+) => ({
186        $crate::__label!(
187            $crate::__vlog_vlogger!($vlogger),
188            $surface,
189            &$crate::__abs_module_path!($target),
190            $($arg)+
191        )
192    });
193
194    // label!(vlogger: my_vlogger, "my_surface", [1.0, 2.0], (12.0, Base, "<"), "a {} label", "log")
195    (vlogger: $vlogger:expr, $surface:expr, $($arg:tt)+) => ({
196        $crate::__label!(
197            $crate::__vlog_vlogger!($vlogger),
198            $surface,
199            &$crate::__abs_module_path!(),
200            $($arg)+
201        )
202    });
203
204    // label!(target: "my_target", "my_surface", [1.0, 2.0], (12.0, Base, "<"), "a {} label", "log")
205    (target: $target:expr, $surface:expr, $($arg:tt)+) => ({
206        $crate::__label!(
207            $crate::__vlog_vlogger!(__vlog_global_vlogger),
208            $surface,
209            &$crate::__abs_module_path!($target),
210            $($arg)+
211        )
212    });
213
214    // label!("my_surface", [1.0, 2.0], (12.0, Base, "<"), "a {} label", "log")
215    ($surface:expr, $($arg:tt)+) => (
216        $crate::__label!(
217            $crate::__vlog_vlogger!(__vlog_global_vlogger),
218            $surface,
219            &$crate::__abs_module_path!(),
220            $($arg)+
221        )
222    )
223}
224
225/// Sends an open or closed polyline to the vlogger.
226///
227/// # Examples
228///
229/// ```
230/// use v_log::polyline;
231///
232/// // Points must be of the same type for arrays to work,
233/// // but are only required to implement IntoIterator.
234/// // They can be arbitrary dimension, but only the first 3 are used.
235/// let pos1 = [3.234, -1.223];
236/// let pos2 = [2.713, 0.577];
237/// let pos3 = [6.283, 0.692];
238///
239/// // Draw a single line with thickness 5.0 and color `Base` from pos1 to pos2.
240/// // The label may get displayed, but the size, position and and format is up
241/// // to the vlogger implementation. E.g. it may only be displayed as a tooltip.
242/// polyline!("main_surface", (pos1, pos2), 5.0, Base, "--", "Position is: x: {}, y: {}", pos1[0], pos1[1]);
243/// polyline!("main_surface", (pos1, pos2), 5.0, Base, "->");
244/// polyline!("main_surface", (pos1, pos2), 5.0, Base);
245/// // Draw two connected lines (polyline). These can not be labelled in
246/// // the macro, as a label on polylines is hard to control in implementations.
247/// // If you need a label, consider drawing the first segment with a label.
248/// polyline!("main_surface", [pos1, pos2, pos3], 5.0, Base, "--");
249/// polyline!("main_surface", [pos1, pos2, pos3], 5.0, Base);
250/// // Draw a triangle (polygon). These can be labelled and the label is placed
251/// // in the centeroid of them. Note, this may not be inside of the polygon.
252/// // The textsize of the label must be specified before the text.
253/// polyline!("main_surface", closed: [pos1, pos2, pos3], 5.0, Base, "--", 12.0, "Position is: x: {}, y: {}", pos1[0], pos1[1]);
254/// polyline!("main_surface", closed: [pos1, pos2, pos3], 5.0, Base, "_>");
255/// polyline!("main_surface", closed: [pos1, pos2, pos3], 5.0, Base);
256/// ```
257#[macro_export]
258macro_rules! polyline {
259    // polyline!(vlogger: my_vlogger, target: "my_target", "my_surface", ([1.0, 2.0], [1.0, 3.0]), 5.0, Base, "-", "a {} event", "log")
260    (vlogger: $vlogger:expr, target: $target:expr, $surface:expr, $($arg:tt)+) => ({
261        $crate::__line!(
262            $crate::__vlog_vlogger!($vlogger),
263            $surface,
264            &$crate::__abs_module_path!($target),
265            $($arg)+
266        )
267    });
268
269    // polyline!(vlogger: my_vlogger, "my_surface", ([1.0, 2.0], [1.0, 3.0]), 5.0, Base, "-", "a {} event", "log")
270    (vlogger: $vlogger:expr, $surface:expr, $($arg:tt)+) => ({
271        $crate::__line!(
272            $crate::__vlog_vlogger!($vlogger),
273            $surface,
274            &$crate::__abs_module_path!(),
275            $($arg)+
276        )
277    });
278
279    // polyline!(target: "my_target", "my_surface", ([1.0, 2.0], [1.0, 3.0]), 5.0, Base, "-", "a {} event", "log")
280    (target: $target:expr, $surface:expr, $($arg:tt)+) => ({
281        $crate::__line!(
282            $crate::__vlog_vlogger!(__vlog_global_vlogger),
283            $surface,
284            &$crate::__abs_module_path!($target),
285            $($arg)+
286        )
287    });
288
289    // polyline!("my_surface", ([1.0, 2.0], [1.0, 3.0]), 5.0, Base, "-", "a {} event", "log")
290    ($surface:expr, $($arg:tt)+) => (
291        $crate::__line!(
292            $crate::__vlog_vlogger!(__vlog_global_vlogger),
293            $surface,
294            &$crate::__abs_module_path!(),
295            $($arg)+
296        )
297    )
298}
299
300/// Sends an arrow or multiple arrows to the vlogger.
301///
302/// # Examples
303///
304/// ```
305/// use v_log::arrow;
306///
307/// // Points must be of the same type for arrays to work,
308/// // but are only required to implement IntoIterator.
309/// // They can be arbitrary dimension, but only the first 3 are used.
310/// let pos = [3.234, -1.223];
311/// let dir = [0.7071, 0.7071];
312/// let space = [[1.0, 0.0], [0.0, 1.0]];
313///
314/// // Draw an arrow from `pos` pointing in direction `dir` with length 50.0 and thickness 5.0.
315/// // If `dir` has length zero or zero length is specified, a zero length arrow will get sent.
316/// // The label may get displayed, but the size, position and and format is up
317/// // to the vlogger implementation. E.g. it may only be displayed as a tooltip.
318/// # #[cfg(feature = "std")]
319/// arrow!("main_surface", pos, dir, (50.0), 5.0, Base, "Position is: x: {}, y: {}", pos[0], pos[1]);
320/// # #[cfg(feature = "std")]
321/// arrow!("main_surface", pos, dir, (50.0), 5.0, Base);
322/// // Draw an arrow from `pos` pointing in direction `dir` with the length of `dir` and thickness 5.0.
323/// arrow!("main_surface", pos, dir, 5.0, Base, "Position is: x: {}, y: {}", pos[0], pos[1]);
324/// arrow!("main_surface", pos, dir, 5.0, Base);
325/// // Draw multiple arrows from `pos` and scale them with 50.0.
326/// // The colors are X, Y, Z and then "Missing" for all others.
327/// arrow!("main_surface", pos, space, (50.0), 5.0);
328/// ```
329#[macro_export]
330macro_rules! arrow {
331    // arrow!(vlogger: my_vlogger, target: "my_target", "my_surface", [1.0, 2.0], [1.0, 3.0], 5.0, Base, "a {} event", "log")
332    (vlogger: $vlogger:expr, target: $target:expr, $surface:expr, $($arg:tt)+) => ({
333        $crate::__arrow!(
334            $crate::__vlog_vlogger!($vlogger),
335            $surface,
336            &$crate::__abs_module_path!($target),
337            $($arg)+
338        )
339    });
340
341    // arrow!(vlogger: my_vlogger, "my_surface", [1.0, 2.0], [1.0, 3.0], 5.0, Base, "a {} event", "log")
342    (vlogger: $vlogger:expr, $surface:expr, $($arg:tt)+) => ({
343        $crate::__arrow!(
344            $crate::__vlog_vlogger!($vlogger),
345            $surface,
346            &$crate::__abs_module_path!(),
347            $($arg)+
348        )
349    });
350
351    // arrow!(target: "my_target", "my_surface", [1.0, 2.0], [1.0, 3.0], 5.0, Base, "a {} event", "log")
352    (target: $target:expr, $surface:expr, $($arg:tt)+) => ({
353        $crate::__arrow!(
354            $crate::__vlog_vlogger!(__vlog_global_vlogger),
355            $surface,
356            &$crate::__abs_module_path!($target),
357            $($arg)+
358        )
359    });
360
361    // arrow!("my_surface", [1.0, 2.0], [1.0, 3.0], 5.0, Base, "a {} event", "log")
362    ($surface:expr, $($arg:tt)+) => (
363        $crate::__arrow!(
364            $crate::__vlog_vlogger!(__vlog_global_vlogger),
365            $surface,
366            &$crate::__abs_module_path!(),
367            $($arg)+
368        )
369    )
370}
371
372#[doc(hidden)]
373#[macro_export]
374#[clippy::format_args]
375macro_rules! __message {
376    ($vlogger:expr, $surface:expr, $loc:expr, color: $color:tt, $($arg:tt)+) => {
377        $crate::__private_api::vlog_message(
378            $vlogger,
379            $crate::__private_api::format_args!($($arg)+),
380            $crate::__color!($color),
381            $surface,
382            $loc
383        )
384    };
385    ($vlogger:expr, $surface:expr, $loc:expr, $($arg:tt)+) => {
386        $crate::__private_api::vlog_message(
387            $vlogger,
388            $crate::__private_api::format_args!($($arg)+),
389            $crate::__color!(Base),
390            $surface,
391            $loc
392        )
393    };
394}
395
396#[doc(hidden)]
397#[macro_export]
398#[clippy::format_args]
399macro_rules! __point {
400    ($vlogger:expr, $surface:expr, $loc:expr, $pos:expr, $size:expr, $color:tt, $style:tt, $($arg:tt)+) => {
401        $crate::__private_api::vlog_point(
402            $vlogger,
403            $crate::__private_api::format_args!($($arg)+),
404            $pos,
405            $size,
406            $crate::__color!($color),
407            $crate::__point_style!($style),
408            $surface,
409            $loc
410        )
411    };
412    ($vlogger:expr, $surface:expr, $loc:expr, $pos:expr, $size:expr, $color:tt, $style:tt) => {
413        $crate::__private_api::vlog_point(
414            $vlogger,
415            $crate::__private_api::format_args!(""),
416            $pos,
417            $size,
418            $crate::__color!($color),
419            $crate::__point_style!($style),
420            $surface,
421            $loc
422        )
423    };
424    ($vlogger:expr, $surface:expr, $loc:expr, $pos:expr, $size:expr, $color:tt) => {
425        $crate::__private_api::vlog_point(
426            $vlogger,
427            $crate::__private_api::format_args!(""),
428            $pos,
429            $size,
430            $crate::__color!($color),
431            $crate::__point_style!("o"),
432            $surface,
433            $loc
434        )
435    };
436}
437
438#[doc(hidden)]
439#[macro_export]
440#[clippy::format_args]
441macro_rules! __label {
442    ($vlogger:expr, $surface:expr, $loc:expr, $pos:expr, ($size:expr, $color:tt, $align:tt), $($arg:tt)+) => {
443        $crate::__private_api::vlog_label(
444            $vlogger,
445            $crate::__private_api::format_args!($($arg)+),
446            $pos,
447            $size,
448            $crate::__color!($color),
449            $crate::__alignment!($align),
450            $surface,
451            $loc
452        )
453    };
454    ($vlogger:expr, $surface:expr, $loc:expr, $pos:expr, $($arg:tt)+) => {
455        $crate::__private_api::vlog_label(
456            $vlogger,
457            $crate::__private_api::format_args!($($arg)+),
458            $pos,
459            12.0, // default size of 12 pixels
460            $crate::__color!(Base),
461            $crate::__alignment!("x"),
462            $surface,
463            $loc
464        )
465    };
466}
467
468#[doc(hidden)]
469#[macro_export]
470#[clippy::format_args]
471macro_rules! __line {
472    ($vlogger:expr, $surface:expr, $loc:expr, ($pos1:expr, $pos2:expr), $size:expr, $color:tt, $style:tt, $($arg:tt)+) => {
473        $crate::__private_api::vlog_line(
474            $vlogger,
475            $crate::__private_api::format_args!($($arg)+),
476            $pos1,
477            $pos2,
478            $size,
479            $crate::__color!($color),
480            $crate::__line_style!($style),
481            $surface,
482            $loc
483        )
484    };
485    ($vlogger:expr, $surface:expr, $loc:expr, ($pos1:expr, $pos2:expr), $size:expr, $color:tt, $style:tt) => {
486        $crate::__line!($vlogger, $surface, $loc, ($pos1, $pos2), $size, $color, $style, "");
487    };
488    ($vlogger:expr, $surface:expr, $loc:expr, ($pos1:expr, $pos2:expr), $size:expr, $color:tt) => {
489        $crate::__line!($vlogger, $surface, $loc, ($pos1, $pos2), $size, $color, "-", "");
490    };
491    ($vlogger:expr, $surface:expr, $loc:expr, closed: $point_list:expr, $size:expr, $color:tt, $style:tt, $textsize:expr, $($arg:tt)+) => {
492        $crate::__private_api::vlog_closed_line(
493            $vlogger,
494            $crate::__private_api::format_args!($($arg)+),
495            $point_list,
496            $size,
497            $textsize,
498            $crate::__color!($color),
499            $crate::__line_style!($style),
500            $surface,
501            $loc
502        );
503    };
504    ($vlogger:expr, $surface:expr, $loc:expr, closed: $point_list:expr, $size:expr, $color:tt, $style:tt) => {
505        $crate::__line!($vlogger, $surface, $loc, closed: $point_list, $size, $color, $style, 0.0, "");
506    };
507    ($vlogger:expr, $surface:expr, $loc:expr, closed: $point_list:expr, $size:expr, $color:tt) => {
508        $crate::__line!($vlogger, $surface, $loc, closed: $point_list, $size, $color, "-", 0.0, "");
509    };
510    ($vlogger:expr, $surface:expr, $loc:expr, $point_list:expr, $size:expr, $color:tt, $style:tt) => {
511        let mut last = None;
512        let col = $crate::__color!($color);
513        let line_style = $crate::__line_style!($style);
514        let mut count = 0;
515        for p in $point_list {
516            if let Some(f) = last {
517                $crate::__private_api::vlog_line(
518                    $vlogger,
519                    $crate::__private_api::format_args!(""),
520                    f,
521                    p,
522                    $size,
523                    col,
524                    line_style,
525                    $surface,
526                    $loc
527                );
528            }
529            last = Some(p);
530            count += 1;
531        }
532        assert!(count >= 2);
533    };
534    ($vlogger:expr, $surface:expr, $loc:expr, $point_list:expr, $size:expr, $color:tt) => {
535        $crate::__line!($vlogger, $surface, $loc, $point_list, $size, $color, "-");
536    };
537}
538
539#[doc(hidden)]
540#[macro_export]
541#[cfg(feature = "std")]
542macro_rules! __std_only {
543    ($($t:tt)*) => {
544        $($t)*
545    };
546}
547#[doc(hidden)]
548#[macro_export]
549#[cfg(not(feature = "std"))]
550macro_rules! __std_only {
551    ($($t:tt)*) => {
552        compile_error!("std required for arrow macro with fixed length")
553    };
554}
555
556#[doc(hidden)]
557#[macro_export]
558#[clippy::format_args]
559macro_rules! __arrow {
560    ($vlogger:expr, $surface:expr, $loc:expr, $pos:expr, $dir:expr, ($len:expr), $size:expr, $color:tt, $($arg:tt)+) => {
561        $crate::__std_only!($crate::__private_api::vlog_arrow(
562            $vlogger,
563            $crate::__private_api::format_args!($($arg)+),
564            $pos,
565            $dir,
566            Some($len),
567            $size,
568            $crate::__color!($color),
569            $surface,
570            $loc
571        ))
572    };
573    ($vlogger:expr, $surface:expr, $loc:expr, $pos:expr, $dir:expr, ($len:expr), $size:expr, $color:tt) => {
574        $crate::__arrow!($vlogger, $surface, $loc, $pos, $dir, ($len), $size, $color, "")
575    };
576    ($vlogger:expr, $surface:expr, $loc:expr, $pos:expr, $dir:expr, $size:expr, $color:tt, $($arg:tt)+) => {
577        $crate::__private_api::vlog_arrow(
578            $vlogger,
579            $crate::__private_api::format_args!($($arg)+),
580            $pos,
581            $dir,
582            None,
583            $size,
584            $crate::__color!($color),
585            $surface,
586            $loc
587        )
588    };
589    ($vlogger:expr, $surface:expr, $loc:expr, $pos:expr, $dirs:expr, ($scale:expr), $size:expr) => {
590        $crate::__private_api::vlog_axis(
591            $vlogger,
592            $pos,
593            $dirs,
594            $scale,
595            $size,
596            $surface,
597            $loc
598        )
599    };
600    ($vlogger:expr, $surface:expr, $loc:expr, $pos:expr, $dir:expr, $size:expr, $color:tt) => {
601        $crate::__arrow!($vlogger, $surface, $loc, $pos, $dir, $size, $color, "")
602    };
603}
604/// Determines if a message vlogged at the specified level in that module will
605/// be vlogged.
606///
607/// This can be used to avoid expensive computation of vlog message arguments if
608/// the message would be ignored anyway.
609///
610/// # Examples
611///
612/// ```
613/// use v_log::{message, vlog_enabled};
614///
615/// # struct Data { x: u32, y: u32 }
616/// # fn expensive_call() -> Data { Data { x: 0, y: 0 } }
617/// # let my_vlogger = v_log::__private_api::GlobalVLogger;
618/// if vlog_enabled!("main_surface") {
619///     let data = expensive_call();
620///     message!("main_surface", color: Info, "expensive debug data: {} {}", data.x, data.y);
621/// }
622///
623/// if vlog_enabled!(target: "Global", "main_surface") {
624///    let data = expensive_call();
625///    message!(target: "Global", "main_surface", "expensive debug data: {} {}", data.x, data.y);
626/// }
627///
628/// if vlog_enabled!(vlogger: my_vlogger, "main_surface") {
629///    let data = expensive_call();
630///    message!(target: "Global", "main_surface", "expensive debug data: {} {}", data.x, data.y);
631/// }
632/// ```
633#[macro_export]
634macro_rules! vlog_enabled {
635    // vlog_enabled!(vlogger: my_vlogger, target: "my_target", "my_surface")
636    (vlogger: $vlogger:expr, target: $target:expr, $surface:expr) => {{
637        $crate::__private_api::enabled($crate::__vlog_vlogger!($vlogger), $surface, $target)
638    }};
639
640    // vlog_enabled!(vlogger: my_vlogger, "my_surface")
641    (vlogger: $vlogger:expr, $surface:expr) => {{
642        $crate::__private_api::enabled(
643            $crate::__vlog_vlogger!($vlogger),
644            $surface,
645            $crate::__private_api::module_path!(),
646        )
647    }};
648
649    // vlog_enabled!(target: "my_target", "my_surface")
650    (target: $target:expr, $surface:expr) => {{
651        $crate::__private_api::enabled(
652            $crate::__vlog_vlogger!(__vlog_global_vlogger),
653            $surface,
654            $target,
655        )
656    }};
657
658    // vlog_enabled!("my_surface")
659    ($surface:expr) => {{
660        $crate::__private_api::enabled(
661            $crate::__vlog_vlogger!(__vlog_global_vlogger),
662            $surface,
663            $crate::__private_api::module_path!(),
664        )
665    }};
666}
667
668// Determine the vlogger to use, and whether to take it by-value or by reference
669
670#[doc(hidden)]
671#[macro_export]
672macro_rules! __vlog_vlogger {
673    (__vlog_global_vlogger) => {{
674        &$crate::__private_api::GlobalVLogger
675    }};
676
677    ($vlogger:expr) => {{
678        &($vlogger)
679    }};
680}
681
682#[doc(hidden)]
683#[macro_export]
684macro_rules! __point_style {
685    ("O") => {
686        $crate::PointStyle::FilledCircle
687    };
688    ("-O") => {
689        $crate::PointStyle::Circle
690    };
691    ("--O") => {
692        $crate::PointStyle::DashedCircle
693    };
694    ("S") => {
695        $crate::PointStyle::FilledSquare
696    };
697    ("-S") => {
698        $crate::PointStyle::Square
699    };
700    ("--S") => {
701        $crate::PointStyle::DashedSquare
702    };
703    ("o") => {
704        $crate::PointStyle::Point
705    };
706    ("-o") => {
707        $crate::PointStyle::PointOutline
708    };
709    ("s") => {
710        $crate::PointStyle::PointSquare
711    };
712    ("-s") => {
713        $crate::PointStyle::PointSquareOutline
714    };
715    ("x") => {
716        $crate::PointStyle::PointCross
717    };
718    ("d") => {
719        $crate::PointStyle::PointDiamond
720    };
721    ("-d") => {
722        $crate::PointStyle::PointDiamondOutline
723    };
724    ($s:literal) => {
725        compile_error!(concat!("unknown point style ", $s))
726    };
727    ($s:ident) => {{
728        use $crate::PointStyle::*;
729        $s
730    }};
731}
732
733#[doc(hidden)]
734#[macro_export]
735macro_rules! __line_style {
736    ("-") => {
737        $crate::LineStyle::Simple
738    };
739    ("--") => {
740        $crate::LineStyle::Dashed
741    };
742    ("->") => {
743        $crate::LineStyle::Arrow
744    };
745    ("_>") => {
746        $crate::LineStyle::InsideHarpoonCCW
747    };
748    ("<_") => {
749        $crate::LineStyle::InsideHarpoonCW
750    };
751    ($s:literal) => {
752        panic!(concat!("unknown line style ", $s))
753    };
754    ($s:expr) => {{
755        use $crate::LineStyle::*;
756        $s
757    }};
758}
759
760#[doc(hidden)]
761#[macro_export]
762macro_rules! __alignment {
763    ("<") => {
764        $crate::TextAlignment::Left
765    };
766    (">") => {
767        $crate::TextAlignment::Right
768    };
769    (".") => {
770        $crate::TextAlignment::Center
771    };
772    ("x") => {
773        $crate::TextAlignment::Flexible
774    };
775    ($a:literal) => {
776        compile_error!(concat!("unknown text alignment ", $a))
777    };
778    ($a:expr) => {{
779        use $crate::TextAlignment::*;
780        $a
781    }};
782}
783
784#[doc(hidden)]
785#[macro_export]
786macro_rules! __color {
787    ($hex:literal) => {
788        $crate::Color::Hex($hex)
789    };
790    ($name:expr) => {{
791        use $crate::Color::*;
792        $name
793    }};
794}