// Parse log level from string (useful for config files and CLI args)
///|
pub fn parse_level(s : String) -> Level {
let upper = to_upper(s)
if upper == "TRACE" {
Level::TRACE
} else if upper == "DEBUG" {
Level::DEBUG
} else if upper == "INFO" {
Level::INFO
} else if upper == "WARN" {
Level::WARN
} else if upper == "WARNING" {
Level::WARN
} else if upper == "ERROR" {
Level::ERROR
} else {
Level::INFO
} // default
}
///|
fn to_upper(s : String) -> String {
to_upper_chars(s, 0, "")
}
///|
fn to_upper_chars(s : String, idx : Int, result : String) -> String {
if idx >= s.length() {
result
} else {
let ch = s[idx:idx + 1].to_owned()
let upper_ch = char_to_upper(ch)
to_upper_chars(s, idx + 1, result + upper_ch)
}
}
///|
fn char_to_upper(ch : String) -> String {
if ch == "a" {
"A"
} else if ch == "b" {
"B"
} else if ch == "c" {
"C"
} else if ch == "d" {
"D"
} else if ch == "e" {
"E"
} else if ch == "f" {
"F"
} else if ch == "g" {
"G"
} else if ch == "h" {
"H"
} else if ch == "i" {
"I"
} else if ch == "j" {
"J"
} else if ch == "k" {
"K"
} else if ch == "l" {
"L"
} else if ch == "m" {
"M"
} else if ch == "n" {
"N"
} else if ch == "o" {
"O"
} else if ch == "p" {
"P"
} else if ch == "q" {
"Q"
} else if ch == "r" {
"R"
} else if ch == "s" {
"S"
} else if ch == "t" {
"T"
} else if ch == "u" {
"U"
} else if ch == "v" {
"V"
} else if ch == "w" {
"W"
} else if ch == "x" {
"X"
} else if ch == "y" {
"Y"
} else if ch == "z" {
"Z"
} else {
ch
}
}
// Get all level names
///|
pub fn level_names() -> Array[String] {
["TRACE", "DEBUG", "INFO", "WARN", "ERROR"]
}
// Validate a level string is valid
///|
pub fn is_valid_level(s : String) -> Bool {
let upper = to_upper(s)
upper == "TRACE" ||
upper == "DEBUG" ||
upper == "INFO" ||
upper == "WARN" ||
upper == "WARNING" ||
upper == "ERROR"
}