diff options
Diffstat (limited to 'src/logs.rs')
-rw-r--r-- | src/logs.rs | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/logs.rs b/src/logs.rs new file mode 100644 index 0000000..dc1dfc1 --- /dev/null +++ b/src/logs.rs @@ -0,0 +1,47 @@ +use std::sync::OnceLock; +use std::collections::HashSet; + +#[derive(Debug, PartialEq, Hash, Eq)] +pub enum LogLevel { + Infos, + Debug, + OpcodeDump, + HaltCycles, + Error, +} + +static LOG_LEVEL: OnceLock<HashSet<LogLevel>> = OnceLock::new(); + +pub fn set_log_level(verbosity: String) { + let mut set: HashSet<LogLevel> = HashSet::new(); + for level in verbosity.split(",") { + match level { + "infos" => { set.insert(LogLevel::Infos); }, + "debug" => { set.insert(LogLevel::Debug); }, + "opcode_dump" => { set.insert(LogLevel::OpcodeDump); }, + "halt_cycles" => { set.insert(LogLevel::HaltCycles); }, + "errors" => { set.insert(LogLevel::Error); }, + "none" => {}, + _ => panic!("Unknown log level \"{}\"", level), + } + } + if let Err(value) = LOG_LEVEL.set(set) { + panic!("Log level is already set with value {:?}", value); + } +} + +pub fn log(level: LogLevel, s: String) { + if let Some(set) = LOG_LEVEL.get() { + if set.contains(&level) { + println!("[{:?}] {}", level, s); + } + } +} + +pub fn elog(level: LogLevel, s: String) { + if let Some(set) = LOG_LEVEL.get() { + if set.contains(&level) { + eprintln!("[{:?}] {}", level, s); + } + } +} |