syntax_workout_core/
measure.rs1use 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}