Exercise: Health Statistics

You’re working on implementing a health-monitoring system. As part of that, you need to keep track of users’ health statistics.

You’ll start with a stubbed function in an impl block as well as a User struct definition. Your goal is to implement the stubbed out method on the User struct defined in the impl block.

Copy the code below to <https://play.rust-lang.org/> and fill in the missing method:

1. ```
   // TODO: remove this when you're done with your implementation.
   ```
2. ```
   #![allow(unused_variables, dead_code)]
   ```

4. ```
   #![allow(dead_code)]
   ```
5. ```
   pub struct User {
   ```
6. ```
       name: String,
   ```
7. ```
       age: u32,
   ```
8. ```
       height: f32,
   ```
9. ```
       visit_count: usize,
   ```
10. ```
        last_blood_pressure: Option<(u32, u32)>,
    ```
11. ```
    }
    ```

13. ```
    pub struct Measurements {
    ```
14. ```
        height: f32,
    ```
15. ```
        blood_pressure: (u32, u32),
    ```
16. ```
    }
    ```

18. ```
    pub struct HealthReport<'a> {
    ```
19. ```
        patient_name: &'a str,
    ```
20. ```
        visit_count: u32,
    ```
21. ```
        height_change: f32,
    ```
22. ```
        blood_pressure_change: Option<(i32, i32)>,
    ```
23. ```
    }
    ```

25. ```
    impl User {
    ```
26. ```
        pub fn new(name: String, age: u32, height: f32) -> Self {
    ```
27. ```
            Self { name, age, height, visit_count: 0, last_blood_pressure: None }
    ```
28. ```
        }
    ```

30. ```
        pub fn visit_doctor(&mut self, measurements: Measurements) -> HealthReport {
    ```
31. ```
            todo!("Update a user's statistics based on measurements from a visit to the doctor")
    ```
32. ```
        }
    ```
33. ```
    }
    ```

35. ```
    fn main() {
    ```
36. ```
        let bob = User::new(String::from("Bob"), 32, 155.2);
    ```
37. ```
        println!("I'm {} and my age is {}", bob.name, bob.age);
    ```
38. ```
    }
    ```

40. ```
    #[test]
    ```
41. ```
    fn test_visit() {
    ```
42. ```
        let mut bob = User::new(String::from("Bob"), 32, 155.2);
    ```
43. ```
        assert_eq!(bob.visit_count, 0);
    ```
44. ```
        let report =
    ```
45. ```
            bob.visit_doctor(Measurements { height: 156.1, blood_pressure: (120, 80) });
    ```
46. ```
        assert_eq!(report.patient_name, "Bob");
    ```
47. ```
        assert_eq!(report.visit_count, 1);
    ```
48. ```
        assert_eq!(report.blood_pressure_change, None);
    ```
49. ```
        assert!((report.height_change - 0.9).abs() < 0.00001);
    ```

51. ```
        let report =
    ```
52. ```
            bob.visit_doctor(Measurements { height: 156.1, blood_pressure: (115, 76) });
    ```

54. ```
        assert_eq!(report.visit_count, 2);
    ```
55. ```
        assert_eq!(report.blood_pressure_change, Some((-5, -4)));
    ```
56. ```
        assert_eq!(report.height_change, 0.0);
    ```
57. ```
    }
    ```