vlog/lib.rs
1#![cfg_attr(feature = "cargo-clippy", deny(clippy))]
2#![deny(missing_debug_implementations, missing_docs, warnings)]
3
4//! # vlog
5//!
6//! Macros to do stdout / stderr logs based on verbosity level.
7//!
8//! Useful for CLI applications. The default verbosity level is 0, and the
9//! supported max verbosity level is 3, which is equivalent to `-vvv` flags seen
10//! in most Linux CLI applications.
11//!
12//! # Example
13//! ```
14//! #[macro_use]
15//! extern crate vlog;
16//!
17//! use vlog::{get_verbosity_level, set_verbosity_level};
18//!
19//! fn main() {
20//! // default verbosity level is 0
21//! assert_eq!(0, get_verbosity_level());
22//!
23//! v0!("v0 stdout prints");
24//! v1!("v1 stdout won't print");
25//! v2!("v2 stdout won't print");
26//! v3!("v3 stdout won't print");
27//!
28//! // set custom verbosity level
29//! set_verbosity_level(1);
30//! assert_eq!(1, get_verbosity_level());
31//!
32//! v0!("{} stdout prints", "v0");
33//! v1!("{} stdout prints", "v1");
34//! v2!("{} stdout won't print", "v2");
35//! v3!("{} stdout won't print", "v3");
36//!
37//! // set custom max verbosity level
38//! set_verbosity_level(3);
39//! assert_eq!(3, get_verbosity_level());
40//!
41//! v0!("{} stdout prints", "v0");
42//! v1!("{} stdout prints", "v1");
43//! v2!("{} stdout prints", "v2");
44//! v3!("{} stdout prints", "v3");
45//!
46//! // stderr macros also available
47//! ve0!("{} stderr prints", "ve0");
48//! ve1!("{} stderr prints", "ve1");
49//! ve2!("{} stderr prints", "ve2");
50//! ve3!("{} stderr prints", "ve3");
51//! }
52//! ```
53
54#[macro_use]
55mod macros;
56
57#[cfg(test)]
58mod tests;
59
60use std::sync::atomic::{AtomicUsize, Ordering};
61
62/// Application verbosity level value.
63static mut VERBOSITY_LEVEL: AtomicUsize = AtomicUsize::new(0);
64
65/// Sets the application verbosity level atomically. This method is thread-safe.
66///
67/// # Arguments
68/// * `verbosity_level` - Verbosity level value. While there is no check on the
69/// upper bound, the expected max level value is 3.
70///
71/// # Example
72/// ```
73/// use vlog::set_verbosity_level;
74///
75/// // min verbosity level
76/// set_verbosity_level(0);
77///
78/// // max verbosity level
79/// set_verbosity_level(3);
80/// ```
81#[inline]
82pub fn set_verbosity_level(verbosity_level: usize) {
83 unsafe { VERBOSITY_LEVEL.store(verbosity_level, Ordering::Relaxed) }
84}
85
86/// Gets the application verbosity level atomically. This method is thread-safe.
87///
88/// # Example
89/// ```
90/// use vlog::{get_verbosity_level, set_verbosity_level};
91///
92/// // default verbosity level
93/// assert_eq!(0, get_verbosity_level());
94///
95/// // custom verbosity level
96/// set_verbosity_level(1);
97/// assert_eq!(1, get_verbosity_level());
98/// ```
99#[inline]
100pub fn get_verbosity_level() -> usize {
101 unsafe { VERBOSITY_LEVEL.load(Ordering::Relaxed) }
102}