oura_api/
models.rs

1//! Models for the Oura API
2//!
3//! This module contains the models for the Oura API. These models are used to deserialize the JSON responses from the API into Rust structs.
4//!
5//! See the [Oura API documentation](https://cloud.ouraring.com/v2/docs) for more information.
6
7use serde::Deserialize;
8
9#[derive(Deserialize, Debug, PartialEq)]
10pub struct Sample {
11    pub interval: f32,
12    pub items: Vec<Option<f32>>,
13    pub timestamp: String,
14}
15
16#[derive(Deserialize, Debug, PartialEq)]
17pub struct ActivityContributors {
18    pub meet_daily_targets: Option<u8>,
19    pub move_every_hour: Option<u8>,
20    pub recovery_time: Option<u8>,
21    pub stay_active: Option<u8>,
22    pub training_frequency: Option<u8>,
23    pub training_volume: Option<u8>,
24}
25
26#[derive(Deserialize, Debug, PartialEq)]
27pub struct DailyActivity {
28    pub id: String,
29    pub class_5_min: Option<String>,
30    pub score: Option<u8>,
31    pub active_calories: u32,
32    pub average_met_minutes: f32,
33    pub contributors: ActivityContributors,
34    pub equivalent_walking_distance: u32,
35    pub high_activity_met_minutes: u32,
36    pub high_activity_time: u32,
37    pub inactivity_alerts: u32,
38    pub low_activity_met_minutes: u32,
39    pub low_activity_time: u32,
40    pub medium_activity_met_minutes: u32,
41    pub medium_activity_time: u32,
42    pub met: Sample,
43    pub meters_to_target: u32,
44    pub non_wear_time: u32,
45    pub resting_time: u32,
46    pub sedentary_met_minutes: u32,
47    pub sedentary_time: u32,
48    pub steps: u32,
49    pub target_calories: u32,
50    pub target_meters: u32,
51    pub total_calories: u32,
52    pub day: String,
53    pub timestamp: String,
54}
55
56#[derive(Deserialize, Debug, PartialEq)]
57pub struct ReadinessContributors {
58    pub activity_balance: Option<u8>,
59    pub body_temperature: Option<u8>,
60    pub hrv_balance: Option<u8>,
61    pub previous_day_activity: Option<u8>,
62    pub previous_night: Option<u8>,
63    pub recovery_index: Option<u8>,
64    pub resting_heart_rate: Option<u8>,
65    pub sleep_balance: Option<u8>,
66}
67
68#[derive(Deserialize, Debug, PartialEq)]
69pub struct DailyReadiness {
70    pub id: String,
71    pub contributors: ReadinessContributors,
72    pub day: String,
73    pub score: Option<u8>,
74    pub temperature_deviation: Option<f32>,
75    pub temperature_trend_deviation: Option<f32>,
76    pub timestamp: String,
77}
78
79#[derive(Deserialize, Debug, PartialEq)]
80pub struct SleepContributors {
81    pub deep_sleep: Option<u8>,
82    pub efficiency: Option<u8>,
83    pub latency: Option<u8>,
84    pub rem_sleep: Option<u8>,
85    pub restfulness: Option<u8>,
86    pub timing: Option<u8>,
87    pub total_sleep: Option<u8>,
88}
89
90#[derive(Deserialize, Debug, PartialEq)]
91pub struct DailySleep {
92    pub id: String,
93    pub contributors: SleepContributors,
94    pub day: String,
95    pub timestamp: String,
96    pub score: Option<u8>,
97}
98
99#[derive(Deserialize, Debug, PartialEq)]
100pub struct DailySpO2AggregatedValues {
101    pub average: f32,
102}
103
104#[derive(Deserialize, Debug, PartialEq)]
105pub struct DailySpO2 {
106    pub id: String,
107    pub day: String,
108    pub spo2_percentage: Option<DailySpO2AggregatedValues>,
109}
110
111#[derive(Deserialize, Debug, PartialEq)]
112pub struct HeartRate {
113    pub bpm: u8,
114    pub source: String,
115    pub timestamp: String,
116}
117
118#[derive(Deserialize, Debug, PartialEq)]
119pub struct PersonalInfo {
120    pub id: String,
121    pub age: Option<u32>,
122    pub weight: Option<f32>,
123    pub height: Option<f32>,
124    pub biological_sex: Option<String>,
125    pub email: Option<String>,
126}
127
128#[derive(Deserialize, Debug, PartialEq)]
129pub struct RestModeEpisode {
130    pub tags: Vec<String>,
131    pub timestamp: String,
132}
133
134#[derive(Deserialize, Debug, PartialEq)]
135pub struct RestModePeriod {
136    pub id: String,
137    pub end_day: Option<String>,
138    pub end_time: Option<String>,
139    pub episodes: Vec<RestModeEpisode>,
140    pub start_day: String,
141    pub start_time: String,
142}
143
144#[derive(Deserialize, Debug, PartialEq)]
145#[serde(rename_all = "snake_case")]
146pub enum RingColor {
147    GlossyBlack,
148    StealthBlack,
149    Rose,
150    Silver,
151    GlossyGold,
152}
153
154#[derive(Deserialize, Debug, PartialEq)]
155#[serde(rename_all = "snake_case")]
156pub enum RingDesign {
157    Heritage,
158    Horizon,
159}
160
161#[derive(Deserialize, Debug, PartialEq)]
162#[serde(rename_all = "snake_case")]
163pub enum RingHardwareType {
164    Gen1,
165    Gen2,
166    Gen2m,
167    Gen3,
168}
169
170#[derive(Deserialize, Debug, PartialEq)]
171pub struct RingConfiguration {
172    pub id: String,
173    pub color: Option<RingColor>,
174    pub design: Option<RingDesign>,
175    pub firmware_version: Option<String>,
176    pub hardware_type: Option<RingHardwareType>,
177    pub set_up_at: Option<String>,
178    pub size: Option<u32>,
179}
180
181#[derive(Deserialize, Debug, PartialEq)]
182#[serde(rename_all = "snake_case")]
183pub enum MomentType {
184    Breathing,
185    Meditation,
186    Nap,
187    Relaxation,
188    Rest,
189    BodyStatus,
190}
191
192#[derive(Deserialize, Debug, PartialEq)]
193#[serde(rename_all = "snake_case")]
194pub enum MomentMood {
195    Bad,
196    Worse,
197    Same,
198    Good,
199    Great,
200}
201
202#[derive(Deserialize, Debug, PartialEq)]
203pub struct Session {
204    pub id: String,
205    pub day: String,
206    pub start_datetime: String,
207    pub end_datetime: String,
208    pub r#type: MomentType,
209    pub heart_rate: Option<Sample>,
210    pub heart_rate_variability: Option<Sample>,
211    pub mood: Option<MomentMood>,
212    pub motion_count: Option<Sample>,
213}
214
215#[derive(Deserialize, Debug, PartialEq)]
216pub struct ReadinessSummary {
217    pub contributors: ReadinessContributors,
218    pub score: Option<u8>,
219    pub temperature_devation: Option<f32>,
220    pub temperature_trend_deviation: Option<f32>,
221}
222
223#[derive(Deserialize, Debug, PartialEq)]
224#[serde(rename_all = "lowercase")]
225pub enum SleepAlgorithmVersion {
226    V1,
227    V2,
228}
229
230#[derive(Deserialize, Debug, PartialEq)]
231#[serde(rename_all = "snake_case")]
232pub enum SleepType {
233    Deleted,
234    Sleep,
235    LongSleep,
236    LateNap,
237    Rest,
238}
239
240#[derive(Deserialize, Debug, PartialEq)]
241pub struct Sleep {
242    pub id: String,
243    pub average_breath: Option<f32>,
244    pub average_heart_rate: Option<f32>,
245    pub average_hrv: Option<u32>,
246    pub awake_time: Option<u32>,
247    pub bedtime_end: String,
248    pub bedtime_start: String,
249    pub day: String,
250    pub deep_sleep_duration: Option<u32>,
251    pub efficiency: Option<u8>,
252    pub heart_rate: Option<Sample>,
253    pub hrv: Option<Sample>,
254    pub latency: Option<u32>,
255    pub light_sleep_duration: Option<u32>,
256    pub low_battery_alert: bool,
257    pub lowest_heart_rate: Option<u32>,
258    pub movement_30_sec: Option<String>,
259    pub period: u32,
260    pub readiness: Option<ReadinessSummary>,
261    pub readiness_score_delta: Option<u8>,
262    pub rem_sleep_duration: Option<u32>,
263    pub restless_periods: Option<u32>,
264    pub sleep_phase_5_min: Option<String>,
265    pub sleep_score_delta: Option<u8>,
266    pub sleep_algorithm_version: Option<SleepAlgorithmVersion>,
267    pub time_in_bed: u32,
268    pub total_sleep_duration: Option<u32>,
269    pub r#type: SleepType,
270}
271
272#[derive(Deserialize, Debug, PartialEq)]
273pub struct SleepTimeWindow {
274    pub day_tz: u32,
275    pub end_offset: u32,
276    pub start_offset: u32,
277}
278
279#[derive(Deserialize, Debug, PartialEq)]
280#[serde(rename_all = "snake_case")]
281pub enum SleepTimeRecommendation {
282    ImproveEfficiency,
283    EarlierBedtime,
284    LaterBedtime,
285    EarlierWakeUpTime,
286    LaterWakeUpTime,
287    FollowOptimalBedtime,
288}
289
290#[derive(Deserialize, Debug, PartialEq)]
291#[serde(rename_all = "snake_case")]
292pub enum SleepTimeStatus {
293    NotEnoughNights,
294    NotEnoughRecentNights,
295    BadSleepQuality,
296    OnlyRecommendedFound,
297    OptimalFound,
298}
299
300#[derive(Deserialize, Debug, PartialEq)]
301pub struct SleepTime {
302    pub id: String,
303    pub day: String,
304    pub optimal_bedtime: Option<SleepTimeWindow>,
305    pub recommendation: Option<SleepTimeRecommendation>,
306    pub status: Option<SleepTimeStatus>,
307}
308
309#[derive(Deserialize, Debug, PartialEq)]
310pub struct Tag {
311    pub id: String,
312    pub day: String,
313    pub text: Option<String>,
314    pub timestamp: String,
315    pub tags: Vec<String>,
316}
317
318#[derive(Deserialize, Debug, PartialEq)]
319#[serde(rename_all = "snake_case")]
320pub enum WorkoutIntensity {
321    Easy,
322    Moderate,
323    Hard,
324}
325
326#[derive(Deserialize, Debug, PartialEq)]
327#[serde(rename_all = "snake_case")]
328pub enum WorkoutSource {
329    Manual,
330    Autodetected,
331    Confirmed,
332    WorkoutHeartRate,
333}
334
335#[derive(Deserialize, Debug, PartialEq)]
336pub struct Workout {
337    pub id: String,
338    pub activity: String,
339    pub calories: Option<f32>,
340    pub day: String,
341    pub distance: Option<f32>,
342    pub end_datetime: String,
343    pub intensity: WorkoutIntensity,
344    pub label: Option<String>,
345    pub source: WorkoutSource,
346    pub start_datetime: String,
347}
348
349#[derive(Deserialize, Debug, PartialEq)]
350pub struct TagV2 {
351    pub id: String,
352    pub tag_type_code: Option<String>,
353    pub start_time: String,
354    pub end_time: Option<String>,
355    pub start_day: String,
356    pub end_day: Option<String>,
357    pub comment: Option<String>,
358}