use serde::{Deserialize, Serialize};
use super::common::SetType;
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct Set {
#[serde(default)]
pub index: u32,
#[serde(rename = "type", default)]
pub r#type: String,
#[serde(default)]
pub weight_kg: Option<f64>,
#[serde(default)]
pub reps: Option<f64>,
#[serde(default)]
pub distance_meters: Option<f64>,
#[serde(default)]
pub duration_seconds: Option<f64>,
#[serde(default)]
pub rpe: Option<f64>,
#[serde(default)]
pub custom_metric: Option<f64>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct Exercise {
#[serde(default)]
pub index: u32,
#[serde(default)]
pub title: String,
#[serde(default)]
pub notes: Option<String>,
#[serde(default)]
pub exercise_template_id: String,
#[serde(default)]
pub supersets_id: Option<u32>,
#[serde(default)]
pub sets: Vec<Set>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct Workout {
pub id: String,
#[serde(default)]
pub title: String,
#[serde(default)]
pub routine_id: Option<String>,
#[serde(default)]
pub description: Option<String>,
#[serde(default)]
pub start_time: String,
#[serde(default)]
pub end_time: String,
#[serde(default)]
pub updated_at: String,
#[serde(default)]
pub created_at: String,
#[serde(default)]
pub exercises: Vec<Exercise>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct WorkoutsPage {
pub page: u32,
pub page_count: u32,
#[serde(default)]
pub workouts: Vec<Workout>,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Serialize, Deserialize)]
pub struct WorkoutCount {
pub workout_count: u64,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct WorkoutSetInput {
#[serde(rename = "type", skip_serializing_if = "Option::is_none")]
pub r#type: Option<SetType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub weight_kg: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reps: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub distance_meters: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub duration_seconds: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub custom_metric: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub rpe: Option<f64>,
}
impl WorkoutSetInput {
pub fn normal(weight_kg: f64, reps: i64) -> Self {
Self {
r#type: Some(SetType::Normal),
weight_kg: Some(weight_kg),
reps: Some(reps),
..Default::default()
}
}
pub fn warmup(weight_kg: f64, reps: i64) -> Self {
Self {
r#type: Some(SetType::Warmup),
weight_kg: Some(weight_kg),
reps: Some(reps),
..Default::default()
}
}
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct WorkoutExerciseInput {
pub exercise_template_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub superset_id: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub notes: Option<String>,
pub sets: Vec<WorkoutSetInput>,
}
impl WorkoutExerciseInput {
pub fn new(exercise_template_id: impl Into<String>) -> Self {
Self {
exercise_template_id: exercise_template_id.into(),
superset_id: None,
notes: None,
sets: Vec::new(),
}
}
pub fn with_set(mut self, set: WorkoutSetInput) -> Self {
self.sets.push(set);
self
}
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct NewWorkout {
pub title: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub start_time: String,
pub end_time: String,
#[serde(default)]
pub is_private: bool,
pub exercises: Vec<WorkoutExerciseInput>,
}
impl NewWorkout {
pub fn new(
title: impl Into<String>,
start_time: impl Into<String>,
end_time: impl Into<String>,
) -> Self {
Self {
title: title.into(),
description: None,
start_time: start_time.into(),
end_time: end_time.into(),
is_private: false,
exercises: Vec::new(),
}
}
pub fn with_exercise(mut self, exercise: WorkoutExerciseInput) -> Self {
self.exercises.push(exercise);
self
}
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct CreateWorkoutRequest {
pub workout: NewWorkout,
}
impl CreateWorkoutRequest {
pub fn new(workout: NewWorkout) -> Self {
Self { workout }
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum WorkoutEvent {
Updated {
workout: Workout,
},
Deleted {
id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
deleted_at: Option<String>,
},
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct PaginatedWorkoutEvents {
pub page: u32,
pub page_count: u32,
#[serde(default)]
pub events: Vec<WorkoutEvent>,
}