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