Solution

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. ```
    }
    ```