2. ```
#![allow(dead_code)]
```
3. ```
pub struct User {
```
4. ```
name: String,
```
5. ```
age: u32,
```
6. ```
height: f32,
```
7. ```
visit_count: usize,
```
8. ```
last_blood_pressure: Option<(u32, u32)>,
```
9. ```
}
```
11. ```
pub struct Measurements {
```
12. ```
height: f32,
```
13. ```
blood_pressure: (u32, u32),
```
14. ```
}
```
16. ```
pub struct HealthReport<'a> {
```
17. ```
patient_name: &'a str,
```
18. ```
visit_count: u32,
```
19. ```
height_change: f32,
```
20. ```
blood_pressure_change: Option<(i32, i32)>,
```
21. ```
}
```
23. ```
impl User {
```
24. ```
pub fn new(name: String, age: u32, height: f32) -> Self {
```
25. ```
Self { name, age, height, visit_count: 0, last_blood_pressure: None }
```
26. ```
}
```
28. ```
pub fn visit_doctor(&mut self, measurements: Measurements) -> HealthReport {
```
29. ```
self.visit_count += 1;
```
30. ```
let bp = measurements.blood_pressure;
```
31. ```
let report = HealthReport {
```
32. ```
patient_name: &self.name,
```
33. ```
visit_count: self.visit_count as u32,
```
34. ```
height_change: measurements.height - self.height,
```
35. ```
blood_pressure_change: match self.last_blood_pressure {
```
36. ```
Some(lbp) => {
```
37. ```
Some((bp.0 as i32 - lbp.0 as i32, bp.1 as i32 - lbp.1 as i32))
```
38. ```
}
```
39. ```
None => None,
```
40. ```
},
```
41. ```
};
```
42. ```
self.height = measurements.height;
```
43. ```
self.last_blood_pressure = Some(bp);
```
44. ```
report
```
45. ```
}
```
46. ```
}
```
48. ```
fn main() {
```
49. ```
let bob = User::new(String::from("Bob"), 32, 155.2);
```
50. ```
println!("I'm {} and my age is {}", bob.name, bob.age);
```
51. ```
}
```
53. ```
#[test]
```
54. ```
fn test_visit() {
```
55. ```
let mut bob = User::new(String::from("Bob"), 32, 155.2);
```
56. ```
assert_eq!(bob.visit_count, 0);
```
57. ```
let report =
```
58. ```
bob.visit_doctor(Measurements { height: 156.1, blood_pressure: (120, 80) });
```
59. ```
assert_eq!(report.patient_name, "Bob");
```
60. ```
assert_eq!(report.visit_count, 1);
```
61. ```
assert_eq!(report.blood_pressure_change, None);
```
62. ```
assert!((report.height_change - 0.9).abs() < 0.00001);
```
64. ```
let report =
```
65. ```
bob.visit_doctor(Measurements { height: 156.1, blood_pressure: (115, 76) });
```
67. ```
assert_eq!(report.visit_count, 2);
```
68. ```
assert_eq!(report.blood_pressure_change, Some((-5, -4)));
```
69. ```
assert_eq!(report.height_change, 0.0);
```
70. ```
}
```