syntax-workout-core 0.2.0

Workout tree algebra — represent any physical workout as a recursive tree
Documentation
use serde::{Deserialize, Serialize};
use ts_rs::TS;

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, TS)]
#[ts(export, export_to = "../../../bindings/napi/generated/")]
#[serde(tag = "type", content = "value")]
pub enum Intensity {
    PercentOfMax(f64),
    RPE(f64),
    RIR(u32),
    Bodyweight,
    Custom { name: String, value: serde_json::Value },
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn rpe_round_trip() {
        let i = Intensity::RPE(8.5);
        let json = serde_json::to_string(&i).unwrap();
        assert_eq!(json, r#"{"type":"RPE","value":8.5}"#);
        let back: Intensity = serde_json::from_str(&json).unwrap();
        assert_eq!(back, i);
    }

    #[test]
    fn percent_of_max_round_trip() {
        let i = Intensity::PercentOfMax(0.80);
        let json = serde_json::to_string(&i).unwrap();
        let back: Intensity = serde_json::from_str(&json).unwrap();
        assert_eq!(back, i);
    }

    #[test]
    fn bodyweight_round_trip() {
        let i = Intensity::Bodyweight;
        let json = serde_json::to_string(&i).unwrap();
        assert_eq!(json, r#"{"type":"Bodyweight"}"#);
        let back: Intensity = serde_json::from_str(&json).unwrap();
        assert_eq!(back, i);
    }

    #[test]
    fn rir_round_trip() {
        let i = Intensity::RIR(2);
        let json = serde_json::to_string(&i).unwrap();
        let back: Intensity = serde_json::from_str(&json).unwrap();
        assert_eq!(back, i);
    }
}