1#[derive(Debug, Copy, Clone)]
6pub struct UnitDefn {
7 pub name: &'static str,
8 pub to_meter: f64,
9}
10
11macro_rules! unit {
12 ($name:expr, $display:expr, $comment:expr, $to_meter:expr) => {
13 UnitDefn {
14 name: $name,
15 to_meter: $to_meter,
16 }
17 };
18}
19
20pub const METER: UnitDefn = unit!("m", "1", "Meter", 1.0);
21
22pub const DEGREES: &str = "degrees";
23
24mod constants {
25 use super::*;
26 #[rustfmt::skip]
29 pub const UNITS: [UnitDefn;21] = [
30 unit!("km", "1000", "Kilometer", 1000.0),
31 unit!("m", "1", "Meter", 1.0),
32 unit!("dm", "1/10", "Decimeter", 0.1),
33 unit!("cm", "1/100", "Centimeter", 0.01),
34 unit!("mm", "1/1000", "Millimeter", 0.001),
35 unit!("kmi", "1852", "International Nautical Mile", 1852.0),
36 unit!("in", "0.0254", "International Inch", 0.0254),
37 unit!("ft", "0.3048", "International Foot", 0.3048),
38 unit!("yd", "0.9144", "International Yard", 0.9144),
39 unit!("mi", "1609.344", "International Statute Mile", 1609.344),
40 unit!("fath", "1.8288", "International Fathom", 1.8288),
41 unit!("ch", "20.1168", "International Chain", 20.1168),
42 unit!("link", "0.201168", "International Link", 0.201168),
43 unit!("us-in", "1/39.37", "U.S. Surveyor's Inch", 100./3937.0),
44 unit!("us-ft", "0.304800609601219", "U.S. Surveyor's Foot", 1200./3937.0),
45 unit!("us-yd", "0.914401828803658", "U.S. Surveyor's Yard", 3600./3937.0),
46 unit!("us-ch", "20.11684023368047", "U.S. Surveyor's Chain", 79200./3937.0),
47 unit!("us-mi", "1609.347218694437", "U.S. Surveyor's Statute Mile", 6336000./3937.0),
48 unit!("ind-yd", "0.91439523", "Indian Yard", 0.91439523),
49 unit!("ind-ft", "0.30479841", "Indian Foot", 0.30479841),
50 unit!("ind-ch", "20.11669506", "Indian Chain", 20.11669506),
51 ];
52}
53
54pub fn from_value(to_meter: f64) -> UnitDefn {
55 UnitDefn { name: "", to_meter }
56}
57
58pub fn find_units(name: &str) -> Option<UnitDefn> {
60 constants::UNITS
61 .iter()
62 .find(|d| d.name.eq_ignore_ascii_case(name))
63 .copied()
64}