1. ```
pub trait Logger {
```
2. ```
/// Log a message at the given verbosity level.
```
3. ```
fn log(&self, verbosity: u8, message: &str);
```
4. ```
}
```
6. ```
struct StdoutLogger;
```
8. ```
impl Logger for StdoutLogger {
```
9. ```
fn log(&self, verbosity: u8, message: &str) {
```
10. ```
println!("verbosity={verbosity}: {message}");
```
11. ```
}
```
12. ```
}
```
14. ```
/// Only log messages up to the given verbosity level.
```
15. ```
struct VerbosityFilter {
```
16. ```
max_verbosity: u8,
```
17. ```
inner: StdoutLogger,
```
18. ```
}
```
20. ```
impl Logger for VerbosityFilter {
```
21. ```
fn log(&self, verbosity: u8, message: &str) {
```
22. ```
if verbosity <= self.max_verbosity {
```
23. ```
self.inner.log(verbosity, message);
```
24. ```
}
```
25. ```
}
```
26. ```
}
```
28. ```
fn main() {
```
29. ```
let logger = VerbosityFilter { max_verbosity: 3, inner: StdoutLogger };
```
30. ```
logger.log(5, "FYI");
```
31. ```
logger.log(2, "Uhoh");
```
32. ```
}
```