تمرین: Trait Logger

بیایید یک ابزار لاگ‌ ساده طراحی کنیم که از یک trait به نام Logger با متد log استفاده کند. کدی که ممکن است پیشرفت خود را لاگ کند می‌تواند یک impl Logger& دریافت کند. در زمان تست، این ممکن است پیام‌ها را در فایل‌ لاگ تست قرار دهد، در حالی که در نسخه تولید، پیام‌ها به یک سرور لاگ ارسال می‌شود.

با این حال، StderrLogger که در زیر داده شده است، تمامی پیام‌ها را بدون توجه به سطح جزئیات لاگ می‌کند. وظیفه شما این است که نوع VerbosityFilter را بنویسید که پیام‌هایی با سطح جزئیات بالاتر از حداکثر سطح تعیین‌شده را نادیده بگیرد.

این الگو الگوی رایجی است: یک ساختارکه یک پیاده‌سازی trait را در بر می‌گیرد و همان trait را پیاده‌سازی می‌کند و در این فرآیند به آن رفتار اضافی می‌دهد. چه نوع‌های دیگری از پوشش‌دهنده‌ها ممکن است در یک ابزار لاگ مفید باشند؟

use std::fmt::Display;

pub trait Logger {
    /// Log a message at the given verbosity level.
    fn log(&self, verbosity: u8, message: impl Display);
}

struct StderrLogger;

impl Logger for StderrLogger {
    fn log(&self, verbosity: u8, message: impl Display) {
        eprintln!("اطلاعات بیشتر={verbosity}: {message}");
    }
}

fn do_things(logger: &impl Logger) {
    logger.log(5, "FYI");
    logger.log(2, "اوهو");
}

// TODO: Define and implement `VerbosityFilter`.

fn main() {
    let l = VerbosityFilter { max_verbosity: 3, inner: StderrLogger };
    do_things(&l);
}