aboutsummaryrefslogtreecommitdiff
path: root/src/logs.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/logs.rs')
-rw-r--r--src/logs.rs47
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);
+ }
+ }
+}