Newtype Pattern for Type Safety

Wrap primitives in newtypes so distinct identifiers and units cannot be mixed, adding validation and methods without runtime cost.

RustData Integrity

Code

snippet
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
struct Meters(f64);

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
struct Seconds(f64);

#[derive(Debug)]
enum SpeedError {
    ZeroDuration,
}

impl Meters {
    fn per(self, duration: Seconds) -> Result<f64, SpeedError> {
        if duration.0 <= 0.0 {
            return Err(SpeedError::ZeroDuration);
        }
        Ok(self.0 / duration.0)
    }
}

fn main() {
    let distance = Meters(100.0);
    let duration = Seconds(9.58);
    match distance.per(duration) {
        Ok(speed) => println!("speed = {speed:.2} m/s"),
        Err(error) => eprintln!("invalid: {error:?}"),
    }
}