Alıştırma: Kaydedici Özelliği (Logger Trait)

Bir log metoduna sahip bir Logger özelliği (trait) kullanarak basit bir kayıt (logging) aracı tasarlayalım. İlerlemesini kaydedebilecek kod daha sonra bir &impl Logger alabilir. Testte bu, mesajları test kayıt dosyasına (logfile) koyabilirken, bir üretim (production) inşasında mesajları bir kayıt sunucusuna (log server) gönderir.

Ancak, aşağıda verilen StderrLogger ayrıntı seviyesine (verbosity) bakılmaksızın tüm mesajları kaydeder. Göreviniz, maksimum ayrıntı seviyesi üzerindeki mesajları yoksayacak bir VerbosityFilter türü yazmaktır.

Bu yaygın bir desendir: bir özellik gerçekleştirmesini (trait implementation) saran ve aynı özelliği gerçekleştiren, süreçte davranış ekleyen bir yapı (struct). “Jenerikler” bölümünde, sarmalayıcıyı (wrapper) sarılmış tür (wrapped type) üzerinde jenerik yapmayı göreceğiz.

trait Logger {
    /// Belirtilen ayrıntı seviyesinde bir mesaj kaydedin.
    fn log(&self, verbosity: u8, message: &str);
}

struct StderrLogger;

impl Logger for StderrLogger {
    fn log(&self, verbosity: u8, message: &str) {
        eprintln!("ayrıntı seviyesi={verbosity}: {message}");
    }
}

/// Yalnızca belirtilen ayrıntı seviyesine kadar olan mesajları kaydedin.
struct VerbosityFilter {
    max_verbosity: u8,
    inner: StderrLogger,
}

// TODO: `VerbosityFilter` için `Logger` özelliğini (trait) gerçekleştirin.

fn main() {
    let logger = VerbosityFilter { max_verbosity: 3, inner: StderrLogger };
    logger.log(5, "Bilginiz Olsun");
    logger.log(2, "Eyvah");
}