cheap_ruler/
distance_unit.rs1use num_traits::Float;
2
3#[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 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}