AzLearn

تمرين إعادة البناء

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))
}
اكتب هنا