1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/*! Common mapping for the Elasticsearch `geo` types. */

use serde;
use serde::Serialize;

/** A unit of measure for distance. */
pub enum DistanceUnit {
    /** For `in`. */
    Inches,
    /** For `yd`. */
    Yards,
    /** For `mi`. */
    Miles,
    /** For `km`. */
    Kilometers,
    /** For `m`. */
    Meters,
    /** For `cm`. */
    Centimeters,
    /** For `mm`. */
    Millimeters,
}

/** A distance value paired with a unit of measure. */
pub struct Distance(pub f32, pub DistanceUnit);

impl ToString for Distance {
    fn to_string(&self) -> String {
        let value = self.0.to_string();
        let unit = match self.1 {
            DistanceUnit::Inches => "in",
            DistanceUnit::Yards => "yd",
            DistanceUnit::Miles => "mi",
            DistanceUnit::Kilometers => "km",
            DistanceUnit::Meters => "m",
            DistanceUnit::Centimeters => "cm",
            DistanceUnit::Millimeters => "mm",
        };

        let mut s = String::with_capacity(value.len() + unit.len());
        s.push_str(&value);
        s.push_str(unit);

        s
    }
}

impl Serialize for Distance {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: serde::Serializer,
    {
        serializer.serialize_str(&self.to_string())
    }
}