1. use std::fmt::Display;
3. pub trait Logger {
4. /// Log a message at the given verbosity level.
5. fn log(&self, verbosity: u8, message: impl Display);
6. }
8. struct StderrLogger;
10. impl Logger for StderrLogger {
11. fn log(&self, verbosity: u8, message: impl Display) {
12. eprintln!("verbosity={verbosity}: {message}");
13. }
14. }
16. fn do_things(logger: &impl Logger) {
17. logger.log(5, "FYI");
18. logger.log(2, "Uhoh");
19. }
21. /// Only log messages up to the given verbosity level.
22. struct VerbosityFilter {
23. max_verbosity: u8,
24. inner: StderrLogger,
25. }
27. impl Logger for VerbosityFilter {
28. fn log(&self, verbosity: u8, message: impl Display) {
29. if verbosity <= self.max_verbosity {
30. self.inner.log(verbosity, message);
31. }
32. }
33. }
35. fn main() {
36. let l = VerbosityFilter { max_verbosity: 3, inner: StderrLogger };
37. do_things(&l);
38. }