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
use crate::error::{Error, Result}; use emseries::{DateTimeTz, Recordable}; #[derive(Clone, Debug, PartialEq, Deserialize, Serialize)] pub enum ActivityType { Pushups, Situps, Squats, } #[derive(Clone, Debug, PartialEq, Deserialize, Serialize)] pub struct SetRepRecord { #[serde(rename = "date")] timestamp: DateTimeTz, pub activity: ActivityType, pub sets: Vec<u32>, pub comments: Option<String>, } impl SetRepRecord { pub fn new( timestamp: DateTimeTz, activity: ActivityType, sets: Vec<u32>, comments: Option<String>, ) -> Result<SetRepRecord> { if sets.iter().all(|&x| x > 0) { Ok(SetRepRecord { timestamp, activity, sets, comments, }) } else { Err(Error::InvalidParameter) } } } impl Recordable for SetRepRecord { fn timestamp(&self) -> DateTimeTz { self.timestamp.clone() } fn tags(&self) -> Vec<String> { match self.activity { ActivityType::Pushups => vec![String::from("Pushups")], ActivityType::Situps => vec![String::from("Situps")], ActivityType::Squats => vec![String::from("Squats")], } } }