1use 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}