workflow_log/
levels.rs

1///
2/// This enum is a replica of the Level and LevelFilter
3/// enums from the log crate : https://crates.io/crates/log
4///
5/// The original references can be found here:
6/// - https://docs.rs/log/latest/log/enum.Level.html
7/// - https://docs.rs/log/latest/log/enum.LevelFilter.html
8///
9/// This is embedded directly into this crate to to allow
10/// usage of log levels while retaining the ability to embed
11/// the log crate itself as an optional feature. This is done
12/// to accomodate reduced bytecode requirements of build
13/// targets such as BPF.
14///
15use std::cmp;
16
17#[repr(usize)]
18#[derive(Copy, Eq, Debug)]
19pub enum Level {
20    Error = 1,
21    Warn,
22    Info,
23    Debug,
24    Trace,
25}
26
27impl Clone for Level {
28    #[inline]
29    fn clone(&self) -> Level {
30        *self
31    }
32}
33
34impl PartialEq for Level {
35    #[inline]
36    fn eq(&self, other: &Level) -> bool {
37        *self as usize == *other as usize
38    }
39}
40
41impl PartialEq<LevelFilter> for Level {
42    #[inline]
43    fn eq(&self, other: &LevelFilter) -> bool {
44        *self as usize == *other as usize
45    }
46}
47
48impl PartialOrd for Level {
49    #[inline]
50    fn partial_cmp(&self, other: &Level) -> Option<cmp::Ordering> {
51        Some(self.cmp(other))
52    }
53
54    #[inline]
55    fn lt(&self, other: &Level) -> bool {
56        (*self as usize) < *other as usize
57    }
58
59    #[inline]
60    fn le(&self, other: &Level) -> bool {
61        *self as usize <= *other as usize
62    }
63
64    #[inline]
65    fn gt(&self, other: &Level) -> bool {
66        *self as usize > *other as usize
67    }
68
69    #[inline]
70    fn ge(&self, other: &Level) -> bool {
71        *self as usize >= *other as usize
72    }
73}
74
75impl PartialOrd<LevelFilter> for Level {
76    #[inline]
77    fn partial_cmp(&self, other: &LevelFilter) -> Option<cmp::Ordering> {
78        Some((*self as usize).cmp(&(*other as usize)))
79    }
80
81    #[inline]
82    fn lt(&self, other: &LevelFilter) -> bool {
83        (*self as usize) < *other as usize
84    }
85
86    #[inline]
87    fn le(&self, other: &LevelFilter) -> bool {
88        *self as usize <= *other as usize
89    }
90
91    #[inline]
92    fn gt(&self, other: &LevelFilter) -> bool {
93        *self as usize > *other as usize
94    }
95
96    #[inline]
97    fn ge(&self, other: &LevelFilter) -> bool {
98        *self as usize >= *other as usize
99    }
100}
101
102impl Ord for Level {
103    #[inline]
104    fn cmp(&self, other: &Level) -> cmp::Ordering {
105        (*self as usize).cmp(&(*other as usize))
106    }
107}
108
109#[repr(usize)]
110#[derive(Copy, Eq, Debug)]
111pub enum LevelFilter {
112    /// A level lower than all log levels.
113    Off,
114    /// Corresponds to the `Error` log level.
115    Error,
116    /// Corresponds to the `Warn` log level.
117    Warn,
118    /// Corresponds to the `Info` log level.
119    Info,
120    /// Corresponds to the `Debug` log level.
121    Debug,
122    /// Corresponds to the `Trace` log level.
123    Trace,
124}
125
126// Deriving generates terrible impls of these traits
127
128impl Clone for LevelFilter {
129    #[inline]
130    fn clone(&self) -> LevelFilter {
131        *self
132    }
133}
134
135impl PartialEq for LevelFilter {
136    #[inline]
137    fn eq(&self, other: &LevelFilter) -> bool {
138        *self as usize == *other as usize
139    }
140}
141
142impl PartialEq<Level> for LevelFilter {
143    #[inline]
144    fn eq(&self, other: &Level) -> bool {
145        other.eq(self)
146    }
147}
148
149impl PartialOrd for LevelFilter {
150    #[inline]
151    fn partial_cmp(&self, other: &LevelFilter) -> Option<cmp::Ordering> {
152        Some(self.cmp(other))
153    }
154
155    #[inline]
156    fn lt(&self, other: &LevelFilter) -> bool {
157        (*self as usize) < *other as usize
158    }
159
160    #[inline]
161    fn le(&self, other: &LevelFilter) -> bool {
162        *self as usize <= *other as usize
163    }
164
165    #[inline]
166    fn gt(&self, other: &LevelFilter) -> bool {
167        *self as usize > *other as usize
168    }
169
170    #[inline]
171    fn ge(&self, other: &LevelFilter) -> bool {
172        *self as usize >= *other as usize
173    }
174}
175
176impl PartialOrd<Level> for LevelFilter {
177    #[inline]
178    fn partial_cmp(&self, other: &Level) -> Option<cmp::Ordering> {
179        Some((*self as usize).cmp(&(*other as usize)))
180    }
181
182    #[inline]
183    fn lt(&self, other: &Level) -> bool {
184        (*self as usize) < *other as usize
185    }
186
187    #[inline]
188    fn le(&self, other: &Level) -> bool {
189        *self as usize <= *other as usize
190    }
191
192    #[inline]
193    fn gt(&self, other: &Level) -> bool {
194        *self as usize > *other as usize
195    }
196
197    #[inline]
198    fn ge(&self, other: &Level) -> bool {
199        *self as usize >= *other as usize
200    }
201}
202
203impl Ord for LevelFilter {
204    #[inline]
205    fn cmp(&self, other: &LevelFilter) -> cmp::Ordering {
206        (*self as usize).cmp(&(*other as usize))
207    }
208}