Упражнение: фильтр логов
Опираясь на обобщённый логгер из этого утра, реализуйте Filter, который использует замыкание для фильтрации сообщений журнала и передаёт те, что проходят предикат фильтрации, внутреннему логгеру.
// Copyright 2025 Google LLC
// SPDX-License-Identifier: Apache-2.0
pub trait Logger {
/// Записывает сообщение с заданным уровнем подробности.
fn log(&self, verbosity: u8, message: &str);
}
struct StderrLogger;
impl Logger for StderrLogger {
fn log(&self, verbosity: u8, message: &str) {
eprintln!("[stderr] verbosity={verbosity}: {message}");
}
}
struct StdoutLogger;
impl Logger for StdoutLogger {
fn log(&self, verbosity: u8, message: &str) {
println!("[stdout] verbosity={verbosity}: {message}");
}
}
// TODO: определите и реализуйте `Filter`.
fn main() {
let prefix = "yikes";
let max_verbosity = 3;
// Логгер, который пишет в stderr и фильтрует по содержимому сообщений.
let logger = Filter::new(StderrLogger, |_verbosity, msg| msg.contains(prefix));
logger.log(5, "FYI");
logger.log(1, "yikes, something went wrong");
logger.log(2, "uhoh");
// Логгер, который пишет в stdout и фильтрует по уровню подробности.
let logger =
Filter::new(StdoutLogger, |verbosity, _msg| verbosity <= max_verbosity);
logger.log(5, "FYI");
logger.log(1, "yikes, something went wrong");
logger.log(2, "uhoh");
}