use serde::{Deserialize, Serialize};
use super::common::{CustomExerciseType, EquipmentCategory, MuscleGroup};
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct ExerciseTemplate {
pub id: String,
#[serde(default)]
pub title: String,
#[serde(rename = "type", default)]
pub r#type: String,
#[serde(default)]
pub primary_muscle_group: String,
#[serde(default)]
pub secondary_muscle_groups: Vec<String>,
#[serde(default)]
pub equipment_category: Option<EquipmentCategory>,
#[serde(default)]
pub is_custom: bool,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct ExerciseTemplatesPage {
pub page: u32,
pub page_count: u32,
#[serde(default)]
pub exercise_templates: Vec<ExerciseTemplate>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct NewCustomExercise {
pub title: String,
pub exercise_type: CustomExerciseType,
pub equipment_category: EquipmentCategory,
pub muscle_group: MuscleGroup,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub other_muscles: Vec<MuscleGroup>,
}
impl NewCustomExercise {
pub fn new(
title: impl Into<String>,
exercise_type: CustomExerciseType,
equipment_category: EquipmentCategory,
muscle_group: MuscleGroup,
) -> Self {
Self {
title: title.into(),
exercise_type,
equipment_category,
muscle_group,
other_muscles: Vec::new(),
}
}
pub fn with_other_muscles(mut self, muscles: impl IntoIterator<Item = MuscleGroup>) -> Self {
self.other_muscles = muscles.into_iter().collect();
self
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CreateExerciseTemplateRequest {
pub exercise: NewCustomExercise,
}
impl CreateExerciseTemplateRequest {
pub fn new(exercise: NewCustomExercise) -> Self {
Self { exercise }
}
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Serialize, Deserialize)]
pub struct CreatedExerciseTemplate {
pub id: i64,
}