Вправа: Трейт логгера

Давайте розробимо просту утиліту для ведення логів, використовуючи трейт Logger з методом log. Код, який може реєструвати свій прогрес, може отримати &impl Logger. Під час тестування це може призвести до запису повідомлень до тестового лог-файлу, тоді як у виробничій збірці повідомлення надсилатимуться до сервера логів.

Однак, наведений нижче StdoutLogger реєструє всі повідомлення, незалежно від їхньої докладності. Ваше завдання - написати тип VerbosityFilter, який ігноруватиме повідомлення з максимальною докладностю.

Це поширений патерн: структура, що обгортає реалізацію трейту і реалізує той самий трейт, додаючи поведінку в процесі. Які ще типи обгорток можуть бути корисними у утиліті для ведення логів?

pub trait Logger { /// Запишіть повідомлення із заданим рівнем докладності. fn log(&self, verbosity: u8, message: &str); } struct StdoutLogger; impl Logger for StdoutLogger { fn log(&self, verbosity: u8, message: &str) { println!("verbosity={verbosity}: {message}"); } } // TODO: Визначте та реалізуйте `VerbosityFilter`. fn main() { let logger = VerbosityFilter { max_verbosity: 3, inner: StdoutLogger }; logger.log(5, "FYI"); logger.log(2, "Uhoh"); }