use anchor_lang::prelude::*;
use core::fmt;
#[repr(u8)]
#[derive(AnchorSerialize, AnchorDeserialize, Clone, Copy, PartialEq, Eq, Debug)]
pub enum LogLevel {
Trace = 0,
Debug = 1,
Info = 2,
Warn = 3,
Error = 4,
}
impl LogLevel {
pub fn as_str(&self) -> &'static str {
match self {
LogLevel::Trace => "trace",
LogLevel::Debug => "debug",
LogLevel::Info => "info",
LogLevel::Warn => "warn",
LogLevel::Error => "error",
}
}
}
impl fmt::Display for LogLevel {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(self.as_str())
}
}
impl From<LogLevel> for u8 {
fn from(level: LogLevel) -> u8 {
level as u8
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn display_matches_as_str() {
let cases = [
(LogLevel::Trace, "trace"),
(LogLevel::Debug, "debug"),
(LogLevel::Info, "info"),
(LogLevel::Warn, "warn"),
(LogLevel::Error, "error"),
];
for (level, expected) in cases {
assert_eq!(level.to_string(), expected);
assert_eq!(level.as_str(), expected);
}
}
#[test]
fn discriminant_stability() {
assert_eq!(u8::from(LogLevel::Trace), 0);
assert_eq!(u8::from(LogLevel::Debug), 1);
assert_eq!(u8::from(LogLevel::Info), 2);
assert_eq!(u8::from(LogLevel::Warn), 3);
assert_eq!(u8::from(LogLevel::Error), 4);
}
}