A Neat Rust Trick

2025-02-08

this post will be very short. let's say you have a struct Metrics

struct Seconds(u64);

struct Metrics {
	daily_active_users: u64,
	average_visit_duration: Seconds
}

and it has a custom ToString implementation

impl ToString for Metrics {
	fn to_string(&self) -> String {
		format!("dau: {}, mean(visit duration): {}", self.daily_active_users, self.average_visit_duration)
	}
}

Time passes, and there is a new metric - origin site.


struct Metrics {
	daily_active_usears: u64,
	average_visit_duration: Seconds,
	origin_site: String
}

Now, when calling .to_string(), origin_site will be left out. How can we ensure all fields be handled?

impl ToString for Metrics {
	fn to_string(&self) -> String {
		let Self { daily_active_users, average_visit_duration} = self;
		format!("dau: {}, mean(visit duration): {}", daily_active_users, average visit_duration)
	}
}

Not explicitly handling the additional field will now result in a compile time error.

Compiling example v0.0.1 (/example)
error[E0027]: pattern does not mention field `origin_site`
  --> src/lib.rs:12:7
   |
12 |         let Self { daily_active_users, average_visit_duration} = self;
   |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing field `origin_site`
   |
help: include the missing field in the pattern
   |
12 |         let Self { daily_active_users, average_visit_duration, origin_site } = self;
   |                                                              ~~~~~~~~~~~~~~~
help: if you don't care about this missing field, you can explicitly ignore it
   |
12 |         let Self { daily_active_users, average_visit_duration, origin_site: _ } = self;
   |                                                              ~~~~~~~~~~~~~~~~~~
help: or always ignore missing fields here
   |
12 |         let Self { daily_active_users, average_visit_duration, .. } = self;
   |                                                              ~~~~~~

For more information about this error, try `rustc --explain E0027`.
error: could not compile `example` (lib) due to 1 previous error