cheap_ruler/
distance_unit.rs

1use num_traits::Float;
2
3/// Defines common units of distance that can be used
4#[derive(Debug, PartialEq, Eq, Clone, Copy)]
5pub enum DistanceUnit {
6    Kilometers,
7    Miles,
8    NauticalMiles,
9    Meters,
10    Yards,
11    Feet,
12    Inches,
13}
14
15impl DistanceUnit {
16    /// Provides a factor that scales the unit into kilometers
17    pub(crate) fn conversion_factor_kilometers<T: Float>(&self) -> T {
18        match *self {
19            DistanceUnit::Kilometers => T::one(),
20            DistanceUnit::Miles => T::from(1000f64 / 1609.344).unwrap(),
21            DistanceUnit::NauticalMiles => T::from(1000f64 / 1852.0).unwrap(),
22            DistanceUnit::Meters => T::from(1000f64).unwrap(),
23            DistanceUnit::Yards => T::from(1000f64 / 0.9144).unwrap(),
24            DistanceUnit::Feet => T::from(1000f64 / 0.3048).unwrap(),
25            DistanceUnit::Inches => T::from(1000f64 / 0.0254).unwrap(),
26        }
27    }
28}
29
30#[cfg(test)]
31mod test {
32    use super::*;
33
34    #[test]
35    fn test_distance_unit_conversions() {
36        assert_eq!(value_1000(DistanceUnit::Kilometers), 1000);
37        assert_eq!(value_1000(DistanceUnit::Miles), 621);
38        assert_eq!(value_1000(DistanceUnit::NauticalMiles), 540);
39        assert_eq!(value_1000(DistanceUnit::Meters), 1000000);
40        assert_eq!(value_1000(DistanceUnit::Yards), 1093613);
41        assert_eq!(value_1000(DistanceUnit::Feet), 3280840);
42        assert_eq!(value_1000(DistanceUnit::Inches), 39370079);
43    }
44
45    fn value_1000(unit: DistanceUnit) -> i32 {
46        (unit.conversion_factor_kilometers::<f64>() * 1000.0).round() as i32
47    }
48}