rogu/
lib.rs

1//!Logging library, plain and simple.
2//!
3//!Simple logger.
4//!
5//!Minimal customization, builtin loggers:
6//!
7//!- Web - Uses console API;
8//!- Android Log;
9//!- C stdio - writes to stdout/stderr;
10//!
11//!## Features
12//!
13//!Note: all features must be used in binary code, not in library
14//!
15//!#### Loggers
16//!
17//!- `ufmt` - Enables [ufmt](https://github.com/japaric/ufmt) traits instead of core's `fmt`
18//!- `std` - Enables `std` usage, adding ability to use timestamps (not used in Web and Android)
19//!- `log` - Enables `log` usage, adding `log` logs to the output.
20//!
21//!#### Compile time macros
22//!
23//!- `level_error_off` - Disables `error!` in debug mode;
24//!- `level_warn_off` - Disables `warn!` in debug mode;
25//!- `level_info_off` - Disables `info!` in debug mode;
26//!- `level_debug_off` - Disables `debug!` in debug mode;
27//!- `level_trace_off` - Disables `trace!` in debug mode;
28//!- `level_all_off`- Disables all macros in debug mode;
29//!
30//!- `release_level_error_off` - Disables `error!` in release mode;
31//!- `release_level_warn_off` - Disables `warn!` in release mode;
32//!- `release_level_info_off` - Disables `info!` in release mode;
33//!- `release_level_debug_off` - Disables `debug!` in release mode;
34//!- `release_level_trace_off` - Disables `trace!` in release mode;
35//!- `release_level_all_off`- Disables all macros in release mode;
36
37#![warn(missing_docs)]
38#![no_std]
39
40#[cfg(feature = "log")]
41mod rust_log;
42#[cfg(all(feature = "std", not(any(all(target_arch = "wasm32", target_os = "unknown"), target_os = "android"))))]
43mod time;
44mod data;
45mod out;
46mod rt;
47#[doc(hidden)]
48pub use out::Out;
49#[cfg(feature = "ufmt")]
50mod ufmt;
51#[cfg(not(feature = "ufmt"))]
52mod cor;
53
54#[cfg(feature = "ufmt")]
55use crate::ufmt::derive::uDebug as Debug;
56
57use core::sync::atomic::{AtomicU8, Ordering};
58
59static LEVEL: AtomicU8 = AtomicU8::new(0);
60
61///Logging levels
62#[repr(u8)]
63#[derive(Copy, Eq, Debug)]
64pub enum Level {
65    #[doc(hidden)]
66    NONE = 0,
67    /// Designates very serious errors.
68    ERROR = 1,
69    /// Designates hazardous situations.
70    WARN,
71    /// Designates useful information.
72    INFO,
73    /// Designates lower priority information.
74    DEBUG,
75    /// Designates very low priority, often extremely verbose, information.
76    TRACE,
77}
78
79impl Clone for Level {
80    #[inline]
81    fn clone(&self) -> Self {
82        *self
83    }
84}
85
86impl PartialEq for Level {
87    #[inline]
88    fn eq(&self, other: &Self) -> bool {
89        *self as u8 == *other as u8
90    }
91}
92
93///Sets logging level
94pub fn set_level(level: Level) {
95    rt::init();
96    LEVEL.store(level as u8, Ordering::Relaxed);
97
98    #[cfg(feature = "log")]
99    {
100        rust_log::init(level.into());
101    }
102}
103
104#[inline]
105///Checks if logging is enabled
106pub fn is_enabled(level: Level) -> bool {
107    LEVEL.load(Ordering::Relaxed) >= level as u8
108}