1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
//!Logging library, plain and simple.
//!
//!Simple logger.
//!
//!Minimal customization, builtin loggers:
//!
//!- Web - Uses console API;
//!- Android Log;
//!- C stdio - writes to stdout/stderr;
//!
//!## Features
//!
//!Note: all features must be used in binary code, not in library
//!
//!#### Loggers
//!
//!- `ufmt` - Enables [ufmt](https://github.com/japaric/ufmt) traits instead of core's `fmt`
//!- `std` - Enables `std` usage, adding ability to use timestamps (not used in Web and Android)
//!- `log` - Enables `log` usage, adding `log` logs to the output.
//!
//!#### Compile time macros
//!
//!- `level_error_off` - Disables `error!` in debug mode;
//!- `level_warn_off` - Disables `warn!` in debug mode;
//!- `level_info_off` - Disables `info!` in debug mode;
//!- `level_debug_off` - Disables `debug!` in debug mode;
//!- `level_trace_off` - Disables `trace!` in debug mode;
//!- `level_all_off`- Disables all macros in debug mode;
//!
//!- `release_level_error_off` - Disables `error!` in release mode;
//!- `release_level_warn_off` - Disables `warn!` in release mode;
//!- `release_level_info_off` - Disables `info!` in release mode;
//!- `release_level_debug_off` - Disables `debug!` in release mode;
//!- `release_level_trace_off` - Disables `trace!` in release mode;
//!- `release_level_all_off`- Disables all macros in release mode;

#![warn(missing_docs)]
#![no_std]

#[cfg(feature = "log")]
mod rust_log;
#[cfg(all(feature = "std", not(any(all(target_arch = "wasm32", target_os = "unknown"), target_os = "android"))))]
mod time;
mod data;
mod out;
mod rt;
#[doc(hidden)]
pub use out::Out;
#[cfg(feature = "ufmt")]
mod ufmt;
#[cfg(not(feature = "ufmt"))]
mod cor;

#[cfg(feature = "ufmt")]
use crate::ufmt::derive::uDebug as Debug;

use core::sync::atomic::{AtomicU8, Ordering};

static LEVEL: AtomicU8 = AtomicU8::new(0);

///Logging levels
#[repr(u8)]
#[derive(Copy, Eq, Debug)]
pub enum Level {
    #[doc(hidden)]
    NONE = 0,
    /// Designates very serious errors.
    ERROR = 1,
    /// Designates hazardous situations.
    WARN,
    /// Designates useful information.
    INFO,
    /// Designates lower priority information.
    DEBUG,
    /// Designates very low priority, often extremely verbose, information.
    TRACE,
}

impl Clone for Level {
    #[inline]
    fn clone(&self) -> Self {
        *self
    }
}

impl PartialEq for Level {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        *self as u8 == *other as u8
    }
}

///Sets logging level
pub fn set_level(level: Level) {
    rt::init();
    LEVEL.store(level as u8, Ordering::Relaxed);

    #[cfg(feature = "log")]
    {
        rust_log::init(level.into());
    }
}

#[inline]
///Checks if logging is enabled
pub fn is_enabled(level: Level) -> bool {
    LEVEL.load(Ordering::Relaxed) >= level as u8
}