scsys_config/types/
log_level.rs1#[derive(
6 Clone,
7 Copy,
8 Debug,
9 Default,
10 Eq,
11 Hash,
12 Ord,
13 PartialEq,
14 PartialOrd,
15 strum::AsRefStr,
16 strum::Display,
17 strum::EnumCount,
18 strum::EnumIs,
19 strum::EnumIter,
20 strum::EnumString,
21 strum::VariantNames,
22)]
23#[cfg_attr(
24 feature = "serde",
25 derive(serde::Deserialize, serde::Serialize),
26 serde(rename_all = "lowercase")
27)]
28#[strum(serialize_all = "lowercase")]
29pub enum LogLevel {
30 Debug = 1,
32 Error = 4,
34 #[default]
36 Info = 2,
37 Trace = 0,
40 Warn = 3,
42 Off = -1,
44}
45
46impl LogLevel {
47 pub fn from_isize(level: isize) -> Self {
48 match level % 5 {
49 0 => Self::Trace,
50 1 => Self::Debug,
51 2 => Self::Info,
52 3 => Self::Warn,
53 4 => Self::Error,
54 lvl if lvl < 0 => Self::Off,
55 _ => unreachable!(
56 "modular arithmetic error; accepted values are between, but not including, the range of: (+/- 5)"
57 ),
58 }
59 }
60 pub fn is_enabled(&self) -> bool {
62 !matches!(self, Self::Off)
63 }
64
65 pub fn as_log_string<T>(&self, name: T) -> String
66 where
67 T: core::fmt::Display,
68 {
69 format!("{name}={lvl}", lvl = self.as_ref())
70 }
71}
72
73unsafe impl Send for LogLevel {}
74
75unsafe impl Sync for LogLevel {}
76
77impl From<isize> for LogLevel {
78 fn from(level: isize) -> Self {
79 Self::from_isize(level)
80 }
81}
82
83impl From<LogLevel> for isize {
84 fn from(level: LogLevel) -> Self {
85 level as isize
86 }
87}
88
89#[cfg(feature = "config")]
90impl From<LogLevel> for config::Value {
91 fn from(level: LogLevel) -> Self {
92 level.to_string().into()
93 }
94}
95
96#[cfg(feature = "tracing")]
97mod impl_tracing {
98 use super::LogLevel;
99 use tracing::Level;
100
101 impl LogLevel {
102 pub fn from_tracing(level: Level) -> Self {
103 match level {
104 Level::DEBUG => Self::Debug,
105 Level::ERROR => Self::Error,
106 Level::INFO => Self::Info,
107 Level::TRACE => Self::Trace,
108 Level::WARN => Self::Warn,
109 }
110 }
111 pub fn as_tracing_level(&self) -> Option<Level> {
113 match self {
114 Self::Debug => Some(Level::DEBUG),
115 Self::Error => Some(Level::ERROR),
116 Self::Info => Some(Level::INFO),
117 Self::Trace => Some(Level::TRACE),
118 Self::Warn => Some(Level::WARN),
119 Self::Off => None,
120 }
121 }
122 }
123
124 impl From<Level> for LogLevel {
125 fn from(level: Level) -> Self {
126 Self::from_tracing(level)
127 }
128 }
129
130 impl From<LogLevel> for Level {
131 fn from(level: LogLevel) -> Self {
132 level.as_tracing_level().unwrap_or(Level::INFO)
133 }
134 }
135}