summaryrefslogtreecommitdiff
path: root/src/models.rs
diff options
context:
space:
mode:
authorbatsumaru <>2026-10-16 11:57:17 +0900
committerbatsumaru <>2026-10-16 11:57:17 +0900
commita69e78b7482227f22e7ddbfaa7dc7ee31f29a99b (patch)
treee829a766484e1937bcbcd4e97668e9d674ea6099 /src/models.rs
parent7dc5038a7438d0eaf63d4bf65f88f6f5ab6b3207 (diff)
Add enum fetchers
Diffstat (limited to 'src/models.rs')
-rw-r--r--src/models.rs76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/models.rs b/src/models.rs
new file mode 100644
index 0000000..b3f23d1
--- /dev/null
+++ b/src/models.rs
@@ -0,0 +1,76 @@
+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<Utc>,
+ pub metric_type: MetricType,
+ pub value: f64,
+ pub unit: Unit,
+}
+
+#[derive(Deserialize)]
+pub struct MeasurementData {
+ pub measured_at: DateTime<Utc>,
+ pub metric_type: MetricType,
+ pub value: f64,
+ pub unit: Unit,
+}
+
+#[derive(Deserialize)]
+pub struct DateQuery {
+ pub date: Option<NaiveDate>,
+ pub from: Option<NaiveDate>,
+ pub to: Option<NaiveDate>,
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use sqlx::PgPool;
+ use strum::IntoEnumIterator;
+
+ #[sqlx::test]
+ async fn unit_enums_match(pool: PgPool) {
+ let values: Vec<Unit> = 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<MetricType> = 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"
+ );
+ }
+}