Skip to main content

syntax_workout_core/
intensity.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/")]
6#[serde(tag = "type", content = "value")]
7pub enum Intensity {
8    PercentOfMax(f64),
9    RPE(f64),
10    RIR(u32),
11    Bodyweight,
12    Custom { name: String, value: serde_json::Value },
13}
14
15#[cfg(test)]
16mod tests {
17    use super::*;
18
19    #[test]
20    fn rpe_round_trip() {
21        let i = Intensity::RPE(8.5);
22        let json = serde_json::to_string(&i).unwrap();
23        assert_eq!(json, r#"{"type":"RPE","value":8.5}"#);
24        let back: Intensity = serde_json::from_str(&json).unwrap();
25        assert_eq!(back, i);
26    }
27
28    #[test]
29    fn percent_of_max_round_trip() {
30        let i = Intensity::PercentOfMax(0.80);
31        let json = serde_json::to_string(&i).unwrap();
32        let back: Intensity = serde_json::from_str(&json).unwrap();
33        assert_eq!(back, i);
34    }
35
36    #[test]
37    fn bodyweight_round_trip() {
38        let i = Intensity::Bodyweight;
39        let json = serde_json::to_string(&i).unwrap();
40        assert_eq!(json, r#"{"type":"Bodyweight"}"#);
41        let back: Intensity = serde_json::from_str(&json).unwrap();
42        assert_eq!(back, i);
43    }
44
45    #[test]
46    fn rir_round_trip() {
47        let i = Intensity::RIR(2);
48        let json = serde_json::to_string(&i).unwrap();
49        let back: Intensity = serde_json::from_str(&json).unwrap();
50        assert_eq!(back, i);
51    }
52}