تمرين إعادة البناء
Log Level Counter
أعد كتابة عداد سجلات يصنف الأسطر حسب مستوى الرسالة.
rust
~16 دقيقة
متوسط
أعد بناء الكود
Rebuild
هذا هو الكود. اكتبه بنفسك.
الكود المرجعي
use std::collections::BTreeMap;
use std::env;
use std::fs;
use std::io::{self, Read};
fn main() -> io::Result<()> {
let text = match env::args().nth(1) {
Some(path) => fs::read_to_string(path)?,
None => {
let mut input = String::new();
io::stdin().read_to_string(&mut input)?;
input
}
};
let mut counts = BTreeMap::from([
("DEBUG", 0usize),
("INFO", 0usize),
("WARN", 0usize),
("ERROR", 0usize),
]);
for line in text.lines() {
if let Some(level) = detect_level(line) {
*counts.entry(level).or_insert(0) += 1;
}
}
for (level, count) in counts {
println!("{level}: {count}");
}
Ok(())
}
fn detect_level(line: &str) -> Option<&'static str> {
let upper = line.to_uppercase();
["ERROR", "WARN", "INFO", "DEBUG"]
.into_iter()
.find(|level| upper.contains(level))
}اكتب هنا