use chrono::{DateTime, NaiveDate, Utc}; use serde::{Deserialize, Serialize}; use strum::EnumIter; use uuid::Uuid; #[derive(sqlx::Type, Serialize, Deserialize, EnumIter)] #[sqlx(type_name = "metric_type")] pub enum MetricType { BodyWeight, Hip, Waist, } #[derive(sqlx::Type, Serialize, Deserialize, EnumIter)] #[sqlx(type_name = "unit")] pub enum Unit { Kilogram, Centimeter, } #[derive(Serialize)] pub struct MeasurementView { pub id: Uuid, pub measured_at: DateTime, pub metric_type: MetricType, pub value: f64, pub unit: Unit, } #[derive(Deserialize)] pub struct MeasurementData { pub measured_at: DateTime, pub metric_type: MetricType, pub value: f64, pub unit: Unit, } #[derive(Deserialize)] pub struct DateQuery { pub date: Option, pub from: Option, pub to: Option, } #[cfg(test)] mod tests { use super::*; use sqlx::PgPool; use strum::IntoEnumIterator; #[sqlx::test] async fn unit_enums_match(pool: PgPool) { let values: Vec = sqlx::query_scalar("SELECT enum_range(NULL::unit)") .fetch_one(&pool) .await .expect("Database has a variant that Rust doesn't"); assert_eq!( values.len(), Unit::iter().count(), "Rust has a variant that the database doesn't" ); } #[sqlx::test] async fn metric_type_enums_match(pool: PgPool) { let values: Vec = sqlx::query_scalar("SELECT enum_range(NULL::metric_type)") .fetch_one(&pool) .await .expect("Database has a variant that Rust doesn't"); assert_eq!( values.len(), MetricType::iter().count(), "Rust has a variant that the database doesn't" ); } }