Skip to main content

syntax_workout_core/
measure.rs

1use serde::{Deserialize, Serialize};
2use ts_rs::TS;
3
4#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, TS)]
5#[ts(export, export_to = "../../../bindings/napi/generated/")]
6pub enum WeightUnit {
7    Kg,
8    Lbs,
9}
10
11#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, TS)]
12#[ts(export, export_to = "../../../bindings/napi/generated/")]
13pub enum DistanceUnit {
14    Meters,
15    Kilometers,
16    Miles,
17}
18
19#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, TS)]
20#[ts(export, export_to = "../../../bindings/napi/generated/")]
21#[serde(tag = "type", content = "value")]
22pub enum Measure {
23    Reps(u32),
24    Weight { amount: f64, unit: WeightUnit },
25    Distance { amount: f64, unit: DistanceUnit },
26    Duration { seconds: f64 },
27    Pace { per: DistanceUnit, seconds: f64 },
28    HeartRate { bpm: u32 },
29    Calories(u32),
30    Custom { name: String, value: serde_json::Value },
31}
32
33#[cfg(test)]
34mod tests {
35    use super::*;
36
37    #[test]
38    fn reps_round_trip() {
39        let m = Measure::Reps(10);
40        let json = serde_json::to_string(&m).unwrap();
41        assert_eq!(json, r#"{"type":"Reps","value":10}"#);
42        let back: Measure = serde_json::from_str(&json).unwrap();
43        assert_eq!(back, m);
44    }
45
46    #[test]
47    fn weight_round_trip() {
48        let m = Measure::Weight { amount: 80.0, unit: WeightUnit::Kg };
49        let json = serde_json::to_string(&m).unwrap();
50        let back: Measure = serde_json::from_str(&json).unwrap();
51        assert_eq!(back, m);
52        assert!(json.contains(r#""type":"Weight""#));
53        assert!(json.contains(r#""unit":"Kg""#));
54    }
55
56    #[test]
57    fn distance_round_trip() {
58        let m = Measure::Distance { amount: 5.0, unit: DistanceUnit::Kilometers };
59        let json = serde_json::to_string(&m).unwrap();
60        let back: Measure = serde_json::from_str(&json).unwrap();
61        assert_eq!(back, m);
62    }
63
64    #[test]
65    fn duration_round_trip() {
66        let m = Measure::Duration { seconds: 180.0 };
67        let json = serde_json::to_string(&m).unwrap();
68        let back: Measure = serde_json::from_str(&json).unwrap();
69        assert_eq!(back, m);
70    }
71
72    #[test]
73    fn pace_round_trip() {
74        let m = Measure::Pace { per: DistanceUnit::Kilometers, seconds: 330.0 };
75        let json = serde_json::to_string(&m).unwrap();
76        let back: Measure = serde_json::from_str(&json).unwrap();
77        assert_eq!(back, m);
78    }
79
80    #[test]
81    fn custom_measure_round_trip() {
82        let m = Measure::Custom {
83            name: "elevation".into(),
84            value: serde_json::json!(150),
85        };
86        let json = serde_json::to_string(&m).unwrap();
87        let back: Measure = serde_json::from_str(&json).unwrap();
88        assert_eq!(back, m);
89    }
90}