Skip to main content

fit/profile/generated/
types.rs

1// @generated by fit-codegen. DO NOT EDIT.
2// Source: guide/garmin_fit_guide/Profile.xlsx
3
4//! Auto-generated FIT enum types. Each enum corresponds to a row in the
5//! Types sheet of Profile.xlsx that has a non-empty list of named values.
6//! `mesg_num` is split into its own module (see `super::mesg_num`).
7
8#![allow(non_camel_case_types, dead_code, clippy::should_implement_trait)]
9
10use super::mesg_num::MesgNum;
11
12#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
13#[repr(u8)]
14#[non_exhaustive]
15pub enum File {
16    Device = 1,
17    Settings = 2,
18    Sport = 3,
19    Activity = 4,
20    Workout = 5,
21    Course = 6,
22    Schedules = 7,
23    Weight = 9,
24    Totals = 10,
25    Goals = 11,
26    BloodPressure = 14,
27    MonitoringA = 15,
28    ActivitySummary = 20,
29    MonitoringDaily = 28,
30    MonitoringB = 32,
31    Segment = 34,
32    SegmentList = 35,
33    ExdConfiguration = 40,
34    MfgRangeMin = 247,
35    MfgRangeMax = 254,
36}
37
38impl File {
39    /// Snake-case canonical name from Profile.xlsx.
40    pub fn as_str(&self) -> &'static str {
41        match self {
42            File::Device => "device",
43            File::Settings => "settings",
44            File::Sport => "sport",
45            File::Activity => "activity",
46            File::Workout => "workout",
47            File::Course => "course",
48            File::Schedules => "schedules",
49            File::Weight => "weight",
50            File::Totals => "totals",
51            File::Goals => "goals",
52            File::BloodPressure => "blood_pressure",
53            File::MonitoringA => "monitoring_a",
54            File::ActivitySummary => "activity_summary",
55            File::MonitoringDaily => "monitoring_daily",
56            File::MonitoringB => "monitoring_b",
57            File::Segment => "segment",
58            File::SegmentList => "segment_list",
59            File::ExdConfiguration => "exd_configuration",
60            File::MfgRangeMin => "mfg_range_min",
61            File::MfgRangeMax => "mfg_range_max",
62        }
63    }
64
65    /// Try to construct from the underlying numeric value.
66    pub fn from_value(value: u8) -> Option<Self> {
67        match value {
68            1 => Some(File::Device),
69            2 => Some(File::Settings),
70            3 => Some(File::Sport),
71            4 => Some(File::Activity),
72            5 => Some(File::Workout),
73            6 => Some(File::Course),
74            7 => Some(File::Schedules),
75            9 => Some(File::Weight),
76            10 => Some(File::Totals),
77            11 => Some(File::Goals),
78            14 => Some(File::BloodPressure),
79            15 => Some(File::MonitoringA),
80            20 => Some(File::ActivitySummary),
81            28 => Some(File::MonitoringDaily),
82            32 => Some(File::MonitoringB),
83            34 => Some(File::Segment),
84            35 => Some(File::SegmentList),
85            40 => Some(File::ExdConfiguration),
86            247 => Some(File::MfgRangeMin),
87            254 => Some(File::MfgRangeMax),
88            _ => None,
89        }
90    }
91
92    /// Try to construct from the snake-case canonical name.
93    pub fn from_str(name: &str) -> Option<Self> {
94        match name {
95            "device" => Some(File::Device),
96            "settings" => Some(File::Settings),
97            "sport" => Some(File::Sport),
98            "activity" => Some(File::Activity),
99            "workout" => Some(File::Workout),
100            "course" => Some(File::Course),
101            "schedules" => Some(File::Schedules),
102            "weight" => Some(File::Weight),
103            "totals" => Some(File::Totals),
104            "goals" => Some(File::Goals),
105            "blood_pressure" => Some(File::BloodPressure),
106            "monitoring_a" => Some(File::MonitoringA),
107            "activity_summary" => Some(File::ActivitySummary),
108            "monitoring_daily" => Some(File::MonitoringDaily),
109            "monitoring_b" => Some(File::MonitoringB),
110            "segment" => Some(File::Segment),
111            "segment_list" => Some(File::SegmentList),
112            "exd_configuration" => Some(File::ExdConfiguration),
113            "mfg_range_min" => Some(File::MfgRangeMin),
114            "mfg_range_max" => Some(File::MfgRangeMax),
115            _ => None,
116        }
117    }
118}
119
120#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
121#[repr(u8)]
122#[non_exhaustive]
123pub enum Checksum {
124    Clear = 0,
125    Ok = 1,
126}
127
128impl Checksum {
129    /// Snake-case canonical name from Profile.xlsx.
130    pub fn as_str(&self) -> &'static str {
131        match self {
132            Checksum::Clear => "clear",
133            Checksum::Ok => "ok",
134        }
135    }
136
137    /// Try to construct from the underlying numeric value.
138    pub fn from_value(value: u8) -> Option<Self> {
139        match value {
140            0 => Some(Checksum::Clear),
141            1 => Some(Checksum::Ok),
142            _ => None,
143        }
144    }
145
146    /// Try to construct from the snake-case canonical name.
147    pub fn from_str(name: &str) -> Option<Self> {
148        match name {
149            "clear" => Some(Checksum::Clear),
150            "ok" => Some(Checksum::Ok),
151            _ => None,
152        }
153    }
154}
155
156#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
157#[repr(u8)]
158#[non_exhaustive]
159pub enum FileFlags {
160    Read = 2,
161    Write = 4,
162    Erase = 8,
163}
164
165impl FileFlags {
166    /// Snake-case canonical name from Profile.xlsx.
167    pub fn as_str(&self) -> &'static str {
168        match self {
169            FileFlags::Read => "read",
170            FileFlags::Write => "write",
171            FileFlags::Erase => "erase",
172        }
173    }
174
175    /// Try to construct from the underlying numeric value.
176    pub fn from_value(value: u8) -> Option<Self> {
177        match value {
178            2 => Some(FileFlags::Read),
179            4 => Some(FileFlags::Write),
180            8 => Some(FileFlags::Erase),
181            _ => None,
182        }
183    }
184
185    /// Try to construct from the snake-case canonical name.
186    pub fn from_str(name: &str) -> Option<Self> {
187        match name {
188            "read" => Some(FileFlags::Read),
189            "write" => Some(FileFlags::Write),
190            "erase" => Some(FileFlags::Erase),
191            _ => None,
192        }
193    }
194}
195
196#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
197#[repr(u8)]
198#[non_exhaustive]
199pub enum MesgCount {
200    NumPerFile = 0,
201    MaxPerFile = 1,
202    MaxPerFileType = 2,
203}
204
205impl MesgCount {
206    /// Snake-case canonical name from Profile.xlsx.
207    pub fn as_str(&self) -> &'static str {
208        match self {
209            MesgCount::NumPerFile => "num_per_file",
210            MesgCount::MaxPerFile => "max_per_file",
211            MesgCount::MaxPerFileType => "max_per_file_type",
212        }
213    }
214
215    /// Try to construct from the underlying numeric value.
216    pub fn from_value(value: u8) -> Option<Self> {
217        match value {
218            0 => Some(MesgCount::NumPerFile),
219            1 => Some(MesgCount::MaxPerFile),
220            2 => Some(MesgCount::MaxPerFileType),
221            _ => None,
222        }
223    }
224
225    /// Try to construct from the snake-case canonical name.
226    pub fn from_str(name: &str) -> Option<Self> {
227        match name {
228            "num_per_file" => Some(MesgCount::NumPerFile),
229            "max_per_file" => Some(MesgCount::MaxPerFile),
230            "max_per_file_type" => Some(MesgCount::MaxPerFileType),
231            _ => None,
232        }
233    }
234}
235
236#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
237#[repr(u32)]
238#[non_exhaustive]
239pub enum DateTime {
240    Min = 268435456,
241}
242
243impl DateTime {
244    /// Snake-case canonical name from Profile.xlsx.
245    pub fn as_str(&self) -> &'static str {
246        match self {
247            DateTime::Min => "min",
248        }
249    }
250
251    /// Try to construct from the underlying numeric value.
252    pub fn from_value(value: u32) -> Option<Self> {
253        match value {
254            268435456 => Some(DateTime::Min),
255            _ => None,
256        }
257    }
258
259    /// Try to construct from the snake-case canonical name.
260    pub fn from_str(name: &str) -> Option<Self> {
261        match name {
262            "min" => Some(DateTime::Min),
263            _ => None,
264        }
265    }
266}
267
268#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
269#[repr(u32)]
270#[non_exhaustive]
271pub enum LocalDateTime {
272    Min = 268435456,
273}
274
275impl LocalDateTime {
276    /// Snake-case canonical name from Profile.xlsx.
277    pub fn as_str(&self) -> &'static str {
278        match self {
279            LocalDateTime::Min => "min",
280        }
281    }
282
283    /// Try to construct from the underlying numeric value.
284    pub fn from_value(value: u32) -> Option<Self> {
285        match value {
286            268435456 => Some(LocalDateTime::Min),
287            _ => None,
288        }
289    }
290
291    /// Try to construct from the snake-case canonical name.
292    pub fn from_str(name: &str) -> Option<Self> {
293        match name {
294            "min" => Some(LocalDateTime::Min),
295            _ => None,
296        }
297    }
298}
299
300#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
301#[repr(u16)]
302#[non_exhaustive]
303pub enum MessageIndex {
304    Selected = 32768,
305    Reserved = 28672,
306    Mask = 4095,
307}
308
309impl MessageIndex {
310    /// Snake-case canonical name from Profile.xlsx.
311    pub fn as_str(&self) -> &'static str {
312        match self {
313            MessageIndex::Selected => "selected",
314            MessageIndex::Reserved => "reserved",
315            MessageIndex::Mask => "mask",
316        }
317    }
318
319    /// Try to construct from the underlying numeric value.
320    pub fn from_value(value: u16) -> Option<Self> {
321        match value {
322            32768 => Some(MessageIndex::Selected),
323            28672 => Some(MessageIndex::Reserved),
324            4095 => Some(MessageIndex::Mask),
325            _ => None,
326        }
327    }
328
329    /// Try to construct from the snake-case canonical name.
330    pub fn from_str(name: &str) -> Option<Self> {
331        match name {
332            "selected" => Some(MessageIndex::Selected),
333            "reserved" => Some(MessageIndex::Reserved),
334            "mask" => Some(MessageIndex::Mask),
335            _ => None,
336        }
337    }
338}
339
340#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
341#[repr(u8)]
342#[non_exhaustive]
343pub enum DeviceIndex {
344    Creator = 0,
345}
346
347impl DeviceIndex {
348    /// Snake-case canonical name from Profile.xlsx.
349    pub fn as_str(&self) -> &'static str {
350        match self {
351            DeviceIndex::Creator => "creator",
352        }
353    }
354
355    /// Try to construct from the underlying numeric value.
356    pub fn from_value(value: u8) -> Option<Self> {
357        match value {
358            0 => Some(DeviceIndex::Creator),
359            _ => None,
360        }
361    }
362
363    /// Try to construct from the snake-case canonical name.
364    pub fn from_str(name: &str) -> Option<Self> {
365        match name {
366            "creator" => Some(DeviceIndex::Creator),
367            _ => None,
368        }
369    }
370}
371
372#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
373#[repr(u8)]
374#[non_exhaustive]
375pub enum Gender {
376    Female = 0,
377    Male = 1,
378}
379
380impl Gender {
381    /// Snake-case canonical name from Profile.xlsx.
382    pub fn as_str(&self) -> &'static str {
383        match self {
384            Gender::Female => "female",
385            Gender::Male => "male",
386        }
387    }
388
389    /// Try to construct from the underlying numeric value.
390    pub fn from_value(value: u8) -> Option<Self> {
391        match value {
392            0 => Some(Gender::Female),
393            1 => Some(Gender::Male),
394            _ => None,
395        }
396    }
397
398    /// Try to construct from the snake-case canonical name.
399    pub fn from_str(name: &str) -> Option<Self> {
400        match name {
401            "female" => Some(Gender::Female),
402            "male" => Some(Gender::Male),
403            _ => None,
404        }
405    }
406}
407
408#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
409#[repr(u8)]
410#[non_exhaustive]
411pub enum Language {
412    English = 0,
413    French = 1,
414    Italian = 2,
415    German = 3,
416    Spanish = 4,
417    Croatian = 5,
418    Czech = 6,
419    Danish = 7,
420    Dutch = 8,
421    Finnish = 9,
422    Greek = 10,
423    Hungarian = 11,
424    Norwegian = 12,
425    Polish = 13,
426    Portuguese = 14,
427    Slovakian = 15,
428    Slovenian = 16,
429    Swedish = 17,
430    Russian = 18,
431    Turkish = 19,
432    Latvian = 20,
433    Ukrainian = 21,
434    Arabic = 22,
435    Farsi = 23,
436    Bulgarian = 24,
437    Romanian = 25,
438    Chinese = 26,
439    Japanese = 27,
440    Korean = 28,
441    Taiwanese = 29,
442    Thai = 30,
443    Hebrew = 31,
444    BrazilianPortuguese = 32,
445    Indonesian = 33,
446    Malaysian = 34,
447    Vietnamese = 35,
448    Burmese = 36,
449    Mongolian = 37,
450    Custom = 254,
451}
452
453impl Language {
454    /// Snake-case canonical name from Profile.xlsx.
455    pub fn as_str(&self) -> &'static str {
456        match self {
457            Language::English => "english",
458            Language::French => "french",
459            Language::Italian => "italian",
460            Language::German => "german",
461            Language::Spanish => "spanish",
462            Language::Croatian => "croatian",
463            Language::Czech => "czech",
464            Language::Danish => "danish",
465            Language::Dutch => "dutch",
466            Language::Finnish => "finnish",
467            Language::Greek => "greek",
468            Language::Hungarian => "hungarian",
469            Language::Norwegian => "norwegian",
470            Language::Polish => "polish",
471            Language::Portuguese => "portuguese",
472            Language::Slovakian => "slovakian",
473            Language::Slovenian => "slovenian",
474            Language::Swedish => "swedish",
475            Language::Russian => "russian",
476            Language::Turkish => "turkish",
477            Language::Latvian => "latvian",
478            Language::Ukrainian => "ukrainian",
479            Language::Arabic => "arabic",
480            Language::Farsi => "farsi",
481            Language::Bulgarian => "bulgarian",
482            Language::Romanian => "romanian",
483            Language::Chinese => "chinese",
484            Language::Japanese => "japanese",
485            Language::Korean => "korean",
486            Language::Taiwanese => "taiwanese",
487            Language::Thai => "thai",
488            Language::Hebrew => "hebrew",
489            Language::BrazilianPortuguese => "brazilian_portuguese",
490            Language::Indonesian => "indonesian",
491            Language::Malaysian => "malaysian",
492            Language::Vietnamese => "vietnamese",
493            Language::Burmese => "burmese",
494            Language::Mongolian => "mongolian",
495            Language::Custom => "custom",
496        }
497    }
498
499    /// Try to construct from the underlying numeric value.
500    pub fn from_value(value: u8) -> Option<Self> {
501        match value {
502            0 => Some(Language::English),
503            1 => Some(Language::French),
504            2 => Some(Language::Italian),
505            3 => Some(Language::German),
506            4 => Some(Language::Spanish),
507            5 => Some(Language::Croatian),
508            6 => Some(Language::Czech),
509            7 => Some(Language::Danish),
510            8 => Some(Language::Dutch),
511            9 => Some(Language::Finnish),
512            10 => Some(Language::Greek),
513            11 => Some(Language::Hungarian),
514            12 => Some(Language::Norwegian),
515            13 => Some(Language::Polish),
516            14 => Some(Language::Portuguese),
517            15 => Some(Language::Slovakian),
518            16 => Some(Language::Slovenian),
519            17 => Some(Language::Swedish),
520            18 => Some(Language::Russian),
521            19 => Some(Language::Turkish),
522            20 => Some(Language::Latvian),
523            21 => Some(Language::Ukrainian),
524            22 => Some(Language::Arabic),
525            23 => Some(Language::Farsi),
526            24 => Some(Language::Bulgarian),
527            25 => Some(Language::Romanian),
528            26 => Some(Language::Chinese),
529            27 => Some(Language::Japanese),
530            28 => Some(Language::Korean),
531            29 => Some(Language::Taiwanese),
532            30 => Some(Language::Thai),
533            31 => Some(Language::Hebrew),
534            32 => Some(Language::BrazilianPortuguese),
535            33 => Some(Language::Indonesian),
536            34 => Some(Language::Malaysian),
537            35 => Some(Language::Vietnamese),
538            36 => Some(Language::Burmese),
539            37 => Some(Language::Mongolian),
540            254 => Some(Language::Custom),
541            _ => None,
542        }
543    }
544
545    /// Try to construct from the snake-case canonical name.
546    pub fn from_str(name: &str) -> Option<Self> {
547        match name {
548            "english" => Some(Language::English),
549            "french" => Some(Language::French),
550            "italian" => Some(Language::Italian),
551            "german" => Some(Language::German),
552            "spanish" => Some(Language::Spanish),
553            "croatian" => Some(Language::Croatian),
554            "czech" => Some(Language::Czech),
555            "danish" => Some(Language::Danish),
556            "dutch" => Some(Language::Dutch),
557            "finnish" => Some(Language::Finnish),
558            "greek" => Some(Language::Greek),
559            "hungarian" => Some(Language::Hungarian),
560            "norwegian" => Some(Language::Norwegian),
561            "polish" => Some(Language::Polish),
562            "portuguese" => Some(Language::Portuguese),
563            "slovakian" => Some(Language::Slovakian),
564            "slovenian" => Some(Language::Slovenian),
565            "swedish" => Some(Language::Swedish),
566            "russian" => Some(Language::Russian),
567            "turkish" => Some(Language::Turkish),
568            "latvian" => Some(Language::Latvian),
569            "ukrainian" => Some(Language::Ukrainian),
570            "arabic" => Some(Language::Arabic),
571            "farsi" => Some(Language::Farsi),
572            "bulgarian" => Some(Language::Bulgarian),
573            "romanian" => Some(Language::Romanian),
574            "chinese" => Some(Language::Chinese),
575            "japanese" => Some(Language::Japanese),
576            "korean" => Some(Language::Korean),
577            "taiwanese" => Some(Language::Taiwanese),
578            "thai" => Some(Language::Thai),
579            "hebrew" => Some(Language::Hebrew),
580            "brazilian_portuguese" => Some(Language::BrazilianPortuguese),
581            "indonesian" => Some(Language::Indonesian),
582            "malaysian" => Some(Language::Malaysian),
583            "vietnamese" => Some(Language::Vietnamese),
584            "burmese" => Some(Language::Burmese),
585            "mongolian" => Some(Language::Mongolian),
586            "custom" => Some(Language::Custom),
587            _ => None,
588        }
589    }
590}
591
592#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
593#[repr(u8)]
594#[non_exhaustive]
595pub enum LanguageBits0 {
596    English = 1,
597    French = 2,
598    Italian = 4,
599    German = 8,
600    Spanish = 16,
601    Croatian = 32,
602    Czech = 64,
603    Danish = 128,
604}
605
606impl LanguageBits0 {
607    /// Snake-case canonical name from Profile.xlsx.
608    pub fn as_str(&self) -> &'static str {
609        match self {
610            LanguageBits0::English => "english",
611            LanguageBits0::French => "french",
612            LanguageBits0::Italian => "italian",
613            LanguageBits0::German => "german",
614            LanguageBits0::Spanish => "spanish",
615            LanguageBits0::Croatian => "croatian",
616            LanguageBits0::Czech => "czech",
617            LanguageBits0::Danish => "danish",
618        }
619    }
620
621    /// Try to construct from the underlying numeric value.
622    pub fn from_value(value: u8) -> Option<Self> {
623        match value {
624            1 => Some(LanguageBits0::English),
625            2 => Some(LanguageBits0::French),
626            4 => Some(LanguageBits0::Italian),
627            8 => Some(LanguageBits0::German),
628            16 => Some(LanguageBits0::Spanish),
629            32 => Some(LanguageBits0::Croatian),
630            64 => Some(LanguageBits0::Czech),
631            128 => Some(LanguageBits0::Danish),
632            _ => None,
633        }
634    }
635
636    /// Try to construct from the snake-case canonical name.
637    pub fn from_str(name: &str) -> Option<Self> {
638        match name {
639            "english" => Some(LanguageBits0::English),
640            "french" => Some(LanguageBits0::French),
641            "italian" => Some(LanguageBits0::Italian),
642            "german" => Some(LanguageBits0::German),
643            "spanish" => Some(LanguageBits0::Spanish),
644            "croatian" => Some(LanguageBits0::Croatian),
645            "czech" => Some(LanguageBits0::Czech),
646            "danish" => Some(LanguageBits0::Danish),
647            _ => None,
648        }
649    }
650}
651
652#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
653#[repr(u8)]
654#[non_exhaustive]
655pub enum LanguageBits1 {
656    Dutch = 1,
657    Finnish = 2,
658    Greek = 4,
659    Hungarian = 8,
660    Norwegian = 16,
661    Polish = 32,
662    Portuguese = 64,
663    Slovakian = 128,
664}
665
666impl LanguageBits1 {
667    /// Snake-case canonical name from Profile.xlsx.
668    pub fn as_str(&self) -> &'static str {
669        match self {
670            LanguageBits1::Dutch => "dutch",
671            LanguageBits1::Finnish => "finnish",
672            LanguageBits1::Greek => "greek",
673            LanguageBits1::Hungarian => "hungarian",
674            LanguageBits1::Norwegian => "norwegian",
675            LanguageBits1::Polish => "polish",
676            LanguageBits1::Portuguese => "portuguese",
677            LanguageBits1::Slovakian => "slovakian",
678        }
679    }
680
681    /// Try to construct from the underlying numeric value.
682    pub fn from_value(value: u8) -> Option<Self> {
683        match value {
684            1 => Some(LanguageBits1::Dutch),
685            2 => Some(LanguageBits1::Finnish),
686            4 => Some(LanguageBits1::Greek),
687            8 => Some(LanguageBits1::Hungarian),
688            16 => Some(LanguageBits1::Norwegian),
689            32 => Some(LanguageBits1::Polish),
690            64 => Some(LanguageBits1::Portuguese),
691            128 => Some(LanguageBits1::Slovakian),
692            _ => None,
693        }
694    }
695
696    /// Try to construct from the snake-case canonical name.
697    pub fn from_str(name: &str) -> Option<Self> {
698        match name {
699            "dutch" => Some(LanguageBits1::Dutch),
700            "finnish" => Some(LanguageBits1::Finnish),
701            "greek" => Some(LanguageBits1::Greek),
702            "hungarian" => Some(LanguageBits1::Hungarian),
703            "norwegian" => Some(LanguageBits1::Norwegian),
704            "polish" => Some(LanguageBits1::Polish),
705            "portuguese" => Some(LanguageBits1::Portuguese),
706            "slovakian" => Some(LanguageBits1::Slovakian),
707            _ => None,
708        }
709    }
710}
711
712#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
713#[repr(u8)]
714#[non_exhaustive]
715pub enum LanguageBits2 {
716    Slovenian = 1,
717    Swedish = 2,
718    Russian = 4,
719    Turkish = 8,
720    Latvian = 16,
721    Ukrainian = 32,
722    Arabic = 64,
723    Farsi = 128,
724}
725
726impl LanguageBits2 {
727    /// Snake-case canonical name from Profile.xlsx.
728    pub fn as_str(&self) -> &'static str {
729        match self {
730            LanguageBits2::Slovenian => "slovenian",
731            LanguageBits2::Swedish => "swedish",
732            LanguageBits2::Russian => "russian",
733            LanguageBits2::Turkish => "turkish",
734            LanguageBits2::Latvian => "latvian",
735            LanguageBits2::Ukrainian => "ukrainian",
736            LanguageBits2::Arabic => "arabic",
737            LanguageBits2::Farsi => "farsi",
738        }
739    }
740
741    /// Try to construct from the underlying numeric value.
742    pub fn from_value(value: u8) -> Option<Self> {
743        match value {
744            1 => Some(LanguageBits2::Slovenian),
745            2 => Some(LanguageBits2::Swedish),
746            4 => Some(LanguageBits2::Russian),
747            8 => Some(LanguageBits2::Turkish),
748            16 => Some(LanguageBits2::Latvian),
749            32 => Some(LanguageBits2::Ukrainian),
750            64 => Some(LanguageBits2::Arabic),
751            128 => Some(LanguageBits2::Farsi),
752            _ => None,
753        }
754    }
755
756    /// Try to construct from the snake-case canonical name.
757    pub fn from_str(name: &str) -> Option<Self> {
758        match name {
759            "slovenian" => Some(LanguageBits2::Slovenian),
760            "swedish" => Some(LanguageBits2::Swedish),
761            "russian" => Some(LanguageBits2::Russian),
762            "turkish" => Some(LanguageBits2::Turkish),
763            "latvian" => Some(LanguageBits2::Latvian),
764            "ukrainian" => Some(LanguageBits2::Ukrainian),
765            "arabic" => Some(LanguageBits2::Arabic),
766            "farsi" => Some(LanguageBits2::Farsi),
767            _ => None,
768        }
769    }
770}
771
772#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
773#[repr(u8)]
774#[non_exhaustive]
775pub enum LanguageBits3 {
776    Bulgarian = 1,
777    Romanian = 2,
778    Chinese = 4,
779    Japanese = 8,
780    Korean = 16,
781    Taiwanese = 32,
782    Thai = 64,
783    Hebrew = 128,
784}
785
786impl LanguageBits3 {
787    /// Snake-case canonical name from Profile.xlsx.
788    pub fn as_str(&self) -> &'static str {
789        match self {
790            LanguageBits3::Bulgarian => "bulgarian",
791            LanguageBits3::Romanian => "romanian",
792            LanguageBits3::Chinese => "chinese",
793            LanguageBits3::Japanese => "japanese",
794            LanguageBits3::Korean => "korean",
795            LanguageBits3::Taiwanese => "taiwanese",
796            LanguageBits3::Thai => "thai",
797            LanguageBits3::Hebrew => "hebrew",
798        }
799    }
800
801    /// Try to construct from the underlying numeric value.
802    pub fn from_value(value: u8) -> Option<Self> {
803        match value {
804            1 => Some(LanguageBits3::Bulgarian),
805            2 => Some(LanguageBits3::Romanian),
806            4 => Some(LanguageBits3::Chinese),
807            8 => Some(LanguageBits3::Japanese),
808            16 => Some(LanguageBits3::Korean),
809            32 => Some(LanguageBits3::Taiwanese),
810            64 => Some(LanguageBits3::Thai),
811            128 => Some(LanguageBits3::Hebrew),
812            _ => None,
813        }
814    }
815
816    /// Try to construct from the snake-case canonical name.
817    pub fn from_str(name: &str) -> Option<Self> {
818        match name {
819            "bulgarian" => Some(LanguageBits3::Bulgarian),
820            "romanian" => Some(LanguageBits3::Romanian),
821            "chinese" => Some(LanguageBits3::Chinese),
822            "japanese" => Some(LanguageBits3::Japanese),
823            "korean" => Some(LanguageBits3::Korean),
824            "taiwanese" => Some(LanguageBits3::Taiwanese),
825            "thai" => Some(LanguageBits3::Thai),
826            "hebrew" => Some(LanguageBits3::Hebrew),
827            _ => None,
828        }
829    }
830}
831
832#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
833#[repr(u8)]
834#[non_exhaustive]
835pub enum LanguageBits4 {
836    BrazilianPortuguese = 1,
837    Indonesian = 2,
838    Malaysian = 4,
839    Vietnamese = 8,
840    Burmese = 16,
841    Mongolian = 32,
842}
843
844impl LanguageBits4 {
845    /// Snake-case canonical name from Profile.xlsx.
846    pub fn as_str(&self) -> &'static str {
847        match self {
848            LanguageBits4::BrazilianPortuguese => "brazilian_portuguese",
849            LanguageBits4::Indonesian => "indonesian",
850            LanguageBits4::Malaysian => "malaysian",
851            LanguageBits4::Vietnamese => "vietnamese",
852            LanguageBits4::Burmese => "burmese",
853            LanguageBits4::Mongolian => "mongolian",
854        }
855    }
856
857    /// Try to construct from the underlying numeric value.
858    pub fn from_value(value: u8) -> Option<Self> {
859        match value {
860            1 => Some(LanguageBits4::BrazilianPortuguese),
861            2 => Some(LanguageBits4::Indonesian),
862            4 => Some(LanguageBits4::Malaysian),
863            8 => Some(LanguageBits4::Vietnamese),
864            16 => Some(LanguageBits4::Burmese),
865            32 => Some(LanguageBits4::Mongolian),
866            _ => None,
867        }
868    }
869
870    /// Try to construct from the snake-case canonical name.
871    pub fn from_str(name: &str) -> Option<Self> {
872        match name {
873            "brazilian_portuguese" => Some(LanguageBits4::BrazilianPortuguese),
874            "indonesian" => Some(LanguageBits4::Indonesian),
875            "malaysian" => Some(LanguageBits4::Malaysian),
876            "vietnamese" => Some(LanguageBits4::Vietnamese),
877            "burmese" => Some(LanguageBits4::Burmese),
878            "mongolian" => Some(LanguageBits4::Mongolian),
879            _ => None,
880        }
881    }
882}
883
884#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
885#[repr(u8)]
886#[non_exhaustive]
887pub enum TimeZone {
888    Almaty = 0,
889    Bangkok = 1,
890    Bombay = 2,
891    Brasilia = 3,
892    Cairo = 4,
893    CapeVerdeIs = 5,
894    Darwin = 6,
895    Eniwetok = 7,
896    Fiji = 8,
897    HongKong = 9,
898    Islamabad = 10,
899    Kabul = 11,
900    Magadan = 12,
901    MidAtlantic = 13,
902    Moscow = 14,
903    Muscat = 15,
904    Newfoundland = 16,
905    Samoa = 17,
906    Sydney = 18,
907    Tehran = 19,
908    Tokyo = 20,
909    UsAlaska = 21,
910    UsAtlantic = 22,
911    UsCentral = 23,
912    UsEastern = 24,
913    UsHawaii = 25,
914    UsMountain = 26,
915    UsPacific = 27,
916    Other = 28,
917    Auckland = 29,
918    Kathmandu = 30,
919    EuropeWesternWet = 31,
920    EuropeCentralCet = 32,
921    EuropeEasternEet = 33,
922    Jakarta = 34,
923    Perth = 35,
924    Adelaide = 36,
925    Brisbane = 37,
926    Tasmania = 38,
927    Iceland = 39,
928    Amsterdam = 40,
929    Athens = 41,
930    Barcelona = 42,
931    Berlin = 43,
932    Brussels = 44,
933    Budapest = 45,
934    Copenhagen = 46,
935    Dublin = 47,
936    Helsinki = 48,
937    Lisbon = 49,
938    London = 50,
939    Madrid = 51,
940    Munich = 52,
941    Oslo = 53,
942    Paris = 54,
943    Prague = 55,
944    Reykjavik = 56,
945    Rome = 57,
946    Stockholm = 58,
947    Vienna = 59,
948    Warsaw = 60,
949    Zurich = 61,
950    Quebec = 62,
951    Ontario = 63,
952    Manitoba = 64,
953    Saskatchewan = 65,
954    Alberta = 66,
955    BritishColumbia = 67,
956    Boise = 68,
957    Boston = 69,
958    Chicago = 70,
959    Dallas = 71,
960    Denver = 72,
961    KansasCity = 73,
962    LasVegas = 74,
963    LosAngeles = 75,
964    Miami = 76,
965    Minneapolis = 77,
966    NewYork = 78,
967    NewOrleans = 79,
968    Phoenix = 80,
969    SantaFe = 81,
970    Seattle = 82,
971    WashingtonDc = 83,
972    UsArizona = 84,
973    Chita = 85,
974    Ekaterinburg = 86,
975    Irkutsk = 87,
976    Kaliningrad = 88,
977    Krasnoyarsk = 89,
978    Novosibirsk = 90,
979    PetropavlovskKamchatskiy = 91,
980    Samara = 92,
981    Vladivostok = 93,
982    MexicoCentral = 94,
983    MexicoMountain = 95,
984    MexicoPacific = 96,
985    CapeTown = 97,
986    Winkhoek = 98,
987    Lagos = 99,
988    Riyahd = 100,
989    Venezuela = 101,
990    AustraliaLh = 102,
991    Santiago = 103,
992    Manual = 253,
993    Automatic = 254,
994}
995
996impl TimeZone {
997    /// Snake-case canonical name from Profile.xlsx.
998    pub fn as_str(&self) -> &'static str {
999        match self {
1000            TimeZone::Almaty => "almaty",
1001            TimeZone::Bangkok => "bangkok",
1002            TimeZone::Bombay => "bombay",
1003            TimeZone::Brasilia => "brasilia",
1004            TimeZone::Cairo => "cairo",
1005            TimeZone::CapeVerdeIs => "cape_verde_is",
1006            TimeZone::Darwin => "darwin",
1007            TimeZone::Eniwetok => "eniwetok",
1008            TimeZone::Fiji => "fiji",
1009            TimeZone::HongKong => "hong_kong",
1010            TimeZone::Islamabad => "islamabad",
1011            TimeZone::Kabul => "kabul",
1012            TimeZone::Magadan => "magadan",
1013            TimeZone::MidAtlantic => "mid_atlantic",
1014            TimeZone::Moscow => "moscow",
1015            TimeZone::Muscat => "muscat",
1016            TimeZone::Newfoundland => "newfoundland",
1017            TimeZone::Samoa => "samoa",
1018            TimeZone::Sydney => "sydney",
1019            TimeZone::Tehran => "tehran",
1020            TimeZone::Tokyo => "tokyo",
1021            TimeZone::UsAlaska => "us_alaska",
1022            TimeZone::UsAtlantic => "us_atlantic",
1023            TimeZone::UsCentral => "us_central",
1024            TimeZone::UsEastern => "us_eastern",
1025            TimeZone::UsHawaii => "us_hawaii",
1026            TimeZone::UsMountain => "us_mountain",
1027            TimeZone::UsPacific => "us_pacific",
1028            TimeZone::Other => "other",
1029            TimeZone::Auckland => "auckland",
1030            TimeZone::Kathmandu => "kathmandu",
1031            TimeZone::EuropeWesternWet => "europe_western_wet",
1032            TimeZone::EuropeCentralCet => "europe_central_cet",
1033            TimeZone::EuropeEasternEet => "europe_eastern_eet",
1034            TimeZone::Jakarta => "jakarta",
1035            TimeZone::Perth => "perth",
1036            TimeZone::Adelaide => "adelaide",
1037            TimeZone::Brisbane => "brisbane",
1038            TimeZone::Tasmania => "tasmania",
1039            TimeZone::Iceland => "iceland",
1040            TimeZone::Amsterdam => "amsterdam",
1041            TimeZone::Athens => "athens",
1042            TimeZone::Barcelona => "barcelona",
1043            TimeZone::Berlin => "berlin",
1044            TimeZone::Brussels => "brussels",
1045            TimeZone::Budapest => "budapest",
1046            TimeZone::Copenhagen => "copenhagen",
1047            TimeZone::Dublin => "dublin",
1048            TimeZone::Helsinki => "helsinki",
1049            TimeZone::Lisbon => "lisbon",
1050            TimeZone::London => "london",
1051            TimeZone::Madrid => "madrid",
1052            TimeZone::Munich => "munich",
1053            TimeZone::Oslo => "oslo",
1054            TimeZone::Paris => "paris",
1055            TimeZone::Prague => "prague",
1056            TimeZone::Reykjavik => "reykjavik",
1057            TimeZone::Rome => "rome",
1058            TimeZone::Stockholm => "stockholm",
1059            TimeZone::Vienna => "vienna",
1060            TimeZone::Warsaw => "warsaw",
1061            TimeZone::Zurich => "zurich",
1062            TimeZone::Quebec => "quebec",
1063            TimeZone::Ontario => "ontario",
1064            TimeZone::Manitoba => "manitoba",
1065            TimeZone::Saskatchewan => "saskatchewan",
1066            TimeZone::Alberta => "alberta",
1067            TimeZone::BritishColumbia => "british_columbia",
1068            TimeZone::Boise => "boise",
1069            TimeZone::Boston => "boston",
1070            TimeZone::Chicago => "chicago",
1071            TimeZone::Dallas => "dallas",
1072            TimeZone::Denver => "denver",
1073            TimeZone::KansasCity => "kansas_city",
1074            TimeZone::LasVegas => "las_vegas",
1075            TimeZone::LosAngeles => "los_angeles",
1076            TimeZone::Miami => "miami",
1077            TimeZone::Minneapolis => "minneapolis",
1078            TimeZone::NewYork => "new_york",
1079            TimeZone::NewOrleans => "new_orleans",
1080            TimeZone::Phoenix => "phoenix",
1081            TimeZone::SantaFe => "santa_fe",
1082            TimeZone::Seattle => "seattle",
1083            TimeZone::WashingtonDc => "washington_dc",
1084            TimeZone::UsArizona => "us_arizona",
1085            TimeZone::Chita => "chita",
1086            TimeZone::Ekaterinburg => "ekaterinburg",
1087            TimeZone::Irkutsk => "irkutsk",
1088            TimeZone::Kaliningrad => "kaliningrad",
1089            TimeZone::Krasnoyarsk => "krasnoyarsk",
1090            TimeZone::Novosibirsk => "novosibirsk",
1091            TimeZone::PetropavlovskKamchatskiy => "petropavlovsk_kamchatskiy",
1092            TimeZone::Samara => "samara",
1093            TimeZone::Vladivostok => "vladivostok",
1094            TimeZone::MexicoCentral => "mexico_central",
1095            TimeZone::MexicoMountain => "mexico_mountain",
1096            TimeZone::MexicoPacific => "mexico_pacific",
1097            TimeZone::CapeTown => "cape_town",
1098            TimeZone::Winkhoek => "winkhoek",
1099            TimeZone::Lagos => "lagos",
1100            TimeZone::Riyahd => "riyahd",
1101            TimeZone::Venezuela => "venezuela",
1102            TimeZone::AustraliaLh => "australia_lh",
1103            TimeZone::Santiago => "santiago",
1104            TimeZone::Manual => "manual",
1105            TimeZone::Automatic => "automatic",
1106        }
1107    }
1108
1109    /// Try to construct from the underlying numeric value.
1110    pub fn from_value(value: u8) -> Option<Self> {
1111        match value {
1112            0 => Some(TimeZone::Almaty),
1113            1 => Some(TimeZone::Bangkok),
1114            2 => Some(TimeZone::Bombay),
1115            3 => Some(TimeZone::Brasilia),
1116            4 => Some(TimeZone::Cairo),
1117            5 => Some(TimeZone::CapeVerdeIs),
1118            6 => Some(TimeZone::Darwin),
1119            7 => Some(TimeZone::Eniwetok),
1120            8 => Some(TimeZone::Fiji),
1121            9 => Some(TimeZone::HongKong),
1122            10 => Some(TimeZone::Islamabad),
1123            11 => Some(TimeZone::Kabul),
1124            12 => Some(TimeZone::Magadan),
1125            13 => Some(TimeZone::MidAtlantic),
1126            14 => Some(TimeZone::Moscow),
1127            15 => Some(TimeZone::Muscat),
1128            16 => Some(TimeZone::Newfoundland),
1129            17 => Some(TimeZone::Samoa),
1130            18 => Some(TimeZone::Sydney),
1131            19 => Some(TimeZone::Tehran),
1132            20 => Some(TimeZone::Tokyo),
1133            21 => Some(TimeZone::UsAlaska),
1134            22 => Some(TimeZone::UsAtlantic),
1135            23 => Some(TimeZone::UsCentral),
1136            24 => Some(TimeZone::UsEastern),
1137            25 => Some(TimeZone::UsHawaii),
1138            26 => Some(TimeZone::UsMountain),
1139            27 => Some(TimeZone::UsPacific),
1140            28 => Some(TimeZone::Other),
1141            29 => Some(TimeZone::Auckland),
1142            30 => Some(TimeZone::Kathmandu),
1143            31 => Some(TimeZone::EuropeWesternWet),
1144            32 => Some(TimeZone::EuropeCentralCet),
1145            33 => Some(TimeZone::EuropeEasternEet),
1146            34 => Some(TimeZone::Jakarta),
1147            35 => Some(TimeZone::Perth),
1148            36 => Some(TimeZone::Adelaide),
1149            37 => Some(TimeZone::Brisbane),
1150            38 => Some(TimeZone::Tasmania),
1151            39 => Some(TimeZone::Iceland),
1152            40 => Some(TimeZone::Amsterdam),
1153            41 => Some(TimeZone::Athens),
1154            42 => Some(TimeZone::Barcelona),
1155            43 => Some(TimeZone::Berlin),
1156            44 => Some(TimeZone::Brussels),
1157            45 => Some(TimeZone::Budapest),
1158            46 => Some(TimeZone::Copenhagen),
1159            47 => Some(TimeZone::Dublin),
1160            48 => Some(TimeZone::Helsinki),
1161            49 => Some(TimeZone::Lisbon),
1162            50 => Some(TimeZone::London),
1163            51 => Some(TimeZone::Madrid),
1164            52 => Some(TimeZone::Munich),
1165            53 => Some(TimeZone::Oslo),
1166            54 => Some(TimeZone::Paris),
1167            55 => Some(TimeZone::Prague),
1168            56 => Some(TimeZone::Reykjavik),
1169            57 => Some(TimeZone::Rome),
1170            58 => Some(TimeZone::Stockholm),
1171            59 => Some(TimeZone::Vienna),
1172            60 => Some(TimeZone::Warsaw),
1173            61 => Some(TimeZone::Zurich),
1174            62 => Some(TimeZone::Quebec),
1175            63 => Some(TimeZone::Ontario),
1176            64 => Some(TimeZone::Manitoba),
1177            65 => Some(TimeZone::Saskatchewan),
1178            66 => Some(TimeZone::Alberta),
1179            67 => Some(TimeZone::BritishColumbia),
1180            68 => Some(TimeZone::Boise),
1181            69 => Some(TimeZone::Boston),
1182            70 => Some(TimeZone::Chicago),
1183            71 => Some(TimeZone::Dallas),
1184            72 => Some(TimeZone::Denver),
1185            73 => Some(TimeZone::KansasCity),
1186            74 => Some(TimeZone::LasVegas),
1187            75 => Some(TimeZone::LosAngeles),
1188            76 => Some(TimeZone::Miami),
1189            77 => Some(TimeZone::Minneapolis),
1190            78 => Some(TimeZone::NewYork),
1191            79 => Some(TimeZone::NewOrleans),
1192            80 => Some(TimeZone::Phoenix),
1193            81 => Some(TimeZone::SantaFe),
1194            82 => Some(TimeZone::Seattle),
1195            83 => Some(TimeZone::WashingtonDc),
1196            84 => Some(TimeZone::UsArizona),
1197            85 => Some(TimeZone::Chita),
1198            86 => Some(TimeZone::Ekaterinburg),
1199            87 => Some(TimeZone::Irkutsk),
1200            88 => Some(TimeZone::Kaliningrad),
1201            89 => Some(TimeZone::Krasnoyarsk),
1202            90 => Some(TimeZone::Novosibirsk),
1203            91 => Some(TimeZone::PetropavlovskKamchatskiy),
1204            92 => Some(TimeZone::Samara),
1205            93 => Some(TimeZone::Vladivostok),
1206            94 => Some(TimeZone::MexicoCentral),
1207            95 => Some(TimeZone::MexicoMountain),
1208            96 => Some(TimeZone::MexicoPacific),
1209            97 => Some(TimeZone::CapeTown),
1210            98 => Some(TimeZone::Winkhoek),
1211            99 => Some(TimeZone::Lagos),
1212            100 => Some(TimeZone::Riyahd),
1213            101 => Some(TimeZone::Venezuela),
1214            102 => Some(TimeZone::AustraliaLh),
1215            103 => Some(TimeZone::Santiago),
1216            253 => Some(TimeZone::Manual),
1217            254 => Some(TimeZone::Automatic),
1218            _ => None,
1219        }
1220    }
1221
1222    /// Try to construct from the snake-case canonical name.
1223    pub fn from_str(name: &str) -> Option<Self> {
1224        match name {
1225            "almaty" => Some(TimeZone::Almaty),
1226            "bangkok" => Some(TimeZone::Bangkok),
1227            "bombay" => Some(TimeZone::Bombay),
1228            "brasilia" => Some(TimeZone::Brasilia),
1229            "cairo" => Some(TimeZone::Cairo),
1230            "cape_verde_is" => Some(TimeZone::CapeVerdeIs),
1231            "darwin" => Some(TimeZone::Darwin),
1232            "eniwetok" => Some(TimeZone::Eniwetok),
1233            "fiji" => Some(TimeZone::Fiji),
1234            "hong_kong" => Some(TimeZone::HongKong),
1235            "islamabad" => Some(TimeZone::Islamabad),
1236            "kabul" => Some(TimeZone::Kabul),
1237            "magadan" => Some(TimeZone::Magadan),
1238            "mid_atlantic" => Some(TimeZone::MidAtlantic),
1239            "moscow" => Some(TimeZone::Moscow),
1240            "muscat" => Some(TimeZone::Muscat),
1241            "newfoundland" => Some(TimeZone::Newfoundland),
1242            "samoa" => Some(TimeZone::Samoa),
1243            "sydney" => Some(TimeZone::Sydney),
1244            "tehran" => Some(TimeZone::Tehran),
1245            "tokyo" => Some(TimeZone::Tokyo),
1246            "us_alaska" => Some(TimeZone::UsAlaska),
1247            "us_atlantic" => Some(TimeZone::UsAtlantic),
1248            "us_central" => Some(TimeZone::UsCentral),
1249            "us_eastern" => Some(TimeZone::UsEastern),
1250            "us_hawaii" => Some(TimeZone::UsHawaii),
1251            "us_mountain" => Some(TimeZone::UsMountain),
1252            "us_pacific" => Some(TimeZone::UsPacific),
1253            "other" => Some(TimeZone::Other),
1254            "auckland" => Some(TimeZone::Auckland),
1255            "kathmandu" => Some(TimeZone::Kathmandu),
1256            "europe_western_wet" => Some(TimeZone::EuropeWesternWet),
1257            "europe_central_cet" => Some(TimeZone::EuropeCentralCet),
1258            "europe_eastern_eet" => Some(TimeZone::EuropeEasternEet),
1259            "jakarta" => Some(TimeZone::Jakarta),
1260            "perth" => Some(TimeZone::Perth),
1261            "adelaide" => Some(TimeZone::Adelaide),
1262            "brisbane" => Some(TimeZone::Brisbane),
1263            "tasmania" => Some(TimeZone::Tasmania),
1264            "iceland" => Some(TimeZone::Iceland),
1265            "amsterdam" => Some(TimeZone::Amsterdam),
1266            "athens" => Some(TimeZone::Athens),
1267            "barcelona" => Some(TimeZone::Barcelona),
1268            "berlin" => Some(TimeZone::Berlin),
1269            "brussels" => Some(TimeZone::Brussels),
1270            "budapest" => Some(TimeZone::Budapest),
1271            "copenhagen" => Some(TimeZone::Copenhagen),
1272            "dublin" => Some(TimeZone::Dublin),
1273            "helsinki" => Some(TimeZone::Helsinki),
1274            "lisbon" => Some(TimeZone::Lisbon),
1275            "london" => Some(TimeZone::London),
1276            "madrid" => Some(TimeZone::Madrid),
1277            "munich" => Some(TimeZone::Munich),
1278            "oslo" => Some(TimeZone::Oslo),
1279            "paris" => Some(TimeZone::Paris),
1280            "prague" => Some(TimeZone::Prague),
1281            "reykjavik" => Some(TimeZone::Reykjavik),
1282            "rome" => Some(TimeZone::Rome),
1283            "stockholm" => Some(TimeZone::Stockholm),
1284            "vienna" => Some(TimeZone::Vienna),
1285            "warsaw" => Some(TimeZone::Warsaw),
1286            "zurich" => Some(TimeZone::Zurich),
1287            "quebec" => Some(TimeZone::Quebec),
1288            "ontario" => Some(TimeZone::Ontario),
1289            "manitoba" => Some(TimeZone::Manitoba),
1290            "saskatchewan" => Some(TimeZone::Saskatchewan),
1291            "alberta" => Some(TimeZone::Alberta),
1292            "british_columbia" => Some(TimeZone::BritishColumbia),
1293            "boise" => Some(TimeZone::Boise),
1294            "boston" => Some(TimeZone::Boston),
1295            "chicago" => Some(TimeZone::Chicago),
1296            "dallas" => Some(TimeZone::Dallas),
1297            "denver" => Some(TimeZone::Denver),
1298            "kansas_city" => Some(TimeZone::KansasCity),
1299            "las_vegas" => Some(TimeZone::LasVegas),
1300            "los_angeles" => Some(TimeZone::LosAngeles),
1301            "miami" => Some(TimeZone::Miami),
1302            "minneapolis" => Some(TimeZone::Minneapolis),
1303            "new_york" => Some(TimeZone::NewYork),
1304            "new_orleans" => Some(TimeZone::NewOrleans),
1305            "phoenix" => Some(TimeZone::Phoenix),
1306            "santa_fe" => Some(TimeZone::SantaFe),
1307            "seattle" => Some(TimeZone::Seattle),
1308            "washington_dc" => Some(TimeZone::WashingtonDc),
1309            "us_arizona" => Some(TimeZone::UsArizona),
1310            "chita" => Some(TimeZone::Chita),
1311            "ekaterinburg" => Some(TimeZone::Ekaterinburg),
1312            "irkutsk" => Some(TimeZone::Irkutsk),
1313            "kaliningrad" => Some(TimeZone::Kaliningrad),
1314            "krasnoyarsk" => Some(TimeZone::Krasnoyarsk),
1315            "novosibirsk" => Some(TimeZone::Novosibirsk),
1316            "petropavlovsk_kamchatskiy" => Some(TimeZone::PetropavlovskKamchatskiy),
1317            "samara" => Some(TimeZone::Samara),
1318            "vladivostok" => Some(TimeZone::Vladivostok),
1319            "mexico_central" => Some(TimeZone::MexicoCentral),
1320            "mexico_mountain" => Some(TimeZone::MexicoMountain),
1321            "mexico_pacific" => Some(TimeZone::MexicoPacific),
1322            "cape_town" => Some(TimeZone::CapeTown),
1323            "winkhoek" => Some(TimeZone::Winkhoek),
1324            "lagos" => Some(TimeZone::Lagos),
1325            "riyahd" => Some(TimeZone::Riyahd),
1326            "venezuela" => Some(TimeZone::Venezuela),
1327            "australia_lh" => Some(TimeZone::AustraliaLh),
1328            "santiago" => Some(TimeZone::Santiago),
1329            "manual" => Some(TimeZone::Manual),
1330            "automatic" => Some(TimeZone::Automatic),
1331            _ => None,
1332        }
1333    }
1334}
1335
1336#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1337#[repr(u8)]
1338#[non_exhaustive]
1339pub enum DisplayMeasure {
1340    Metric = 0,
1341    Statute = 1,
1342    Nautical = 2,
1343}
1344
1345impl DisplayMeasure {
1346    /// Snake-case canonical name from Profile.xlsx.
1347    pub fn as_str(&self) -> &'static str {
1348        match self {
1349            DisplayMeasure::Metric => "metric",
1350            DisplayMeasure::Statute => "statute",
1351            DisplayMeasure::Nautical => "nautical",
1352        }
1353    }
1354
1355    /// Try to construct from the underlying numeric value.
1356    pub fn from_value(value: u8) -> Option<Self> {
1357        match value {
1358            0 => Some(DisplayMeasure::Metric),
1359            1 => Some(DisplayMeasure::Statute),
1360            2 => Some(DisplayMeasure::Nautical),
1361            _ => None,
1362        }
1363    }
1364
1365    /// Try to construct from the snake-case canonical name.
1366    pub fn from_str(name: &str) -> Option<Self> {
1367        match name {
1368            "metric" => Some(DisplayMeasure::Metric),
1369            "statute" => Some(DisplayMeasure::Statute),
1370            "nautical" => Some(DisplayMeasure::Nautical),
1371            _ => None,
1372        }
1373    }
1374}
1375
1376#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1377#[repr(u8)]
1378#[non_exhaustive]
1379pub enum DisplayHeart {
1380    Bpm = 0,
1381    Max = 1,
1382    Reserve = 2,
1383}
1384
1385impl DisplayHeart {
1386    /// Snake-case canonical name from Profile.xlsx.
1387    pub fn as_str(&self) -> &'static str {
1388        match self {
1389            DisplayHeart::Bpm => "bpm",
1390            DisplayHeart::Max => "max",
1391            DisplayHeart::Reserve => "reserve",
1392        }
1393    }
1394
1395    /// Try to construct from the underlying numeric value.
1396    pub fn from_value(value: u8) -> Option<Self> {
1397        match value {
1398            0 => Some(DisplayHeart::Bpm),
1399            1 => Some(DisplayHeart::Max),
1400            2 => Some(DisplayHeart::Reserve),
1401            _ => None,
1402        }
1403    }
1404
1405    /// Try to construct from the snake-case canonical name.
1406    pub fn from_str(name: &str) -> Option<Self> {
1407        match name {
1408            "bpm" => Some(DisplayHeart::Bpm),
1409            "max" => Some(DisplayHeart::Max),
1410            "reserve" => Some(DisplayHeart::Reserve),
1411            _ => None,
1412        }
1413    }
1414}
1415
1416#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1417#[repr(u8)]
1418#[non_exhaustive]
1419pub enum DisplayPower {
1420    Watts = 0,
1421    PercentFtp = 1,
1422}
1423
1424impl DisplayPower {
1425    /// Snake-case canonical name from Profile.xlsx.
1426    pub fn as_str(&self) -> &'static str {
1427        match self {
1428            DisplayPower::Watts => "watts",
1429            DisplayPower::PercentFtp => "percent_ftp",
1430        }
1431    }
1432
1433    /// Try to construct from the underlying numeric value.
1434    pub fn from_value(value: u8) -> Option<Self> {
1435        match value {
1436            0 => Some(DisplayPower::Watts),
1437            1 => Some(DisplayPower::PercentFtp),
1438            _ => None,
1439        }
1440    }
1441
1442    /// Try to construct from the snake-case canonical name.
1443    pub fn from_str(name: &str) -> Option<Self> {
1444        match name {
1445            "watts" => Some(DisplayPower::Watts),
1446            "percent_ftp" => Some(DisplayPower::PercentFtp),
1447            _ => None,
1448        }
1449    }
1450}
1451
1452#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1453#[repr(u8)]
1454#[non_exhaustive]
1455pub enum DisplayPosition {
1456    Degree = 0,
1457    DegreeMinute = 1,
1458    DegreeMinuteSecond = 2,
1459    AustrianGrid = 3,
1460    BritishGrid = 4,
1461    DutchGrid = 5,
1462    HungarianGrid = 6,
1463    FinnishGrid = 7,
1464    GermanGrid = 8,
1465    IcelandicGrid = 9,
1466    IndonesianEquatorial = 10,
1467    IndonesianIrian = 11,
1468    IndonesianSouthern = 12,
1469    IndiaZone0 = 13,
1470    IndiaZoneIA = 14,
1471    IndiaZoneIB = 15,
1472    IndiaZoneIIA = 16,
1473    IndiaZoneIIB = 17,
1474    IndiaZoneIIIA = 18,
1475    IndiaZoneIIIB = 19,
1476    IndiaZoneIVA = 20,
1477    IndiaZoneIVB = 21,
1478    IrishTransverse = 22,
1479    IrishGrid = 23,
1480    Loran = 24,
1481    MaidenheadGrid = 25,
1482    MgrsGrid = 26,
1483    NewZealandGrid = 27,
1484    NewZealandTransverse = 28,
1485    QatarGrid = 29,
1486    ModifiedSwedishGrid = 30,
1487    SwedishGrid = 31,
1488    SouthAfricanGrid = 32,
1489    SwissGrid = 33,
1490    TaiwanGrid = 34,
1491    UnitedStatesGrid = 35,
1492    UtmUpsGrid = 36,
1493    WestMalayan = 37,
1494    BorneoRso = 38,
1495    EstonianGrid = 39,
1496    LatvianGrid = 40,
1497    SwedishRef99Grid = 41,
1498}
1499
1500impl DisplayPosition {
1501    /// Snake-case canonical name from Profile.xlsx.
1502    pub fn as_str(&self) -> &'static str {
1503        match self {
1504            DisplayPosition::Degree => "degree",
1505            DisplayPosition::DegreeMinute => "degree_minute",
1506            DisplayPosition::DegreeMinuteSecond => "degree_minute_second",
1507            DisplayPosition::AustrianGrid => "austrian_grid",
1508            DisplayPosition::BritishGrid => "british_grid",
1509            DisplayPosition::DutchGrid => "dutch_grid",
1510            DisplayPosition::HungarianGrid => "hungarian_grid",
1511            DisplayPosition::FinnishGrid => "finnish_grid",
1512            DisplayPosition::GermanGrid => "german_grid",
1513            DisplayPosition::IcelandicGrid => "icelandic_grid",
1514            DisplayPosition::IndonesianEquatorial => "indonesian_equatorial",
1515            DisplayPosition::IndonesianIrian => "indonesian_irian",
1516            DisplayPosition::IndonesianSouthern => "indonesian_southern",
1517            DisplayPosition::IndiaZone0 => "india_zone_0",
1518            DisplayPosition::IndiaZoneIA => "india_zone_IA",
1519            DisplayPosition::IndiaZoneIB => "india_zone_IB",
1520            DisplayPosition::IndiaZoneIIA => "india_zone_IIA",
1521            DisplayPosition::IndiaZoneIIB => "india_zone_IIB",
1522            DisplayPosition::IndiaZoneIIIA => "india_zone_IIIA",
1523            DisplayPosition::IndiaZoneIIIB => "india_zone_IIIB",
1524            DisplayPosition::IndiaZoneIVA => "india_zone_IVA",
1525            DisplayPosition::IndiaZoneIVB => "india_zone_IVB",
1526            DisplayPosition::IrishTransverse => "irish_transverse",
1527            DisplayPosition::IrishGrid => "irish_grid",
1528            DisplayPosition::Loran => "loran",
1529            DisplayPosition::MaidenheadGrid => "maidenhead_grid",
1530            DisplayPosition::MgrsGrid => "mgrs_grid",
1531            DisplayPosition::NewZealandGrid => "new_zealand_grid",
1532            DisplayPosition::NewZealandTransverse => "new_zealand_transverse",
1533            DisplayPosition::QatarGrid => "qatar_grid",
1534            DisplayPosition::ModifiedSwedishGrid => "modified_swedish_grid",
1535            DisplayPosition::SwedishGrid => "swedish_grid",
1536            DisplayPosition::SouthAfricanGrid => "south_african_grid",
1537            DisplayPosition::SwissGrid => "swiss_grid",
1538            DisplayPosition::TaiwanGrid => "taiwan_grid",
1539            DisplayPosition::UnitedStatesGrid => "united_states_grid",
1540            DisplayPosition::UtmUpsGrid => "utm_ups_grid",
1541            DisplayPosition::WestMalayan => "west_malayan",
1542            DisplayPosition::BorneoRso => "borneo_rso",
1543            DisplayPosition::EstonianGrid => "estonian_grid",
1544            DisplayPosition::LatvianGrid => "latvian_grid",
1545            DisplayPosition::SwedishRef99Grid => "swedish_ref_99_grid",
1546        }
1547    }
1548
1549    /// Try to construct from the underlying numeric value.
1550    pub fn from_value(value: u8) -> Option<Self> {
1551        match value {
1552            0 => Some(DisplayPosition::Degree),
1553            1 => Some(DisplayPosition::DegreeMinute),
1554            2 => Some(DisplayPosition::DegreeMinuteSecond),
1555            3 => Some(DisplayPosition::AustrianGrid),
1556            4 => Some(DisplayPosition::BritishGrid),
1557            5 => Some(DisplayPosition::DutchGrid),
1558            6 => Some(DisplayPosition::HungarianGrid),
1559            7 => Some(DisplayPosition::FinnishGrid),
1560            8 => Some(DisplayPosition::GermanGrid),
1561            9 => Some(DisplayPosition::IcelandicGrid),
1562            10 => Some(DisplayPosition::IndonesianEquatorial),
1563            11 => Some(DisplayPosition::IndonesianIrian),
1564            12 => Some(DisplayPosition::IndonesianSouthern),
1565            13 => Some(DisplayPosition::IndiaZone0),
1566            14 => Some(DisplayPosition::IndiaZoneIA),
1567            15 => Some(DisplayPosition::IndiaZoneIB),
1568            16 => Some(DisplayPosition::IndiaZoneIIA),
1569            17 => Some(DisplayPosition::IndiaZoneIIB),
1570            18 => Some(DisplayPosition::IndiaZoneIIIA),
1571            19 => Some(DisplayPosition::IndiaZoneIIIB),
1572            20 => Some(DisplayPosition::IndiaZoneIVA),
1573            21 => Some(DisplayPosition::IndiaZoneIVB),
1574            22 => Some(DisplayPosition::IrishTransverse),
1575            23 => Some(DisplayPosition::IrishGrid),
1576            24 => Some(DisplayPosition::Loran),
1577            25 => Some(DisplayPosition::MaidenheadGrid),
1578            26 => Some(DisplayPosition::MgrsGrid),
1579            27 => Some(DisplayPosition::NewZealandGrid),
1580            28 => Some(DisplayPosition::NewZealandTransverse),
1581            29 => Some(DisplayPosition::QatarGrid),
1582            30 => Some(DisplayPosition::ModifiedSwedishGrid),
1583            31 => Some(DisplayPosition::SwedishGrid),
1584            32 => Some(DisplayPosition::SouthAfricanGrid),
1585            33 => Some(DisplayPosition::SwissGrid),
1586            34 => Some(DisplayPosition::TaiwanGrid),
1587            35 => Some(DisplayPosition::UnitedStatesGrid),
1588            36 => Some(DisplayPosition::UtmUpsGrid),
1589            37 => Some(DisplayPosition::WestMalayan),
1590            38 => Some(DisplayPosition::BorneoRso),
1591            39 => Some(DisplayPosition::EstonianGrid),
1592            40 => Some(DisplayPosition::LatvianGrid),
1593            41 => Some(DisplayPosition::SwedishRef99Grid),
1594            _ => None,
1595        }
1596    }
1597
1598    /// Try to construct from the snake-case canonical name.
1599    pub fn from_str(name: &str) -> Option<Self> {
1600        match name {
1601            "degree" => Some(DisplayPosition::Degree),
1602            "degree_minute" => Some(DisplayPosition::DegreeMinute),
1603            "degree_minute_second" => Some(DisplayPosition::DegreeMinuteSecond),
1604            "austrian_grid" => Some(DisplayPosition::AustrianGrid),
1605            "british_grid" => Some(DisplayPosition::BritishGrid),
1606            "dutch_grid" => Some(DisplayPosition::DutchGrid),
1607            "hungarian_grid" => Some(DisplayPosition::HungarianGrid),
1608            "finnish_grid" => Some(DisplayPosition::FinnishGrid),
1609            "german_grid" => Some(DisplayPosition::GermanGrid),
1610            "icelandic_grid" => Some(DisplayPosition::IcelandicGrid),
1611            "indonesian_equatorial" => Some(DisplayPosition::IndonesianEquatorial),
1612            "indonesian_irian" => Some(DisplayPosition::IndonesianIrian),
1613            "indonesian_southern" => Some(DisplayPosition::IndonesianSouthern),
1614            "india_zone_0" => Some(DisplayPosition::IndiaZone0),
1615            "india_zone_IA" => Some(DisplayPosition::IndiaZoneIA),
1616            "india_zone_IB" => Some(DisplayPosition::IndiaZoneIB),
1617            "india_zone_IIA" => Some(DisplayPosition::IndiaZoneIIA),
1618            "india_zone_IIB" => Some(DisplayPosition::IndiaZoneIIB),
1619            "india_zone_IIIA" => Some(DisplayPosition::IndiaZoneIIIA),
1620            "india_zone_IIIB" => Some(DisplayPosition::IndiaZoneIIIB),
1621            "india_zone_IVA" => Some(DisplayPosition::IndiaZoneIVA),
1622            "india_zone_IVB" => Some(DisplayPosition::IndiaZoneIVB),
1623            "irish_transverse" => Some(DisplayPosition::IrishTransverse),
1624            "irish_grid" => Some(DisplayPosition::IrishGrid),
1625            "loran" => Some(DisplayPosition::Loran),
1626            "maidenhead_grid" => Some(DisplayPosition::MaidenheadGrid),
1627            "mgrs_grid" => Some(DisplayPosition::MgrsGrid),
1628            "new_zealand_grid" => Some(DisplayPosition::NewZealandGrid),
1629            "new_zealand_transverse" => Some(DisplayPosition::NewZealandTransverse),
1630            "qatar_grid" => Some(DisplayPosition::QatarGrid),
1631            "modified_swedish_grid" => Some(DisplayPosition::ModifiedSwedishGrid),
1632            "swedish_grid" => Some(DisplayPosition::SwedishGrid),
1633            "south_african_grid" => Some(DisplayPosition::SouthAfricanGrid),
1634            "swiss_grid" => Some(DisplayPosition::SwissGrid),
1635            "taiwan_grid" => Some(DisplayPosition::TaiwanGrid),
1636            "united_states_grid" => Some(DisplayPosition::UnitedStatesGrid),
1637            "utm_ups_grid" => Some(DisplayPosition::UtmUpsGrid),
1638            "west_malayan" => Some(DisplayPosition::WestMalayan),
1639            "borneo_rso" => Some(DisplayPosition::BorneoRso),
1640            "estonian_grid" => Some(DisplayPosition::EstonianGrid),
1641            "latvian_grid" => Some(DisplayPosition::LatvianGrid),
1642            "swedish_ref_99_grid" => Some(DisplayPosition::SwedishRef99Grid),
1643            _ => None,
1644        }
1645    }
1646}
1647
1648#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1649#[repr(u8)]
1650#[non_exhaustive]
1651pub enum Switch {
1652    Off = 0,
1653    On = 1,
1654    Auto = 2,
1655}
1656
1657impl Switch {
1658    /// Snake-case canonical name from Profile.xlsx.
1659    pub fn as_str(&self) -> &'static str {
1660        match self {
1661            Switch::Off => "off",
1662            Switch::On => "on",
1663            Switch::Auto => "auto",
1664        }
1665    }
1666
1667    /// Try to construct from the underlying numeric value.
1668    pub fn from_value(value: u8) -> Option<Self> {
1669        match value {
1670            0 => Some(Switch::Off),
1671            1 => Some(Switch::On),
1672            2 => Some(Switch::Auto),
1673            _ => None,
1674        }
1675    }
1676
1677    /// Try to construct from the snake-case canonical name.
1678    pub fn from_str(name: &str) -> Option<Self> {
1679        match name {
1680            "off" => Some(Switch::Off),
1681            "on" => Some(Switch::On),
1682            "auto" => Some(Switch::Auto),
1683            _ => None,
1684        }
1685    }
1686}
1687
1688#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1689#[repr(u8)]
1690#[non_exhaustive]
1691pub enum Sport {
1692    Generic = 0,
1693    Running = 1,
1694    Cycling = 2,
1695    Transition = 3,
1696    FitnessEquipment = 4,
1697    Swimming = 5,
1698    Basketball = 6,
1699    Soccer = 7,
1700    Tennis = 8,
1701    AmericanFootball = 9,
1702    Training = 10,
1703    Walking = 11,
1704    CrossCountrySkiing = 12,
1705    AlpineSkiing = 13,
1706    Snowboarding = 14,
1707    Rowing = 15,
1708    Mountaineering = 16,
1709    Hiking = 17,
1710    Multisport = 18,
1711    Paddling = 19,
1712    Flying = 20,
1713    EBiking = 21,
1714    Motorcycling = 22,
1715    Boating = 23,
1716    Driving = 24,
1717    Golf = 25,
1718    HangGliding = 26,
1719    HorsebackRiding = 27,
1720    Hunting = 28,
1721    Fishing = 29,
1722    InlineSkating = 30,
1723    RockClimbing = 31,
1724    Sailing = 32,
1725    IceSkating = 33,
1726    SkyDiving = 34,
1727    Snowshoeing = 35,
1728    Snowmobiling = 36,
1729    StandUpPaddleboarding = 37,
1730    Surfing = 38,
1731    Wakeboarding = 39,
1732    WaterSkiing = 40,
1733    Kayaking = 41,
1734    Rafting = 42,
1735    Windsurfing = 43,
1736    Kitesurfing = 44,
1737    Tactical = 45,
1738    Jumpmaster = 46,
1739    Boxing = 47,
1740    FloorClimbing = 48,
1741    Baseball = 49,
1742    Diving = 53,
1743    Shooting = 56,
1744    WinterSport = 58,
1745    Grinding = 59,
1746    Hiit = 62,
1747    VideoGaming = 63,
1748    Racket = 64,
1749    WheelchairPushWalk = 65,
1750    WheelchairPushRun = 66,
1751    Meditation = 67,
1752    ParaSport = 68,
1753    DiscGolf = 69,
1754    TeamSport = 70,
1755    Cricket = 71,
1756    Rugby = 72,
1757    Hockey = 73,
1758    Lacrosse = 74,
1759    Volleyball = 75,
1760    WaterTubing = 76,
1761    Wakesurfing = 77,
1762    WaterSport = 78,
1763    Archery = 79,
1764    MixedMartialArts = 80,
1765    MotorSports = 81,
1766    Snorkeling = 82,
1767    Dance = 83,
1768    JumpRope = 84,
1769    PoolApnea = 85,
1770    Mobility = 86,
1771    Geocaching = 87,
1772    Canoeing = 88,
1773    All = 254,
1774}
1775
1776impl Sport {
1777    /// Snake-case canonical name from Profile.xlsx.
1778    pub fn as_str(&self) -> &'static str {
1779        match self {
1780            Sport::Generic => "generic",
1781            Sport::Running => "running",
1782            Sport::Cycling => "cycling",
1783            Sport::Transition => "transition",
1784            Sport::FitnessEquipment => "fitness_equipment",
1785            Sport::Swimming => "swimming",
1786            Sport::Basketball => "basketball",
1787            Sport::Soccer => "soccer",
1788            Sport::Tennis => "tennis",
1789            Sport::AmericanFootball => "american_football",
1790            Sport::Training => "training",
1791            Sport::Walking => "walking",
1792            Sport::CrossCountrySkiing => "cross_country_skiing",
1793            Sport::AlpineSkiing => "alpine_skiing",
1794            Sport::Snowboarding => "snowboarding",
1795            Sport::Rowing => "rowing",
1796            Sport::Mountaineering => "mountaineering",
1797            Sport::Hiking => "hiking",
1798            Sport::Multisport => "multisport",
1799            Sport::Paddling => "paddling",
1800            Sport::Flying => "flying",
1801            Sport::EBiking => "e_biking",
1802            Sport::Motorcycling => "motorcycling",
1803            Sport::Boating => "boating",
1804            Sport::Driving => "driving",
1805            Sport::Golf => "golf",
1806            Sport::HangGliding => "hang_gliding",
1807            Sport::HorsebackRiding => "horseback_riding",
1808            Sport::Hunting => "hunting",
1809            Sport::Fishing => "fishing",
1810            Sport::InlineSkating => "inline_skating",
1811            Sport::RockClimbing => "rock_climbing",
1812            Sport::Sailing => "sailing",
1813            Sport::IceSkating => "ice_skating",
1814            Sport::SkyDiving => "sky_diving",
1815            Sport::Snowshoeing => "snowshoeing",
1816            Sport::Snowmobiling => "snowmobiling",
1817            Sport::StandUpPaddleboarding => "stand_up_paddleboarding",
1818            Sport::Surfing => "surfing",
1819            Sport::Wakeboarding => "wakeboarding",
1820            Sport::WaterSkiing => "water_skiing",
1821            Sport::Kayaking => "kayaking",
1822            Sport::Rafting => "rafting",
1823            Sport::Windsurfing => "windsurfing",
1824            Sport::Kitesurfing => "kitesurfing",
1825            Sport::Tactical => "tactical",
1826            Sport::Jumpmaster => "jumpmaster",
1827            Sport::Boxing => "boxing",
1828            Sport::FloorClimbing => "floor_climbing",
1829            Sport::Baseball => "baseball",
1830            Sport::Diving => "diving",
1831            Sport::Shooting => "shooting",
1832            Sport::WinterSport => "winter_sport",
1833            Sport::Grinding => "grinding",
1834            Sport::Hiit => "hiit",
1835            Sport::VideoGaming => "video_gaming",
1836            Sport::Racket => "racket",
1837            Sport::WheelchairPushWalk => "wheelchair_push_walk",
1838            Sport::WheelchairPushRun => "wheelchair_push_run",
1839            Sport::Meditation => "meditation",
1840            Sport::ParaSport => "para_sport",
1841            Sport::DiscGolf => "disc_golf",
1842            Sport::TeamSport => "team_sport",
1843            Sport::Cricket => "cricket",
1844            Sport::Rugby => "rugby",
1845            Sport::Hockey => "hockey",
1846            Sport::Lacrosse => "lacrosse",
1847            Sport::Volleyball => "volleyball",
1848            Sport::WaterTubing => "water_tubing",
1849            Sport::Wakesurfing => "wakesurfing",
1850            Sport::WaterSport => "water_sport",
1851            Sport::Archery => "archery",
1852            Sport::MixedMartialArts => "mixed_martial_arts",
1853            Sport::MotorSports => "motor_sports",
1854            Sport::Snorkeling => "snorkeling",
1855            Sport::Dance => "dance",
1856            Sport::JumpRope => "jump_rope",
1857            Sport::PoolApnea => "pool_apnea",
1858            Sport::Mobility => "mobility",
1859            Sport::Geocaching => "geocaching",
1860            Sport::Canoeing => "canoeing",
1861            Sport::All => "all",
1862        }
1863    }
1864
1865    /// Try to construct from the underlying numeric value.
1866    pub fn from_value(value: u8) -> Option<Self> {
1867        match value {
1868            0 => Some(Sport::Generic),
1869            1 => Some(Sport::Running),
1870            2 => Some(Sport::Cycling),
1871            3 => Some(Sport::Transition),
1872            4 => Some(Sport::FitnessEquipment),
1873            5 => Some(Sport::Swimming),
1874            6 => Some(Sport::Basketball),
1875            7 => Some(Sport::Soccer),
1876            8 => Some(Sport::Tennis),
1877            9 => Some(Sport::AmericanFootball),
1878            10 => Some(Sport::Training),
1879            11 => Some(Sport::Walking),
1880            12 => Some(Sport::CrossCountrySkiing),
1881            13 => Some(Sport::AlpineSkiing),
1882            14 => Some(Sport::Snowboarding),
1883            15 => Some(Sport::Rowing),
1884            16 => Some(Sport::Mountaineering),
1885            17 => Some(Sport::Hiking),
1886            18 => Some(Sport::Multisport),
1887            19 => Some(Sport::Paddling),
1888            20 => Some(Sport::Flying),
1889            21 => Some(Sport::EBiking),
1890            22 => Some(Sport::Motorcycling),
1891            23 => Some(Sport::Boating),
1892            24 => Some(Sport::Driving),
1893            25 => Some(Sport::Golf),
1894            26 => Some(Sport::HangGliding),
1895            27 => Some(Sport::HorsebackRiding),
1896            28 => Some(Sport::Hunting),
1897            29 => Some(Sport::Fishing),
1898            30 => Some(Sport::InlineSkating),
1899            31 => Some(Sport::RockClimbing),
1900            32 => Some(Sport::Sailing),
1901            33 => Some(Sport::IceSkating),
1902            34 => Some(Sport::SkyDiving),
1903            35 => Some(Sport::Snowshoeing),
1904            36 => Some(Sport::Snowmobiling),
1905            37 => Some(Sport::StandUpPaddleboarding),
1906            38 => Some(Sport::Surfing),
1907            39 => Some(Sport::Wakeboarding),
1908            40 => Some(Sport::WaterSkiing),
1909            41 => Some(Sport::Kayaking),
1910            42 => Some(Sport::Rafting),
1911            43 => Some(Sport::Windsurfing),
1912            44 => Some(Sport::Kitesurfing),
1913            45 => Some(Sport::Tactical),
1914            46 => Some(Sport::Jumpmaster),
1915            47 => Some(Sport::Boxing),
1916            48 => Some(Sport::FloorClimbing),
1917            49 => Some(Sport::Baseball),
1918            53 => Some(Sport::Diving),
1919            56 => Some(Sport::Shooting),
1920            58 => Some(Sport::WinterSport),
1921            59 => Some(Sport::Grinding),
1922            62 => Some(Sport::Hiit),
1923            63 => Some(Sport::VideoGaming),
1924            64 => Some(Sport::Racket),
1925            65 => Some(Sport::WheelchairPushWalk),
1926            66 => Some(Sport::WheelchairPushRun),
1927            67 => Some(Sport::Meditation),
1928            68 => Some(Sport::ParaSport),
1929            69 => Some(Sport::DiscGolf),
1930            70 => Some(Sport::TeamSport),
1931            71 => Some(Sport::Cricket),
1932            72 => Some(Sport::Rugby),
1933            73 => Some(Sport::Hockey),
1934            74 => Some(Sport::Lacrosse),
1935            75 => Some(Sport::Volleyball),
1936            76 => Some(Sport::WaterTubing),
1937            77 => Some(Sport::Wakesurfing),
1938            78 => Some(Sport::WaterSport),
1939            79 => Some(Sport::Archery),
1940            80 => Some(Sport::MixedMartialArts),
1941            81 => Some(Sport::MotorSports),
1942            82 => Some(Sport::Snorkeling),
1943            83 => Some(Sport::Dance),
1944            84 => Some(Sport::JumpRope),
1945            85 => Some(Sport::PoolApnea),
1946            86 => Some(Sport::Mobility),
1947            87 => Some(Sport::Geocaching),
1948            88 => Some(Sport::Canoeing),
1949            254 => Some(Sport::All),
1950            _ => None,
1951        }
1952    }
1953
1954    /// Try to construct from the snake-case canonical name.
1955    pub fn from_str(name: &str) -> Option<Self> {
1956        match name {
1957            "generic" => Some(Sport::Generic),
1958            "running" => Some(Sport::Running),
1959            "cycling" => Some(Sport::Cycling),
1960            "transition" => Some(Sport::Transition),
1961            "fitness_equipment" => Some(Sport::FitnessEquipment),
1962            "swimming" => Some(Sport::Swimming),
1963            "basketball" => Some(Sport::Basketball),
1964            "soccer" => Some(Sport::Soccer),
1965            "tennis" => Some(Sport::Tennis),
1966            "american_football" => Some(Sport::AmericanFootball),
1967            "training" => Some(Sport::Training),
1968            "walking" => Some(Sport::Walking),
1969            "cross_country_skiing" => Some(Sport::CrossCountrySkiing),
1970            "alpine_skiing" => Some(Sport::AlpineSkiing),
1971            "snowboarding" => Some(Sport::Snowboarding),
1972            "rowing" => Some(Sport::Rowing),
1973            "mountaineering" => Some(Sport::Mountaineering),
1974            "hiking" => Some(Sport::Hiking),
1975            "multisport" => Some(Sport::Multisport),
1976            "paddling" => Some(Sport::Paddling),
1977            "flying" => Some(Sport::Flying),
1978            "e_biking" => Some(Sport::EBiking),
1979            "motorcycling" => Some(Sport::Motorcycling),
1980            "boating" => Some(Sport::Boating),
1981            "driving" => Some(Sport::Driving),
1982            "golf" => Some(Sport::Golf),
1983            "hang_gliding" => Some(Sport::HangGliding),
1984            "horseback_riding" => Some(Sport::HorsebackRiding),
1985            "hunting" => Some(Sport::Hunting),
1986            "fishing" => Some(Sport::Fishing),
1987            "inline_skating" => Some(Sport::InlineSkating),
1988            "rock_climbing" => Some(Sport::RockClimbing),
1989            "sailing" => Some(Sport::Sailing),
1990            "ice_skating" => Some(Sport::IceSkating),
1991            "sky_diving" => Some(Sport::SkyDiving),
1992            "snowshoeing" => Some(Sport::Snowshoeing),
1993            "snowmobiling" => Some(Sport::Snowmobiling),
1994            "stand_up_paddleboarding" => Some(Sport::StandUpPaddleboarding),
1995            "surfing" => Some(Sport::Surfing),
1996            "wakeboarding" => Some(Sport::Wakeboarding),
1997            "water_skiing" => Some(Sport::WaterSkiing),
1998            "kayaking" => Some(Sport::Kayaking),
1999            "rafting" => Some(Sport::Rafting),
2000            "windsurfing" => Some(Sport::Windsurfing),
2001            "kitesurfing" => Some(Sport::Kitesurfing),
2002            "tactical" => Some(Sport::Tactical),
2003            "jumpmaster" => Some(Sport::Jumpmaster),
2004            "boxing" => Some(Sport::Boxing),
2005            "floor_climbing" => Some(Sport::FloorClimbing),
2006            "baseball" => Some(Sport::Baseball),
2007            "diving" => Some(Sport::Diving),
2008            "shooting" => Some(Sport::Shooting),
2009            "winter_sport" => Some(Sport::WinterSport),
2010            "grinding" => Some(Sport::Grinding),
2011            "hiit" => Some(Sport::Hiit),
2012            "video_gaming" => Some(Sport::VideoGaming),
2013            "racket" => Some(Sport::Racket),
2014            "wheelchair_push_walk" => Some(Sport::WheelchairPushWalk),
2015            "wheelchair_push_run" => Some(Sport::WheelchairPushRun),
2016            "meditation" => Some(Sport::Meditation),
2017            "para_sport" => Some(Sport::ParaSport),
2018            "disc_golf" => Some(Sport::DiscGolf),
2019            "team_sport" => Some(Sport::TeamSport),
2020            "cricket" => Some(Sport::Cricket),
2021            "rugby" => Some(Sport::Rugby),
2022            "hockey" => Some(Sport::Hockey),
2023            "lacrosse" => Some(Sport::Lacrosse),
2024            "volleyball" => Some(Sport::Volleyball),
2025            "water_tubing" => Some(Sport::WaterTubing),
2026            "wakesurfing" => Some(Sport::Wakesurfing),
2027            "water_sport" => Some(Sport::WaterSport),
2028            "archery" => Some(Sport::Archery),
2029            "mixed_martial_arts" => Some(Sport::MixedMartialArts),
2030            "motor_sports" => Some(Sport::MotorSports),
2031            "snorkeling" => Some(Sport::Snorkeling),
2032            "dance" => Some(Sport::Dance),
2033            "jump_rope" => Some(Sport::JumpRope),
2034            "pool_apnea" => Some(Sport::PoolApnea),
2035            "mobility" => Some(Sport::Mobility),
2036            "geocaching" => Some(Sport::Geocaching),
2037            "canoeing" => Some(Sport::Canoeing),
2038            "all" => Some(Sport::All),
2039            _ => None,
2040        }
2041    }
2042}
2043
2044#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
2045#[repr(u8)]
2046#[non_exhaustive]
2047pub enum SportBits0 {
2048    Generic = 1,
2049    Running = 2,
2050    Cycling = 4,
2051    Transition = 8,
2052    FitnessEquipment = 16,
2053    Swimming = 32,
2054    Basketball = 64,
2055    Soccer = 128,
2056}
2057
2058impl SportBits0 {
2059    /// Snake-case canonical name from Profile.xlsx.
2060    pub fn as_str(&self) -> &'static str {
2061        match self {
2062            SportBits0::Generic => "generic",
2063            SportBits0::Running => "running",
2064            SportBits0::Cycling => "cycling",
2065            SportBits0::Transition => "transition",
2066            SportBits0::FitnessEquipment => "fitness_equipment",
2067            SportBits0::Swimming => "swimming",
2068            SportBits0::Basketball => "basketball",
2069            SportBits0::Soccer => "soccer",
2070        }
2071    }
2072
2073    /// Try to construct from the underlying numeric value.
2074    pub fn from_value(value: u8) -> Option<Self> {
2075        match value {
2076            1 => Some(SportBits0::Generic),
2077            2 => Some(SportBits0::Running),
2078            4 => Some(SportBits0::Cycling),
2079            8 => Some(SportBits0::Transition),
2080            16 => Some(SportBits0::FitnessEquipment),
2081            32 => Some(SportBits0::Swimming),
2082            64 => Some(SportBits0::Basketball),
2083            128 => Some(SportBits0::Soccer),
2084            _ => None,
2085        }
2086    }
2087
2088    /// Try to construct from the snake-case canonical name.
2089    pub fn from_str(name: &str) -> Option<Self> {
2090        match name {
2091            "generic" => Some(SportBits0::Generic),
2092            "running" => Some(SportBits0::Running),
2093            "cycling" => Some(SportBits0::Cycling),
2094            "transition" => Some(SportBits0::Transition),
2095            "fitness_equipment" => Some(SportBits0::FitnessEquipment),
2096            "swimming" => Some(SportBits0::Swimming),
2097            "basketball" => Some(SportBits0::Basketball),
2098            "soccer" => Some(SportBits0::Soccer),
2099            _ => None,
2100        }
2101    }
2102}
2103
2104#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
2105#[repr(u8)]
2106#[non_exhaustive]
2107pub enum SportBits1 {
2108    Tennis = 1,
2109    AmericanFootball = 2,
2110    Training = 4,
2111    Walking = 8,
2112    CrossCountrySkiing = 16,
2113    AlpineSkiing = 32,
2114    Snowboarding = 64,
2115    Rowing = 128,
2116}
2117
2118impl SportBits1 {
2119    /// Snake-case canonical name from Profile.xlsx.
2120    pub fn as_str(&self) -> &'static str {
2121        match self {
2122            SportBits1::Tennis => "tennis",
2123            SportBits1::AmericanFootball => "american_football",
2124            SportBits1::Training => "training",
2125            SportBits1::Walking => "walking",
2126            SportBits1::CrossCountrySkiing => "cross_country_skiing",
2127            SportBits1::AlpineSkiing => "alpine_skiing",
2128            SportBits1::Snowboarding => "snowboarding",
2129            SportBits1::Rowing => "rowing",
2130        }
2131    }
2132
2133    /// Try to construct from the underlying numeric value.
2134    pub fn from_value(value: u8) -> Option<Self> {
2135        match value {
2136            1 => Some(SportBits1::Tennis),
2137            2 => Some(SportBits1::AmericanFootball),
2138            4 => Some(SportBits1::Training),
2139            8 => Some(SportBits1::Walking),
2140            16 => Some(SportBits1::CrossCountrySkiing),
2141            32 => Some(SportBits1::AlpineSkiing),
2142            64 => Some(SportBits1::Snowboarding),
2143            128 => Some(SportBits1::Rowing),
2144            _ => None,
2145        }
2146    }
2147
2148    /// Try to construct from the snake-case canonical name.
2149    pub fn from_str(name: &str) -> Option<Self> {
2150        match name {
2151            "tennis" => Some(SportBits1::Tennis),
2152            "american_football" => Some(SportBits1::AmericanFootball),
2153            "training" => Some(SportBits1::Training),
2154            "walking" => Some(SportBits1::Walking),
2155            "cross_country_skiing" => Some(SportBits1::CrossCountrySkiing),
2156            "alpine_skiing" => Some(SportBits1::AlpineSkiing),
2157            "snowboarding" => Some(SportBits1::Snowboarding),
2158            "rowing" => Some(SportBits1::Rowing),
2159            _ => None,
2160        }
2161    }
2162}
2163
2164#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
2165#[repr(u8)]
2166#[non_exhaustive]
2167pub enum SportBits2 {
2168    Mountaineering = 1,
2169    Hiking = 2,
2170    Multisport = 4,
2171    Paddling = 8,
2172    Flying = 16,
2173    EBiking = 32,
2174    Motorcycling = 64,
2175    Boating = 128,
2176}
2177
2178impl SportBits2 {
2179    /// Snake-case canonical name from Profile.xlsx.
2180    pub fn as_str(&self) -> &'static str {
2181        match self {
2182            SportBits2::Mountaineering => "mountaineering",
2183            SportBits2::Hiking => "hiking",
2184            SportBits2::Multisport => "multisport",
2185            SportBits2::Paddling => "paddling",
2186            SportBits2::Flying => "flying",
2187            SportBits2::EBiking => "e_biking",
2188            SportBits2::Motorcycling => "motorcycling",
2189            SportBits2::Boating => "boating",
2190        }
2191    }
2192
2193    /// Try to construct from the underlying numeric value.
2194    pub fn from_value(value: u8) -> Option<Self> {
2195        match value {
2196            1 => Some(SportBits2::Mountaineering),
2197            2 => Some(SportBits2::Hiking),
2198            4 => Some(SportBits2::Multisport),
2199            8 => Some(SportBits2::Paddling),
2200            16 => Some(SportBits2::Flying),
2201            32 => Some(SportBits2::EBiking),
2202            64 => Some(SportBits2::Motorcycling),
2203            128 => Some(SportBits2::Boating),
2204            _ => None,
2205        }
2206    }
2207
2208    /// Try to construct from the snake-case canonical name.
2209    pub fn from_str(name: &str) -> Option<Self> {
2210        match name {
2211            "mountaineering" => Some(SportBits2::Mountaineering),
2212            "hiking" => Some(SportBits2::Hiking),
2213            "multisport" => Some(SportBits2::Multisport),
2214            "paddling" => Some(SportBits2::Paddling),
2215            "flying" => Some(SportBits2::Flying),
2216            "e_biking" => Some(SportBits2::EBiking),
2217            "motorcycling" => Some(SportBits2::Motorcycling),
2218            "boating" => Some(SportBits2::Boating),
2219            _ => None,
2220        }
2221    }
2222}
2223
2224#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
2225#[repr(u8)]
2226#[non_exhaustive]
2227pub enum SportBits3 {
2228    Driving = 1,
2229    Golf = 2,
2230    HangGliding = 4,
2231    HorsebackRiding = 8,
2232    Hunting = 16,
2233    Fishing = 32,
2234    InlineSkating = 64,
2235    RockClimbing = 128,
2236}
2237
2238impl SportBits3 {
2239    /// Snake-case canonical name from Profile.xlsx.
2240    pub fn as_str(&self) -> &'static str {
2241        match self {
2242            SportBits3::Driving => "driving",
2243            SportBits3::Golf => "golf",
2244            SportBits3::HangGliding => "hang_gliding",
2245            SportBits3::HorsebackRiding => "horseback_riding",
2246            SportBits3::Hunting => "hunting",
2247            SportBits3::Fishing => "fishing",
2248            SportBits3::InlineSkating => "inline_skating",
2249            SportBits3::RockClimbing => "rock_climbing",
2250        }
2251    }
2252
2253    /// Try to construct from the underlying numeric value.
2254    pub fn from_value(value: u8) -> Option<Self> {
2255        match value {
2256            1 => Some(SportBits3::Driving),
2257            2 => Some(SportBits3::Golf),
2258            4 => Some(SportBits3::HangGliding),
2259            8 => Some(SportBits3::HorsebackRiding),
2260            16 => Some(SportBits3::Hunting),
2261            32 => Some(SportBits3::Fishing),
2262            64 => Some(SportBits3::InlineSkating),
2263            128 => Some(SportBits3::RockClimbing),
2264            _ => None,
2265        }
2266    }
2267
2268    /// Try to construct from the snake-case canonical name.
2269    pub fn from_str(name: &str) -> Option<Self> {
2270        match name {
2271            "driving" => Some(SportBits3::Driving),
2272            "golf" => Some(SportBits3::Golf),
2273            "hang_gliding" => Some(SportBits3::HangGliding),
2274            "horseback_riding" => Some(SportBits3::HorsebackRiding),
2275            "hunting" => Some(SportBits3::Hunting),
2276            "fishing" => Some(SportBits3::Fishing),
2277            "inline_skating" => Some(SportBits3::InlineSkating),
2278            "rock_climbing" => Some(SportBits3::RockClimbing),
2279            _ => None,
2280        }
2281    }
2282}
2283
2284#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
2285#[repr(u8)]
2286#[non_exhaustive]
2287pub enum SportBits4 {
2288    Sailing = 1,
2289    IceSkating = 2,
2290    SkyDiving = 4,
2291    Snowshoeing = 8,
2292    Snowmobiling = 16,
2293    StandUpPaddleboarding = 32,
2294    Surfing = 64,
2295    Wakeboarding = 128,
2296}
2297
2298impl SportBits4 {
2299    /// Snake-case canonical name from Profile.xlsx.
2300    pub fn as_str(&self) -> &'static str {
2301        match self {
2302            SportBits4::Sailing => "sailing",
2303            SportBits4::IceSkating => "ice_skating",
2304            SportBits4::SkyDiving => "sky_diving",
2305            SportBits4::Snowshoeing => "snowshoeing",
2306            SportBits4::Snowmobiling => "snowmobiling",
2307            SportBits4::StandUpPaddleboarding => "stand_up_paddleboarding",
2308            SportBits4::Surfing => "surfing",
2309            SportBits4::Wakeboarding => "wakeboarding",
2310        }
2311    }
2312
2313    /// Try to construct from the underlying numeric value.
2314    pub fn from_value(value: u8) -> Option<Self> {
2315        match value {
2316            1 => Some(SportBits4::Sailing),
2317            2 => Some(SportBits4::IceSkating),
2318            4 => Some(SportBits4::SkyDiving),
2319            8 => Some(SportBits4::Snowshoeing),
2320            16 => Some(SportBits4::Snowmobiling),
2321            32 => Some(SportBits4::StandUpPaddleboarding),
2322            64 => Some(SportBits4::Surfing),
2323            128 => Some(SportBits4::Wakeboarding),
2324            _ => None,
2325        }
2326    }
2327
2328    /// Try to construct from the snake-case canonical name.
2329    pub fn from_str(name: &str) -> Option<Self> {
2330        match name {
2331            "sailing" => Some(SportBits4::Sailing),
2332            "ice_skating" => Some(SportBits4::IceSkating),
2333            "sky_diving" => Some(SportBits4::SkyDiving),
2334            "snowshoeing" => Some(SportBits4::Snowshoeing),
2335            "snowmobiling" => Some(SportBits4::Snowmobiling),
2336            "stand_up_paddleboarding" => Some(SportBits4::StandUpPaddleboarding),
2337            "surfing" => Some(SportBits4::Surfing),
2338            "wakeboarding" => Some(SportBits4::Wakeboarding),
2339            _ => None,
2340        }
2341    }
2342}
2343
2344#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
2345#[repr(u8)]
2346#[non_exhaustive]
2347pub enum SportBits5 {
2348    WaterSkiing = 1,
2349    Kayaking = 2,
2350    Rafting = 4,
2351    Windsurfing = 8,
2352    Kitesurfing = 16,
2353    Tactical = 32,
2354    Jumpmaster = 64,
2355    Boxing = 128,
2356}
2357
2358impl SportBits5 {
2359    /// Snake-case canonical name from Profile.xlsx.
2360    pub fn as_str(&self) -> &'static str {
2361        match self {
2362            SportBits5::WaterSkiing => "water_skiing",
2363            SportBits5::Kayaking => "kayaking",
2364            SportBits5::Rafting => "rafting",
2365            SportBits5::Windsurfing => "windsurfing",
2366            SportBits5::Kitesurfing => "kitesurfing",
2367            SportBits5::Tactical => "tactical",
2368            SportBits5::Jumpmaster => "jumpmaster",
2369            SportBits5::Boxing => "boxing",
2370        }
2371    }
2372
2373    /// Try to construct from the underlying numeric value.
2374    pub fn from_value(value: u8) -> Option<Self> {
2375        match value {
2376            1 => Some(SportBits5::WaterSkiing),
2377            2 => Some(SportBits5::Kayaking),
2378            4 => Some(SportBits5::Rafting),
2379            8 => Some(SportBits5::Windsurfing),
2380            16 => Some(SportBits5::Kitesurfing),
2381            32 => Some(SportBits5::Tactical),
2382            64 => Some(SportBits5::Jumpmaster),
2383            128 => Some(SportBits5::Boxing),
2384            _ => None,
2385        }
2386    }
2387
2388    /// Try to construct from the snake-case canonical name.
2389    pub fn from_str(name: &str) -> Option<Self> {
2390        match name {
2391            "water_skiing" => Some(SportBits5::WaterSkiing),
2392            "kayaking" => Some(SportBits5::Kayaking),
2393            "rafting" => Some(SportBits5::Rafting),
2394            "windsurfing" => Some(SportBits5::Windsurfing),
2395            "kitesurfing" => Some(SportBits5::Kitesurfing),
2396            "tactical" => Some(SportBits5::Tactical),
2397            "jumpmaster" => Some(SportBits5::Jumpmaster),
2398            "boxing" => Some(SportBits5::Boxing),
2399            _ => None,
2400        }
2401    }
2402}
2403
2404#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
2405#[repr(u8)]
2406#[non_exhaustive]
2407pub enum SportBits6 {
2408    FloorClimbing = 1,
2409}
2410
2411impl SportBits6 {
2412    /// Snake-case canonical name from Profile.xlsx.
2413    pub fn as_str(&self) -> &'static str {
2414        match self {
2415            SportBits6::FloorClimbing => "floor_climbing",
2416        }
2417    }
2418
2419    /// Try to construct from the underlying numeric value.
2420    pub fn from_value(value: u8) -> Option<Self> {
2421        match value {
2422            1 => Some(SportBits6::FloorClimbing),
2423            _ => None,
2424        }
2425    }
2426
2427    /// Try to construct from the snake-case canonical name.
2428    pub fn from_str(name: &str) -> Option<Self> {
2429        match name {
2430            "floor_climbing" => Some(SportBits6::FloorClimbing),
2431            _ => None,
2432        }
2433    }
2434}
2435
2436#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
2437#[repr(u8)]
2438#[non_exhaustive]
2439pub enum SubSport {
2440    Generic = 0,
2441    Treadmill = 1,
2442    Street = 2,
2443    Trail = 3,
2444    Track = 4,
2445    Spin = 5,
2446    IndoorCycling = 6,
2447    Road = 7,
2448    Mountain = 8,
2449    Downhill = 9,
2450    Recumbent = 10,
2451    Cyclocross = 11,
2452    HandCycling = 12,
2453    TrackCycling = 13,
2454    IndoorRowing = 14,
2455    Elliptical = 15,
2456    StairClimbing = 16,
2457    LapSwimming = 17,
2458    OpenWater = 18,
2459    FlexibilityTraining = 19,
2460    StrengthTraining = 20,
2461    WarmUp = 21,
2462    Match = 22,
2463    Exercise = 23,
2464    Challenge = 24,
2465    IndoorSkiing = 25,
2466    CardioTraining = 26,
2467    IndoorWalking = 27,
2468    EBikeFitness = 28,
2469    Bmx = 29,
2470    CasualWalking = 30,
2471    SpeedWalking = 31,
2472    BikeToRunTransition = 32,
2473    RunToBikeTransition = 33,
2474    SwimToBikeTransition = 34,
2475    Atv = 35,
2476    Motocross = 36,
2477    Backcountry = 37,
2478    Resort = 38,
2479    RcDrone = 39,
2480    Wingsuit = 40,
2481    Whitewater = 41,
2482    SkateSkiing = 42,
2483    Yoga = 43,
2484    Pilates = 44,
2485    IndoorRunning = 45,
2486    GravelCycling = 46,
2487    EBikeMountain = 47,
2488    Commuting = 48,
2489    MixedSurface = 49,
2490    Navigate = 50,
2491    TrackMe = 51,
2492    Map = 52,
2493    SingleGasDiving = 53,
2494    MultiGasDiving = 54,
2495    GaugeDiving = 55,
2496    ApneaDiving = 56,
2497    ApneaHunting = 57,
2498    VirtualActivity = 58,
2499    Obstacle = 59,
2500    Breathing = 62,
2501    CcrDiving = 63,
2502    SailRace = 65,
2503    Expedition = 66,
2504    Ultra = 67,
2505    IndoorClimbing = 68,
2506    Bouldering = 69,
2507    Hiit = 70,
2508    IndoorGrinding = 71,
2509    HuntingWithDogs = 72,
2510    Amrap = 73,
2511    Emom = 74,
2512    Tabata = 75,
2513    Esport = 77,
2514    Triathlon = 78,
2515    Duathlon = 79,
2516    Brick = 80,
2517    SwimRun = 81,
2518    AdventureRace = 82,
2519    TruckerWorkout = 83,
2520    Pickleball = 84,
2521    Padel = 85,
2522    IndoorWheelchairWalk = 86,
2523    IndoorWheelchairRun = 87,
2524    IndoorHandCycling = 88,
2525    Field = 90,
2526    Ice = 91,
2527    Ultimate = 92,
2528    Platform = 93,
2529    Squash = 94,
2530    Badminton = 95,
2531    Racquetball = 96,
2532    TableTennis = 97,
2533    Overland = 98,
2534    TrollingMotor = 99,
2535    FlyCanopy = 110,
2536    FlyParaglide = 111,
2537    FlyParamotor = 112,
2538    FlyPressurized = 113,
2539    FlyNavigate = 114,
2540    FlyTimer = 115,
2541    FlyAltimeter = 116,
2542    FlyWx = 117,
2543    FlyVfr = 118,
2544    FlyIfr = 119,
2545    DynamicApnea = 121,
2546    Enduro = 123,
2547    Rucking = 124,
2548    Rally = 125,
2549    PoolTriathlon = 126,
2550    EBikeEnduro = 127,
2551    All = 254,
2552}
2553
2554impl SubSport {
2555    /// Snake-case canonical name from Profile.xlsx.
2556    pub fn as_str(&self) -> &'static str {
2557        match self {
2558            SubSport::Generic => "generic",
2559            SubSport::Treadmill => "treadmill",
2560            SubSport::Street => "street",
2561            SubSport::Trail => "trail",
2562            SubSport::Track => "track",
2563            SubSport::Spin => "spin",
2564            SubSport::IndoorCycling => "indoor_cycling",
2565            SubSport::Road => "road",
2566            SubSport::Mountain => "mountain",
2567            SubSport::Downhill => "downhill",
2568            SubSport::Recumbent => "recumbent",
2569            SubSport::Cyclocross => "cyclocross",
2570            SubSport::HandCycling => "hand_cycling",
2571            SubSport::TrackCycling => "track_cycling",
2572            SubSport::IndoorRowing => "indoor_rowing",
2573            SubSport::Elliptical => "elliptical",
2574            SubSport::StairClimbing => "stair_climbing",
2575            SubSport::LapSwimming => "lap_swimming",
2576            SubSport::OpenWater => "open_water",
2577            SubSport::FlexibilityTraining => "flexibility_training",
2578            SubSport::StrengthTraining => "strength_training",
2579            SubSport::WarmUp => "warm_up",
2580            SubSport::Match => "match",
2581            SubSport::Exercise => "exercise",
2582            SubSport::Challenge => "challenge",
2583            SubSport::IndoorSkiing => "indoor_skiing",
2584            SubSport::CardioTraining => "cardio_training",
2585            SubSport::IndoorWalking => "indoor_walking",
2586            SubSport::EBikeFitness => "e_bike_fitness",
2587            SubSport::Bmx => "bmx",
2588            SubSport::CasualWalking => "casual_walking",
2589            SubSport::SpeedWalking => "speed_walking",
2590            SubSport::BikeToRunTransition => "bike_to_run_transition",
2591            SubSport::RunToBikeTransition => "run_to_bike_transition",
2592            SubSport::SwimToBikeTransition => "swim_to_bike_transition",
2593            SubSport::Atv => "atv",
2594            SubSport::Motocross => "motocross",
2595            SubSport::Backcountry => "backcountry",
2596            SubSport::Resort => "resort",
2597            SubSport::RcDrone => "rc_drone",
2598            SubSport::Wingsuit => "wingsuit",
2599            SubSport::Whitewater => "whitewater",
2600            SubSport::SkateSkiing => "skate_skiing",
2601            SubSport::Yoga => "yoga",
2602            SubSport::Pilates => "pilates",
2603            SubSport::IndoorRunning => "indoor_running",
2604            SubSport::GravelCycling => "gravel_cycling",
2605            SubSport::EBikeMountain => "e_bike_mountain",
2606            SubSport::Commuting => "commuting",
2607            SubSport::MixedSurface => "mixed_surface",
2608            SubSport::Navigate => "navigate",
2609            SubSport::TrackMe => "track_me",
2610            SubSport::Map => "map",
2611            SubSport::SingleGasDiving => "single_gas_diving",
2612            SubSport::MultiGasDiving => "multi_gas_diving",
2613            SubSport::GaugeDiving => "gauge_diving",
2614            SubSport::ApneaDiving => "apnea_diving",
2615            SubSport::ApneaHunting => "apnea_hunting",
2616            SubSport::VirtualActivity => "virtual_activity",
2617            SubSport::Obstacle => "obstacle",
2618            SubSport::Breathing => "breathing",
2619            SubSport::CcrDiving => "ccr_diving",
2620            SubSport::SailRace => "sail_race",
2621            SubSport::Expedition => "expedition",
2622            SubSport::Ultra => "ultra",
2623            SubSport::IndoorClimbing => "indoor_climbing",
2624            SubSport::Bouldering => "bouldering",
2625            SubSport::Hiit => "hiit",
2626            SubSport::IndoorGrinding => "indoor_grinding",
2627            SubSport::HuntingWithDogs => "hunting_with_dogs",
2628            SubSport::Amrap => "amrap",
2629            SubSport::Emom => "emom",
2630            SubSport::Tabata => "tabata",
2631            SubSport::Esport => "esport",
2632            SubSport::Triathlon => "triathlon",
2633            SubSport::Duathlon => "duathlon",
2634            SubSport::Brick => "brick",
2635            SubSport::SwimRun => "swim_run",
2636            SubSport::AdventureRace => "adventure_race",
2637            SubSport::TruckerWorkout => "trucker_workout",
2638            SubSport::Pickleball => "pickleball",
2639            SubSport::Padel => "padel",
2640            SubSport::IndoorWheelchairWalk => "indoor_wheelchair_walk",
2641            SubSport::IndoorWheelchairRun => "indoor_wheelchair_run",
2642            SubSport::IndoorHandCycling => "indoor_hand_cycling",
2643            SubSport::Field => "field",
2644            SubSport::Ice => "ice",
2645            SubSport::Ultimate => "ultimate",
2646            SubSport::Platform => "platform",
2647            SubSport::Squash => "squash",
2648            SubSport::Badminton => "badminton",
2649            SubSport::Racquetball => "racquetball",
2650            SubSport::TableTennis => "table_tennis",
2651            SubSport::Overland => "overland",
2652            SubSport::TrollingMotor => "trolling_motor",
2653            SubSport::FlyCanopy => "fly_canopy",
2654            SubSport::FlyParaglide => "fly_paraglide",
2655            SubSport::FlyParamotor => "fly_paramotor",
2656            SubSport::FlyPressurized => "fly_pressurized",
2657            SubSport::FlyNavigate => "fly_navigate",
2658            SubSport::FlyTimer => "fly_timer",
2659            SubSport::FlyAltimeter => "fly_altimeter",
2660            SubSport::FlyWx => "fly_wx",
2661            SubSport::FlyVfr => "fly_vfr",
2662            SubSport::FlyIfr => "fly_ifr",
2663            SubSport::DynamicApnea => "dynamic_apnea",
2664            SubSport::Enduro => "enduro",
2665            SubSport::Rucking => "rucking",
2666            SubSport::Rally => "rally",
2667            SubSport::PoolTriathlon => "pool_triathlon",
2668            SubSport::EBikeEnduro => "e_bike_enduro",
2669            SubSport::All => "all",
2670        }
2671    }
2672
2673    /// Try to construct from the underlying numeric value.
2674    pub fn from_value(value: u8) -> Option<Self> {
2675        match value {
2676            0 => Some(SubSport::Generic),
2677            1 => Some(SubSport::Treadmill),
2678            2 => Some(SubSport::Street),
2679            3 => Some(SubSport::Trail),
2680            4 => Some(SubSport::Track),
2681            5 => Some(SubSport::Spin),
2682            6 => Some(SubSport::IndoorCycling),
2683            7 => Some(SubSport::Road),
2684            8 => Some(SubSport::Mountain),
2685            9 => Some(SubSport::Downhill),
2686            10 => Some(SubSport::Recumbent),
2687            11 => Some(SubSport::Cyclocross),
2688            12 => Some(SubSport::HandCycling),
2689            13 => Some(SubSport::TrackCycling),
2690            14 => Some(SubSport::IndoorRowing),
2691            15 => Some(SubSport::Elliptical),
2692            16 => Some(SubSport::StairClimbing),
2693            17 => Some(SubSport::LapSwimming),
2694            18 => Some(SubSport::OpenWater),
2695            19 => Some(SubSport::FlexibilityTraining),
2696            20 => Some(SubSport::StrengthTraining),
2697            21 => Some(SubSport::WarmUp),
2698            22 => Some(SubSport::Match),
2699            23 => Some(SubSport::Exercise),
2700            24 => Some(SubSport::Challenge),
2701            25 => Some(SubSport::IndoorSkiing),
2702            26 => Some(SubSport::CardioTraining),
2703            27 => Some(SubSport::IndoorWalking),
2704            28 => Some(SubSport::EBikeFitness),
2705            29 => Some(SubSport::Bmx),
2706            30 => Some(SubSport::CasualWalking),
2707            31 => Some(SubSport::SpeedWalking),
2708            32 => Some(SubSport::BikeToRunTransition),
2709            33 => Some(SubSport::RunToBikeTransition),
2710            34 => Some(SubSport::SwimToBikeTransition),
2711            35 => Some(SubSport::Atv),
2712            36 => Some(SubSport::Motocross),
2713            37 => Some(SubSport::Backcountry),
2714            38 => Some(SubSport::Resort),
2715            39 => Some(SubSport::RcDrone),
2716            40 => Some(SubSport::Wingsuit),
2717            41 => Some(SubSport::Whitewater),
2718            42 => Some(SubSport::SkateSkiing),
2719            43 => Some(SubSport::Yoga),
2720            44 => Some(SubSport::Pilates),
2721            45 => Some(SubSport::IndoorRunning),
2722            46 => Some(SubSport::GravelCycling),
2723            47 => Some(SubSport::EBikeMountain),
2724            48 => Some(SubSport::Commuting),
2725            49 => Some(SubSport::MixedSurface),
2726            50 => Some(SubSport::Navigate),
2727            51 => Some(SubSport::TrackMe),
2728            52 => Some(SubSport::Map),
2729            53 => Some(SubSport::SingleGasDiving),
2730            54 => Some(SubSport::MultiGasDiving),
2731            55 => Some(SubSport::GaugeDiving),
2732            56 => Some(SubSport::ApneaDiving),
2733            57 => Some(SubSport::ApneaHunting),
2734            58 => Some(SubSport::VirtualActivity),
2735            59 => Some(SubSport::Obstacle),
2736            62 => Some(SubSport::Breathing),
2737            63 => Some(SubSport::CcrDiving),
2738            65 => Some(SubSport::SailRace),
2739            66 => Some(SubSport::Expedition),
2740            67 => Some(SubSport::Ultra),
2741            68 => Some(SubSport::IndoorClimbing),
2742            69 => Some(SubSport::Bouldering),
2743            70 => Some(SubSport::Hiit),
2744            71 => Some(SubSport::IndoorGrinding),
2745            72 => Some(SubSport::HuntingWithDogs),
2746            73 => Some(SubSport::Amrap),
2747            74 => Some(SubSport::Emom),
2748            75 => Some(SubSport::Tabata),
2749            77 => Some(SubSport::Esport),
2750            78 => Some(SubSport::Triathlon),
2751            79 => Some(SubSport::Duathlon),
2752            80 => Some(SubSport::Brick),
2753            81 => Some(SubSport::SwimRun),
2754            82 => Some(SubSport::AdventureRace),
2755            83 => Some(SubSport::TruckerWorkout),
2756            84 => Some(SubSport::Pickleball),
2757            85 => Some(SubSport::Padel),
2758            86 => Some(SubSport::IndoorWheelchairWalk),
2759            87 => Some(SubSport::IndoorWheelchairRun),
2760            88 => Some(SubSport::IndoorHandCycling),
2761            90 => Some(SubSport::Field),
2762            91 => Some(SubSport::Ice),
2763            92 => Some(SubSport::Ultimate),
2764            93 => Some(SubSport::Platform),
2765            94 => Some(SubSport::Squash),
2766            95 => Some(SubSport::Badminton),
2767            96 => Some(SubSport::Racquetball),
2768            97 => Some(SubSport::TableTennis),
2769            98 => Some(SubSport::Overland),
2770            99 => Some(SubSport::TrollingMotor),
2771            110 => Some(SubSport::FlyCanopy),
2772            111 => Some(SubSport::FlyParaglide),
2773            112 => Some(SubSport::FlyParamotor),
2774            113 => Some(SubSport::FlyPressurized),
2775            114 => Some(SubSport::FlyNavigate),
2776            115 => Some(SubSport::FlyTimer),
2777            116 => Some(SubSport::FlyAltimeter),
2778            117 => Some(SubSport::FlyWx),
2779            118 => Some(SubSport::FlyVfr),
2780            119 => Some(SubSport::FlyIfr),
2781            121 => Some(SubSport::DynamicApnea),
2782            123 => Some(SubSport::Enduro),
2783            124 => Some(SubSport::Rucking),
2784            125 => Some(SubSport::Rally),
2785            126 => Some(SubSport::PoolTriathlon),
2786            127 => Some(SubSport::EBikeEnduro),
2787            254 => Some(SubSport::All),
2788            _ => None,
2789        }
2790    }
2791
2792    /// Try to construct from the snake-case canonical name.
2793    pub fn from_str(name: &str) -> Option<Self> {
2794        match name {
2795            "generic" => Some(SubSport::Generic),
2796            "treadmill" => Some(SubSport::Treadmill),
2797            "street" => Some(SubSport::Street),
2798            "trail" => Some(SubSport::Trail),
2799            "track" => Some(SubSport::Track),
2800            "spin" => Some(SubSport::Spin),
2801            "indoor_cycling" => Some(SubSport::IndoorCycling),
2802            "road" => Some(SubSport::Road),
2803            "mountain" => Some(SubSport::Mountain),
2804            "downhill" => Some(SubSport::Downhill),
2805            "recumbent" => Some(SubSport::Recumbent),
2806            "cyclocross" => Some(SubSport::Cyclocross),
2807            "hand_cycling" => Some(SubSport::HandCycling),
2808            "track_cycling" => Some(SubSport::TrackCycling),
2809            "indoor_rowing" => Some(SubSport::IndoorRowing),
2810            "elliptical" => Some(SubSport::Elliptical),
2811            "stair_climbing" => Some(SubSport::StairClimbing),
2812            "lap_swimming" => Some(SubSport::LapSwimming),
2813            "open_water" => Some(SubSport::OpenWater),
2814            "flexibility_training" => Some(SubSport::FlexibilityTraining),
2815            "strength_training" => Some(SubSport::StrengthTraining),
2816            "warm_up" => Some(SubSport::WarmUp),
2817            "match" => Some(SubSport::Match),
2818            "exercise" => Some(SubSport::Exercise),
2819            "challenge" => Some(SubSport::Challenge),
2820            "indoor_skiing" => Some(SubSport::IndoorSkiing),
2821            "cardio_training" => Some(SubSport::CardioTraining),
2822            "indoor_walking" => Some(SubSport::IndoorWalking),
2823            "e_bike_fitness" => Some(SubSport::EBikeFitness),
2824            "bmx" => Some(SubSport::Bmx),
2825            "casual_walking" => Some(SubSport::CasualWalking),
2826            "speed_walking" => Some(SubSport::SpeedWalking),
2827            "bike_to_run_transition" => Some(SubSport::BikeToRunTransition),
2828            "run_to_bike_transition" => Some(SubSport::RunToBikeTransition),
2829            "swim_to_bike_transition" => Some(SubSport::SwimToBikeTransition),
2830            "atv" => Some(SubSport::Atv),
2831            "motocross" => Some(SubSport::Motocross),
2832            "backcountry" => Some(SubSport::Backcountry),
2833            "resort" => Some(SubSport::Resort),
2834            "rc_drone" => Some(SubSport::RcDrone),
2835            "wingsuit" => Some(SubSport::Wingsuit),
2836            "whitewater" => Some(SubSport::Whitewater),
2837            "skate_skiing" => Some(SubSport::SkateSkiing),
2838            "yoga" => Some(SubSport::Yoga),
2839            "pilates" => Some(SubSport::Pilates),
2840            "indoor_running" => Some(SubSport::IndoorRunning),
2841            "gravel_cycling" => Some(SubSport::GravelCycling),
2842            "e_bike_mountain" => Some(SubSport::EBikeMountain),
2843            "commuting" => Some(SubSport::Commuting),
2844            "mixed_surface" => Some(SubSport::MixedSurface),
2845            "navigate" => Some(SubSport::Navigate),
2846            "track_me" => Some(SubSport::TrackMe),
2847            "map" => Some(SubSport::Map),
2848            "single_gas_diving" => Some(SubSport::SingleGasDiving),
2849            "multi_gas_diving" => Some(SubSport::MultiGasDiving),
2850            "gauge_diving" => Some(SubSport::GaugeDiving),
2851            "apnea_diving" => Some(SubSport::ApneaDiving),
2852            "apnea_hunting" => Some(SubSport::ApneaHunting),
2853            "virtual_activity" => Some(SubSport::VirtualActivity),
2854            "obstacle" => Some(SubSport::Obstacle),
2855            "breathing" => Some(SubSport::Breathing),
2856            "ccr_diving" => Some(SubSport::CcrDiving),
2857            "sail_race" => Some(SubSport::SailRace),
2858            "expedition" => Some(SubSport::Expedition),
2859            "ultra" => Some(SubSport::Ultra),
2860            "indoor_climbing" => Some(SubSport::IndoorClimbing),
2861            "bouldering" => Some(SubSport::Bouldering),
2862            "hiit" => Some(SubSport::Hiit),
2863            "indoor_grinding" => Some(SubSport::IndoorGrinding),
2864            "hunting_with_dogs" => Some(SubSport::HuntingWithDogs),
2865            "amrap" => Some(SubSport::Amrap),
2866            "emom" => Some(SubSport::Emom),
2867            "tabata" => Some(SubSport::Tabata),
2868            "esport" => Some(SubSport::Esport),
2869            "triathlon" => Some(SubSport::Triathlon),
2870            "duathlon" => Some(SubSport::Duathlon),
2871            "brick" => Some(SubSport::Brick),
2872            "swim_run" => Some(SubSport::SwimRun),
2873            "adventure_race" => Some(SubSport::AdventureRace),
2874            "trucker_workout" => Some(SubSport::TruckerWorkout),
2875            "pickleball" => Some(SubSport::Pickleball),
2876            "padel" => Some(SubSport::Padel),
2877            "indoor_wheelchair_walk" => Some(SubSport::IndoorWheelchairWalk),
2878            "indoor_wheelchair_run" => Some(SubSport::IndoorWheelchairRun),
2879            "indoor_hand_cycling" => Some(SubSport::IndoorHandCycling),
2880            "field" => Some(SubSport::Field),
2881            "ice" => Some(SubSport::Ice),
2882            "ultimate" => Some(SubSport::Ultimate),
2883            "platform" => Some(SubSport::Platform),
2884            "squash" => Some(SubSport::Squash),
2885            "badminton" => Some(SubSport::Badminton),
2886            "racquetball" => Some(SubSport::Racquetball),
2887            "table_tennis" => Some(SubSport::TableTennis),
2888            "overland" => Some(SubSport::Overland),
2889            "trolling_motor" => Some(SubSport::TrollingMotor),
2890            "fly_canopy" => Some(SubSport::FlyCanopy),
2891            "fly_paraglide" => Some(SubSport::FlyParaglide),
2892            "fly_paramotor" => Some(SubSport::FlyParamotor),
2893            "fly_pressurized" => Some(SubSport::FlyPressurized),
2894            "fly_navigate" => Some(SubSport::FlyNavigate),
2895            "fly_timer" => Some(SubSport::FlyTimer),
2896            "fly_altimeter" => Some(SubSport::FlyAltimeter),
2897            "fly_wx" => Some(SubSport::FlyWx),
2898            "fly_vfr" => Some(SubSport::FlyVfr),
2899            "fly_ifr" => Some(SubSport::FlyIfr),
2900            "dynamic_apnea" => Some(SubSport::DynamicApnea),
2901            "enduro" => Some(SubSport::Enduro),
2902            "rucking" => Some(SubSport::Rucking),
2903            "rally" => Some(SubSport::Rally),
2904            "pool_triathlon" => Some(SubSport::PoolTriathlon),
2905            "e_bike_enduro" => Some(SubSport::EBikeEnduro),
2906            "all" => Some(SubSport::All),
2907            _ => None,
2908        }
2909    }
2910}
2911
2912#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
2913#[repr(u8)]
2914#[non_exhaustive]
2915pub enum SportEvent {
2916    Uncategorized = 0,
2917    Geocaching = 1,
2918    Fitness = 2,
2919    Recreation = 3,
2920    Race = 4,
2921    SpecialEvent = 5,
2922    Training = 6,
2923    Transportation = 7,
2924    Touring = 8,
2925}
2926
2927impl SportEvent {
2928    /// Snake-case canonical name from Profile.xlsx.
2929    pub fn as_str(&self) -> &'static str {
2930        match self {
2931            SportEvent::Uncategorized => "uncategorized",
2932            SportEvent::Geocaching => "geocaching",
2933            SportEvent::Fitness => "fitness",
2934            SportEvent::Recreation => "recreation",
2935            SportEvent::Race => "race",
2936            SportEvent::SpecialEvent => "special_event",
2937            SportEvent::Training => "training",
2938            SportEvent::Transportation => "transportation",
2939            SportEvent::Touring => "touring",
2940        }
2941    }
2942
2943    /// Try to construct from the underlying numeric value.
2944    pub fn from_value(value: u8) -> Option<Self> {
2945        match value {
2946            0 => Some(SportEvent::Uncategorized),
2947            1 => Some(SportEvent::Geocaching),
2948            2 => Some(SportEvent::Fitness),
2949            3 => Some(SportEvent::Recreation),
2950            4 => Some(SportEvent::Race),
2951            5 => Some(SportEvent::SpecialEvent),
2952            6 => Some(SportEvent::Training),
2953            7 => Some(SportEvent::Transportation),
2954            8 => Some(SportEvent::Touring),
2955            _ => None,
2956        }
2957    }
2958
2959    /// Try to construct from the snake-case canonical name.
2960    pub fn from_str(name: &str) -> Option<Self> {
2961        match name {
2962            "uncategorized" => Some(SportEvent::Uncategorized),
2963            "geocaching" => Some(SportEvent::Geocaching),
2964            "fitness" => Some(SportEvent::Fitness),
2965            "recreation" => Some(SportEvent::Recreation),
2966            "race" => Some(SportEvent::Race),
2967            "special_event" => Some(SportEvent::SpecialEvent),
2968            "training" => Some(SportEvent::Training),
2969            "transportation" => Some(SportEvent::Transportation),
2970            "touring" => Some(SportEvent::Touring),
2971            _ => None,
2972        }
2973    }
2974}
2975
2976#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
2977#[repr(u8)]
2978#[non_exhaustive]
2979pub enum Activity {
2980    Manual = 0,
2981    AutoMultiSport = 1,
2982}
2983
2984impl Activity {
2985    /// Snake-case canonical name from Profile.xlsx.
2986    pub fn as_str(&self) -> &'static str {
2987        match self {
2988            Activity::Manual => "manual",
2989            Activity::AutoMultiSport => "auto_multi_sport",
2990        }
2991    }
2992
2993    /// Try to construct from the underlying numeric value.
2994    pub fn from_value(value: u8) -> Option<Self> {
2995        match value {
2996            0 => Some(Activity::Manual),
2997            1 => Some(Activity::AutoMultiSport),
2998            _ => None,
2999        }
3000    }
3001
3002    /// Try to construct from the snake-case canonical name.
3003    pub fn from_str(name: &str) -> Option<Self> {
3004        match name {
3005            "manual" => Some(Activity::Manual),
3006            "auto_multi_sport" => Some(Activity::AutoMultiSport),
3007            _ => None,
3008        }
3009    }
3010}
3011
3012#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
3013#[repr(u8)]
3014#[non_exhaustive]
3015pub enum Intensity {
3016    Active = 0,
3017    Rest = 1,
3018    Warmup = 2,
3019    Cooldown = 3,
3020    Recovery = 4,
3021    Interval = 5,
3022    Other = 6,
3023}
3024
3025impl Intensity {
3026    /// Snake-case canonical name from Profile.xlsx.
3027    pub fn as_str(&self) -> &'static str {
3028        match self {
3029            Intensity::Active => "active",
3030            Intensity::Rest => "rest",
3031            Intensity::Warmup => "warmup",
3032            Intensity::Cooldown => "cooldown",
3033            Intensity::Recovery => "recovery",
3034            Intensity::Interval => "interval",
3035            Intensity::Other => "other",
3036        }
3037    }
3038
3039    /// Try to construct from the underlying numeric value.
3040    pub fn from_value(value: u8) -> Option<Self> {
3041        match value {
3042            0 => Some(Intensity::Active),
3043            1 => Some(Intensity::Rest),
3044            2 => Some(Intensity::Warmup),
3045            3 => Some(Intensity::Cooldown),
3046            4 => Some(Intensity::Recovery),
3047            5 => Some(Intensity::Interval),
3048            6 => Some(Intensity::Other),
3049            _ => None,
3050        }
3051    }
3052
3053    /// Try to construct from the snake-case canonical name.
3054    pub fn from_str(name: &str) -> Option<Self> {
3055        match name {
3056            "active" => Some(Intensity::Active),
3057            "rest" => Some(Intensity::Rest),
3058            "warmup" => Some(Intensity::Warmup),
3059            "cooldown" => Some(Intensity::Cooldown),
3060            "recovery" => Some(Intensity::Recovery),
3061            "interval" => Some(Intensity::Interval),
3062            "other" => Some(Intensity::Other),
3063            _ => None,
3064        }
3065    }
3066}
3067
3068#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
3069#[repr(u8)]
3070#[non_exhaustive]
3071pub enum SessionTrigger {
3072    ActivityEnd = 0,
3073    Manual = 1,
3074    AutoMultiSport = 2,
3075    FitnessEquipment = 3,
3076}
3077
3078impl SessionTrigger {
3079    /// Snake-case canonical name from Profile.xlsx.
3080    pub fn as_str(&self) -> &'static str {
3081        match self {
3082            SessionTrigger::ActivityEnd => "activity_end",
3083            SessionTrigger::Manual => "manual",
3084            SessionTrigger::AutoMultiSport => "auto_multi_sport",
3085            SessionTrigger::FitnessEquipment => "fitness_equipment",
3086        }
3087    }
3088
3089    /// Try to construct from the underlying numeric value.
3090    pub fn from_value(value: u8) -> Option<Self> {
3091        match value {
3092            0 => Some(SessionTrigger::ActivityEnd),
3093            1 => Some(SessionTrigger::Manual),
3094            2 => Some(SessionTrigger::AutoMultiSport),
3095            3 => Some(SessionTrigger::FitnessEquipment),
3096            _ => None,
3097        }
3098    }
3099
3100    /// Try to construct from the snake-case canonical name.
3101    pub fn from_str(name: &str) -> Option<Self> {
3102        match name {
3103            "activity_end" => Some(SessionTrigger::ActivityEnd),
3104            "manual" => Some(SessionTrigger::Manual),
3105            "auto_multi_sport" => Some(SessionTrigger::AutoMultiSport),
3106            "fitness_equipment" => Some(SessionTrigger::FitnessEquipment),
3107            _ => None,
3108        }
3109    }
3110}
3111
3112#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
3113#[repr(u8)]
3114#[non_exhaustive]
3115pub enum AutolapTrigger {
3116    Time = 0,
3117    Distance = 1,
3118    PositionStart = 2,
3119    PositionLap = 3,
3120    PositionWaypoint = 4,
3121    PositionMarked = 5,
3122    Off = 6,
3123    AutoSelect = 13,
3124}
3125
3126impl AutolapTrigger {
3127    /// Snake-case canonical name from Profile.xlsx.
3128    pub fn as_str(&self) -> &'static str {
3129        match self {
3130            AutolapTrigger::Time => "time",
3131            AutolapTrigger::Distance => "distance",
3132            AutolapTrigger::PositionStart => "position_start",
3133            AutolapTrigger::PositionLap => "position_lap",
3134            AutolapTrigger::PositionWaypoint => "position_waypoint",
3135            AutolapTrigger::PositionMarked => "position_marked",
3136            AutolapTrigger::Off => "off",
3137            AutolapTrigger::AutoSelect => "auto_select",
3138        }
3139    }
3140
3141    /// Try to construct from the underlying numeric value.
3142    pub fn from_value(value: u8) -> Option<Self> {
3143        match value {
3144            0 => Some(AutolapTrigger::Time),
3145            1 => Some(AutolapTrigger::Distance),
3146            2 => Some(AutolapTrigger::PositionStart),
3147            3 => Some(AutolapTrigger::PositionLap),
3148            4 => Some(AutolapTrigger::PositionWaypoint),
3149            5 => Some(AutolapTrigger::PositionMarked),
3150            6 => Some(AutolapTrigger::Off),
3151            13 => Some(AutolapTrigger::AutoSelect),
3152            _ => None,
3153        }
3154    }
3155
3156    /// Try to construct from the snake-case canonical name.
3157    pub fn from_str(name: &str) -> Option<Self> {
3158        match name {
3159            "time" => Some(AutolapTrigger::Time),
3160            "distance" => Some(AutolapTrigger::Distance),
3161            "position_start" => Some(AutolapTrigger::PositionStart),
3162            "position_lap" => Some(AutolapTrigger::PositionLap),
3163            "position_waypoint" => Some(AutolapTrigger::PositionWaypoint),
3164            "position_marked" => Some(AutolapTrigger::PositionMarked),
3165            "off" => Some(AutolapTrigger::Off),
3166            "auto_select" => Some(AutolapTrigger::AutoSelect),
3167            _ => None,
3168        }
3169    }
3170}
3171
3172#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
3173#[repr(u8)]
3174#[non_exhaustive]
3175pub enum LapTrigger {
3176    Manual = 0,
3177    Time = 1,
3178    Distance = 2,
3179    PositionStart = 3,
3180    PositionLap = 4,
3181    PositionWaypoint = 5,
3182    PositionMarked = 6,
3183    SessionEnd = 7,
3184    FitnessEquipment = 8,
3185}
3186
3187impl LapTrigger {
3188    /// Snake-case canonical name from Profile.xlsx.
3189    pub fn as_str(&self) -> &'static str {
3190        match self {
3191            LapTrigger::Manual => "manual",
3192            LapTrigger::Time => "time",
3193            LapTrigger::Distance => "distance",
3194            LapTrigger::PositionStart => "position_start",
3195            LapTrigger::PositionLap => "position_lap",
3196            LapTrigger::PositionWaypoint => "position_waypoint",
3197            LapTrigger::PositionMarked => "position_marked",
3198            LapTrigger::SessionEnd => "session_end",
3199            LapTrigger::FitnessEquipment => "fitness_equipment",
3200        }
3201    }
3202
3203    /// Try to construct from the underlying numeric value.
3204    pub fn from_value(value: u8) -> Option<Self> {
3205        match value {
3206            0 => Some(LapTrigger::Manual),
3207            1 => Some(LapTrigger::Time),
3208            2 => Some(LapTrigger::Distance),
3209            3 => Some(LapTrigger::PositionStart),
3210            4 => Some(LapTrigger::PositionLap),
3211            5 => Some(LapTrigger::PositionWaypoint),
3212            6 => Some(LapTrigger::PositionMarked),
3213            7 => Some(LapTrigger::SessionEnd),
3214            8 => Some(LapTrigger::FitnessEquipment),
3215            _ => None,
3216        }
3217    }
3218
3219    /// Try to construct from the snake-case canonical name.
3220    pub fn from_str(name: &str) -> Option<Self> {
3221        match name {
3222            "manual" => Some(LapTrigger::Manual),
3223            "time" => Some(LapTrigger::Time),
3224            "distance" => Some(LapTrigger::Distance),
3225            "position_start" => Some(LapTrigger::PositionStart),
3226            "position_lap" => Some(LapTrigger::PositionLap),
3227            "position_waypoint" => Some(LapTrigger::PositionWaypoint),
3228            "position_marked" => Some(LapTrigger::PositionMarked),
3229            "session_end" => Some(LapTrigger::SessionEnd),
3230            "fitness_equipment" => Some(LapTrigger::FitnessEquipment),
3231            _ => None,
3232        }
3233    }
3234}
3235
3236#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
3237#[repr(u8)]
3238#[non_exhaustive]
3239pub enum TimeMode {
3240    Hour12 = 0,
3241    Hour24 = 1,
3242    Military = 2,
3243    Hour12WithSeconds = 3,
3244    Hour24WithSeconds = 4,
3245    Utc = 5,
3246}
3247
3248impl TimeMode {
3249    /// Snake-case canonical name from Profile.xlsx.
3250    pub fn as_str(&self) -> &'static str {
3251        match self {
3252            TimeMode::Hour12 => "hour12",
3253            TimeMode::Hour24 => "hour24",
3254            TimeMode::Military => "military",
3255            TimeMode::Hour12WithSeconds => "hour_12_with_seconds",
3256            TimeMode::Hour24WithSeconds => "hour_24_with_seconds",
3257            TimeMode::Utc => "utc",
3258        }
3259    }
3260
3261    /// Try to construct from the underlying numeric value.
3262    pub fn from_value(value: u8) -> Option<Self> {
3263        match value {
3264            0 => Some(TimeMode::Hour12),
3265            1 => Some(TimeMode::Hour24),
3266            2 => Some(TimeMode::Military),
3267            3 => Some(TimeMode::Hour12WithSeconds),
3268            4 => Some(TimeMode::Hour24WithSeconds),
3269            5 => Some(TimeMode::Utc),
3270            _ => None,
3271        }
3272    }
3273
3274    /// Try to construct from the snake-case canonical name.
3275    pub fn from_str(name: &str) -> Option<Self> {
3276        match name {
3277            "hour12" => Some(TimeMode::Hour12),
3278            "hour24" => Some(TimeMode::Hour24),
3279            "military" => Some(TimeMode::Military),
3280            "hour_12_with_seconds" => Some(TimeMode::Hour12WithSeconds),
3281            "hour_24_with_seconds" => Some(TimeMode::Hour24WithSeconds),
3282            "utc" => Some(TimeMode::Utc),
3283            _ => None,
3284        }
3285    }
3286}
3287
3288#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
3289#[repr(u8)]
3290#[non_exhaustive]
3291pub enum BacklightMode {
3292    Off = 0,
3293    Manual = 1,
3294    KeyAndMessages = 2,
3295    AutoBrightness = 3,
3296    SmartNotifications = 4,
3297    KeyAndMessagesNight = 5,
3298    KeyAndMessagesAndSmartNotifications = 6,
3299}
3300
3301impl BacklightMode {
3302    /// Snake-case canonical name from Profile.xlsx.
3303    pub fn as_str(&self) -> &'static str {
3304        match self {
3305            BacklightMode::Off => "off",
3306            BacklightMode::Manual => "manual",
3307            BacklightMode::KeyAndMessages => "key_and_messages",
3308            BacklightMode::AutoBrightness => "auto_brightness",
3309            BacklightMode::SmartNotifications => "smart_notifications",
3310            BacklightMode::KeyAndMessagesNight => "key_and_messages_night",
3311            BacklightMode::KeyAndMessagesAndSmartNotifications => {
3312                "key_and_messages_and_smart_notifications"
3313            }
3314        }
3315    }
3316
3317    /// Try to construct from the underlying numeric value.
3318    pub fn from_value(value: u8) -> Option<Self> {
3319        match value {
3320            0 => Some(BacklightMode::Off),
3321            1 => Some(BacklightMode::Manual),
3322            2 => Some(BacklightMode::KeyAndMessages),
3323            3 => Some(BacklightMode::AutoBrightness),
3324            4 => Some(BacklightMode::SmartNotifications),
3325            5 => Some(BacklightMode::KeyAndMessagesNight),
3326            6 => Some(BacklightMode::KeyAndMessagesAndSmartNotifications),
3327            _ => None,
3328        }
3329    }
3330
3331    /// Try to construct from the snake-case canonical name.
3332    pub fn from_str(name: &str) -> Option<Self> {
3333        match name {
3334            "off" => Some(BacklightMode::Off),
3335            "manual" => Some(BacklightMode::Manual),
3336            "key_and_messages" => Some(BacklightMode::KeyAndMessages),
3337            "auto_brightness" => Some(BacklightMode::AutoBrightness),
3338            "smart_notifications" => Some(BacklightMode::SmartNotifications),
3339            "key_and_messages_night" => Some(BacklightMode::KeyAndMessagesNight),
3340            "key_and_messages_and_smart_notifications" => {
3341                Some(BacklightMode::KeyAndMessagesAndSmartNotifications)
3342            }
3343            _ => None,
3344        }
3345    }
3346}
3347
3348#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
3349#[repr(u8)]
3350#[non_exhaustive]
3351pub enum DateMode {
3352    DayMonth = 0,
3353    MonthDay = 1,
3354}
3355
3356impl DateMode {
3357    /// Snake-case canonical name from Profile.xlsx.
3358    pub fn as_str(&self) -> &'static str {
3359        match self {
3360            DateMode::DayMonth => "day_month",
3361            DateMode::MonthDay => "month_day",
3362        }
3363    }
3364
3365    /// Try to construct from the underlying numeric value.
3366    pub fn from_value(value: u8) -> Option<Self> {
3367        match value {
3368            0 => Some(DateMode::DayMonth),
3369            1 => Some(DateMode::MonthDay),
3370            _ => None,
3371        }
3372    }
3373
3374    /// Try to construct from the snake-case canonical name.
3375    pub fn from_str(name: &str) -> Option<Self> {
3376        match name {
3377            "day_month" => Some(DateMode::DayMonth),
3378            "month_day" => Some(DateMode::MonthDay),
3379            _ => None,
3380        }
3381    }
3382}
3383
3384#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
3385#[repr(u8)]
3386#[non_exhaustive]
3387pub enum BacklightTimeout {
3388    Infinite = 0,
3389}
3390
3391impl BacklightTimeout {
3392    /// Snake-case canonical name from Profile.xlsx.
3393    pub fn as_str(&self) -> &'static str {
3394        match self {
3395            BacklightTimeout::Infinite => "infinite",
3396        }
3397    }
3398
3399    /// Try to construct from the underlying numeric value.
3400    pub fn from_value(value: u8) -> Option<Self> {
3401        match value {
3402            0 => Some(BacklightTimeout::Infinite),
3403            _ => None,
3404        }
3405    }
3406
3407    /// Try to construct from the snake-case canonical name.
3408    pub fn from_str(name: &str) -> Option<Self> {
3409        match name {
3410            "infinite" => Some(BacklightTimeout::Infinite),
3411            _ => None,
3412        }
3413    }
3414}
3415
3416#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
3417#[repr(u8)]
3418#[non_exhaustive]
3419pub enum Event {
3420    Timer = 0,
3421    Workout = 3,
3422    WorkoutStep = 4,
3423    PowerDown = 5,
3424    PowerUp = 6,
3425    OffCourse = 7,
3426    Session = 8,
3427    Lap = 9,
3428    CoursePoint = 10,
3429    Battery = 11,
3430    VirtualPartnerPace = 12,
3431    HrHighAlert = 13,
3432    HrLowAlert = 14,
3433    SpeedHighAlert = 15,
3434    SpeedLowAlert = 16,
3435    CadHighAlert = 17,
3436    CadLowAlert = 18,
3437    PowerHighAlert = 19,
3438    PowerLowAlert = 20,
3439    RecoveryHr = 21,
3440    BatteryLow = 22,
3441    TimeDurationAlert = 23,
3442    DistanceDurationAlert = 24,
3443    CalorieDurationAlert = 25,
3444    Activity = 26,
3445    FitnessEquipment = 27,
3446    Length = 28,
3447    UserMarker = 32,
3448    SportPoint = 33,
3449    Calibration = 36,
3450    FrontGearChange = 42,
3451    RearGearChange = 43,
3452    RiderPositionChange = 44,
3453    ElevHighAlert = 45,
3454    ElevLowAlert = 46,
3455    CommTimeout = 47,
3456    AutoActivityDetect = 54,
3457    DiveAlert = 56,
3458    DiveGasSwitched = 57,
3459    TankPressureReserve = 71,
3460    TankPressureCritical = 72,
3461    TankLost = 73,
3462    RadarThreatAlert = 75,
3463    TankBatteryLow = 76,
3464    TankPodConnected = 81,
3465    TankPodDisconnected = 82,
3466}
3467
3468impl Event {
3469    /// Snake-case canonical name from Profile.xlsx.
3470    pub fn as_str(&self) -> &'static str {
3471        match self {
3472            Event::Timer => "timer",
3473            Event::Workout => "workout",
3474            Event::WorkoutStep => "workout_step",
3475            Event::PowerDown => "power_down",
3476            Event::PowerUp => "power_up",
3477            Event::OffCourse => "off_course",
3478            Event::Session => "session",
3479            Event::Lap => "lap",
3480            Event::CoursePoint => "course_point",
3481            Event::Battery => "battery",
3482            Event::VirtualPartnerPace => "virtual_partner_pace",
3483            Event::HrHighAlert => "hr_high_alert",
3484            Event::HrLowAlert => "hr_low_alert",
3485            Event::SpeedHighAlert => "speed_high_alert",
3486            Event::SpeedLowAlert => "speed_low_alert",
3487            Event::CadHighAlert => "cad_high_alert",
3488            Event::CadLowAlert => "cad_low_alert",
3489            Event::PowerHighAlert => "power_high_alert",
3490            Event::PowerLowAlert => "power_low_alert",
3491            Event::RecoveryHr => "recovery_hr",
3492            Event::BatteryLow => "battery_low",
3493            Event::TimeDurationAlert => "time_duration_alert",
3494            Event::DistanceDurationAlert => "distance_duration_alert",
3495            Event::CalorieDurationAlert => "calorie_duration_alert",
3496            Event::Activity => "activity",
3497            Event::FitnessEquipment => "fitness_equipment",
3498            Event::Length => "length",
3499            Event::UserMarker => "user_marker",
3500            Event::SportPoint => "sport_point",
3501            Event::Calibration => "calibration",
3502            Event::FrontGearChange => "front_gear_change",
3503            Event::RearGearChange => "rear_gear_change",
3504            Event::RiderPositionChange => "rider_position_change",
3505            Event::ElevHighAlert => "elev_high_alert",
3506            Event::ElevLowAlert => "elev_low_alert",
3507            Event::CommTimeout => "comm_timeout",
3508            Event::AutoActivityDetect => "auto_activity_detect",
3509            Event::DiveAlert => "dive_alert",
3510            Event::DiveGasSwitched => "dive_gas_switched",
3511            Event::TankPressureReserve => "tank_pressure_reserve",
3512            Event::TankPressureCritical => "tank_pressure_critical",
3513            Event::TankLost => "tank_lost",
3514            Event::RadarThreatAlert => "radar_threat_alert",
3515            Event::TankBatteryLow => "tank_battery_low",
3516            Event::TankPodConnected => "tank_pod_connected",
3517            Event::TankPodDisconnected => "tank_pod_disconnected",
3518        }
3519    }
3520
3521    /// Try to construct from the underlying numeric value.
3522    pub fn from_value(value: u8) -> Option<Self> {
3523        match value {
3524            0 => Some(Event::Timer),
3525            3 => Some(Event::Workout),
3526            4 => Some(Event::WorkoutStep),
3527            5 => Some(Event::PowerDown),
3528            6 => Some(Event::PowerUp),
3529            7 => Some(Event::OffCourse),
3530            8 => Some(Event::Session),
3531            9 => Some(Event::Lap),
3532            10 => Some(Event::CoursePoint),
3533            11 => Some(Event::Battery),
3534            12 => Some(Event::VirtualPartnerPace),
3535            13 => Some(Event::HrHighAlert),
3536            14 => Some(Event::HrLowAlert),
3537            15 => Some(Event::SpeedHighAlert),
3538            16 => Some(Event::SpeedLowAlert),
3539            17 => Some(Event::CadHighAlert),
3540            18 => Some(Event::CadLowAlert),
3541            19 => Some(Event::PowerHighAlert),
3542            20 => Some(Event::PowerLowAlert),
3543            21 => Some(Event::RecoveryHr),
3544            22 => Some(Event::BatteryLow),
3545            23 => Some(Event::TimeDurationAlert),
3546            24 => Some(Event::DistanceDurationAlert),
3547            25 => Some(Event::CalorieDurationAlert),
3548            26 => Some(Event::Activity),
3549            27 => Some(Event::FitnessEquipment),
3550            28 => Some(Event::Length),
3551            32 => Some(Event::UserMarker),
3552            33 => Some(Event::SportPoint),
3553            36 => Some(Event::Calibration),
3554            42 => Some(Event::FrontGearChange),
3555            43 => Some(Event::RearGearChange),
3556            44 => Some(Event::RiderPositionChange),
3557            45 => Some(Event::ElevHighAlert),
3558            46 => Some(Event::ElevLowAlert),
3559            47 => Some(Event::CommTimeout),
3560            54 => Some(Event::AutoActivityDetect),
3561            56 => Some(Event::DiveAlert),
3562            57 => Some(Event::DiveGasSwitched),
3563            71 => Some(Event::TankPressureReserve),
3564            72 => Some(Event::TankPressureCritical),
3565            73 => Some(Event::TankLost),
3566            75 => Some(Event::RadarThreatAlert),
3567            76 => Some(Event::TankBatteryLow),
3568            81 => Some(Event::TankPodConnected),
3569            82 => Some(Event::TankPodDisconnected),
3570            _ => None,
3571        }
3572    }
3573
3574    /// Try to construct from the snake-case canonical name.
3575    pub fn from_str(name: &str) -> Option<Self> {
3576        match name {
3577            "timer" => Some(Event::Timer),
3578            "workout" => Some(Event::Workout),
3579            "workout_step" => Some(Event::WorkoutStep),
3580            "power_down" => Some(Event::PowerDown),
3581            "power_up" => Some(Event::PowerUp),
3582            "off_course" => Some(Event::OffCourse),
3583            "session" => Some(Event::Session),
3584            "lap" => Some(Event::Lap),
3585            "course_point" => Some(Event::CoursePoint),
3586            "battery" => Some(Event::Battery),
3587            "virtual_partner_pace" => Some(Event::VirtualPartnerPace),
3588            "hr_high_alert" => Some(Event::HrHighAlert),
3589            "hr_low_alert" => Some(Event::HrLowAlert),
3590            "speed_high_alert" => Some(Event::SpeedHighAlert),
3591            "speed_low_alert" => Some(Event::SpeedLowAlert),
3592            "cad_high_alert" => Some(Event::CadHighAlert),
3593            "cad_low_alert" => Some(Event::CadLowAlert),
3594            "power_high_alert" => Some(Event::PowerHighAlert),
3595            "power_low_alert" => Some(Event::PowerLowAlert),
3596            "recovery_hr" => Some(Event::RecoveryHr),
3597            "battery_low" => Some(Event::BatteryLow),
3598            "time_duration_alert" => Some(Event::TimeDurationAlert),
3599            "distance_duration_alert" => Some(Event::DistanceDurationAlert),
3600            "calorie_duration_alert" => Some(Event::CalorieDurationAlert),
3601            "activity" => Some(Event::Activity),
3602            "fitness_equipment" => Some(Event::FitnessEquipment),
3603            "length" => Some(Event::Length),
3604            "user_marker" => Some(Event::UserMarker),
3605            "sport_point" => Some(Event::SportPoint),
3606            "calibration" => Some(Event::Calibration),
3607            "front_gear_change" => Some(Event::FrontGearChange),
3608            "rear_gear_change" => Some(Event::RearGearChange),
3609            "rider_position_change" => Some(Event::RiderPositionChange),
3610            "elev_high_alert" => Some(Event::ElevHighAlert),
3611            "elev_low_alert" => Some(Event::ElevLowAlert),
3612            "comm_timeout" => Some(Event::CommTimeout),
3613            "auto_activity_detect" => Some(Event::AutoActivityDetect),
3614            "dive_alert" => Some(Event::DiveAlert),
3615            "dive_gas_switched" => Some(Event::DiveGasSwitched),
3616            "tank_pressure_reserve" => Some(Event::TankPressureReserve),
3617            "tank_pressure_critical" => Some(Event::TankPressureCritical),
3618            "tank_lost" => Some(Event::TankLost),
3619            "radar_threat_alert" => Some(Event::RadarThreatAlert),
3620            "tank_battery_low" => Some(Event::TankBatteryLow),
3621            "tank_pod_connected" => Some(Event::TankPodConnected),
3622            "tank_pod_disconnected" => Some(Event::TankPodDisconnected),
3623            _ => None,
3624        }
3625    }
3626}
3627
3628#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
3629#[repr(u8)]
3630#[non_exhaustive]
3631pub enum EventType {
3632    Start = 0,
3633    Stop = 1,
3634    ConsecutiveDepreciated = 2,
3635    Marker = 3,
3636    StopAll = 4,
3637    BeginDepreciated = 5,
3638    EndDepreciated = 6,
3639    EndAllDepreciated = 7,
3640    StopDisable = 8,
3641    StopDisableAll = 9,
3642}
3643
3644impl EventType {
3645    /// Snake-case canonical name from Profile.xlsx.
3646    pub fn as_str(&self) -> &'static str {
3647        match self {
3648            EventType::Start => "start",
3649            EventType::Stop => "stop",
3650            EventType::ConsecutiveDepreciated => "consecutive_depreciated",
3651            EventType::Marker => "marker",
3652            EventType::StopAll => "stop_all",
3653            EventType::BeginDepreciated => "begin_depreciated",
3654            EventType::EndDepreciated => "end_depreciated",
3655            EventType::EndAllDepreciated => "end_all_depreciated",
3656            EventType::StopDisable => "stop_disable",
3657            EventType::StopDisableAll => "stop_disable_all",
3658        }
3659    }
3660
3661    /// Try to construct from the underlying numeric value.
3662    pub fn from_value(value: u8) -> Option<Self> {
3663        match value {
3664            0 => Some(EventType::Start),
3665            1 => Some(EventType::Stop),
3666            2 => Some(EventType::ConsecutiveDepreciated),
3667            3 => Some(EventType::Marker),
3668            4 => Some(EventType::StopAll),
3669            5 => Some(EventType::BeginDepreciated),
3670            6 => Some(EventType::EndDepreciated),
3671            7 => Some(EventType::EndAllDepreciated),
3672            8 => Some(EventType::StopDisable),
3673            9 => Some(EventType::StopDisableAll),
3674            _ => None,
3675        }
3676    }
3677
3678    /// Try to construct from the snake-case canonical name.
3679    pub fn from_str(name: &str) -> Option<Self> {
3680        match name {
3681            "start" => Some(EventType::Start),
3682            "stop" => Some(EventType::Stop),
3683            "consecutive_depreciated" => Some(EventType::ConsecutiveDepreciated),
3684            "marker" => Some(EventType::Marker),
3685            "stop_all" => Some(EventType::StopAll),
3686            "begin_depreciated" => Some(EventType::BeginDepreciated),
3687            "end_depreciated" => Some(EventType::EndDepreciated),
3688            "end_all_depreciated" => Some(EventType::EndAllDepreciated),
3689            "stop_disable" => Some(EventType::StopDisable),
3690            "stop_disable_all" => Some(EventType::StopDisableAll),
3691            _ => None,
3692        }
3693    }
3694}
3695
3696#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
3697#[repr(u8)]
3698#[non_exhaustive]
3699pub enum TimerTrigger {
3700    Manual = 0,
3701    Auto = 1,
3702    FitnessEquipment = 2,
3703}
3704
3705impl TimerTrigger {
3706    /// Snake-case canonical name from Profile.xlsx.
3707    pub fn as_str(&self) -> &'static str {
3708        match self {
3709            TimerTrigger::Manual => "manual",
3710            TimerTrigger::Auto => "auto",
3711            TimerTrigger::FitnessEquipment => "fitness_equipment",
3712        }
3713    }
3714
3715    /// Try to construct from the underlying numeric value.
3716    pub fn from_value(value: u8) -> Option<Self> {
3717        match value {
3718            0 => Some(TimerTrigger::Manual),
3719            1 => Some(TimerTrigger::Auto),
3720            2 => Some(TimerTrigger::FitnessEquipment),
3721            _ => None,
3722        }
3723    }
3724
3725    /// Try to construct from the snake-case canonical name.
3726    pub fn from_str(name: &str) -> Option<Self> {
3727        match name {
3728            "manual" => Some(TimerTrigger::Manual),
3729            "auto" => Some(TimerTrigger::Auto),
3730            "fitness_equipment" => Some(TimerTrigger::FitnessEquipment),
3731            _ => None,
3732        }
3733    }
3734}
3735
3736#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
3737#[repr(u8)]
3738#[non_exhaustive]
3739pub enum FitnessEquipmentState {
3740    Ready = 0,
3741    InUse = 1,
3742    Paused = 2,
3743    Unknown = 3,
3744}
3745
3746impl FitnessEquipmentState {
3747    /// Snake-case canonical name from Profile.xlsx.
3748    pub fn as_str(&self) -> &'static str {
3749        match self {
3750            FitnessEquipmentState::Ready => "ready",
3751            FitnessEquipmentState::InUse => "in_use",
3752            FitnessEquipmentState::Paused => "paused",
3753            FitnessEquipmentState::Unknown => "unknown",
3754        }
3755    }
3756
3757    /// Try to construct from the underlying numeric value.
3758    pub fn from_value(value: u8) -> Option<Self> {
3759        match value {
3760            0 => Some(FitnessEquipmentState::Ready),
3761            1 => Some(FitnessEquipmentState::InUse),
3762            2 => Some(FitnessEquipmentState::Paused),
3763            3 => Some(FitnessEquipmentState::Unknown),
3764            _ => None,
3765        }
3766    }
3767
3768    /// Try to construct from the snake-case canonical name.
3769    pub fn from_str(name: &str) -> Option<Self> {
3770        match name {
3771            "ready" => Some(FitnessEquipmentState::Ready),
3772            "in_use" => Some(FitnessEquipmentState::InUse),
3773            "paused" => Some(FitnessEquipmentState::Paused),
3774            "unknown" => Some(FitnessEquipmentState::Unknown),
3775            _ => None,
3776        }
3777    }
3778}
3779
3780#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
3781#[repr(u8)]
3782#[non_exhaustive]
3783pub enum Tone {
3784    Off = 0,
3785    Tone = 1,
3786    Vibrate = 2,
3787    ToneAndVibrate = 3,
3788}
3789
3790impl Tone {
3791    /// Snake-case canonical name from Profile.xlsx.
3792    pub fn as_str(&self) -> &'static str {
3793        match self {
3794            Tone::Off => "off",
3795            Tone::Tone => "tone",
3796            Tone::Vibrate => "vibrate",
3797            Tone::ToneAndVibrate => "tone_and_vibrate",
3798        }
3799    }
3800
3801    /// Try to construct from the underlying numeric value.
3802    pub fn from_value(value: u8) -> Option<Self> {
3803        match value {
3804            0 => Some(Tone::Off),
3805            1 => Some(Tone::Tone),
3806            2 => Some(Tone::Vibrate),
3807            3 => Some(Tone::ToneAndVibrate),
3808            _ => None,
3809        }
3810    }
3811
3812    /// Try to construct from the snake-case canonical name.
3813    pub fn from_str(name: &str) -> Option<Self> {
3814        match name {
3815            "off" => Some(Tone::Off),
3816            "tone" => Some(Tone::Tone),
3817            "vibrate" => Some(Tone::Vibrate),
3818            "tone_and_vibrate" => Some(Tone::ToneAndVibrate),
3819            _ => None,
3820        }
3821    }
3822}
3823
3824#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
3825#[repr(u8)]
3826#[non_exhaustive]
3827pub enum Autoscroll {
3828    None = 0,
3829    Slow = 1,
3830    Medium = 2,
3831    Fast = 3,
3832}
3833
3834impl Autoscroll {
3835    /// Snake-case canonical name from Profile.xlsx.
3836    pub fn as_str(&self) -> &'static str {
3837        match self {
3838            Autoscroll::None => "none",
3839            Autoscroll::Slow => "slow",
3840            Autoscroll::Medium => "medium",
3841            Autoscroll::Fast => "fast",
3842        }
3843    }
3844
3845    /// Try to construct from the underlying numeric value.
3846    pub fn from_value(value: u8) -> Option<Self> {
3847        match value {
3848            0 => Some(Autoscroll::None),
3849            1 => Some(Autoscroll::Slow),
3850            2 => Some(Autoscroll::Medium),
3851            3 => Some(Autoscroll::Fast),
3852            _ => None,
3853        }
3854    }
3855
3856    /// Try to construct from the snake-case canonical name.
3857    pub fn from_str(name: &str) -> Option<Self> {
3858        match name {
3859            "none" => Some(Autoscroll::None),
3860            "slow" => Some(Autoscroll::Slow),
3861            "medium" => Some(Autoscroll::Medium),
3862            "fast" => Some(Autoscroll::Fast),
3863            _ => None,
3864        }
3865    }
3866}
3867
3868#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
3869#[repr(u8)]
3870#[non_exhaustive]
3871pub enum ActivityClass {
3872    Level = 127,
3873    LevelMax = 100,
3874    Athlete = 128,
3875}
3876
3877impl ActivityClass {
3878    /// Snake-case canonical name from Profile.xlsx.
3879    pub fn as_str(&self) -> &'static str {
3880        match self {
3881            ActivityClass::Level => "level",
3882            ActivityClass::LevelMax => "level_max",
3883            ActivityClass::Athlete => "athlete",
3884        }
3885    }
3886
3887    /// Try to construct from the underlying numeric value.
3888    pub fn from_value(value: u8) -> Option<Self> {
3889        match value {
3890            127 => Some(ActivityClass::Level),
3891            100 => Some(ActivityClass::LevelMax),
3892            128 => Some(ActivityClass::Athlete),
3893            _ => None,
3894        }
3895    }
3896
3897    /// Try to construct from the snake-case canonical name.
3898    pub fn from_str(name: &str) -> Option<Self> {
3899        match name {
3900            "level" => Some(ActivityClass::Level),
3901            "level_max" => Some(ActivityClass::LevelMax),
3902            "athlete" => Some(ActivityClass::Athlete),
3903            _ => None,
3904        }
3905    }
3906}
3907
3908#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
3909#[repr(u8)]
3910#[non_exhaustive]
3911pub enum HrZoneCalc {
3912    Custom = 0,
3913    PercentMaxHr = 1,
3914    PercentHrr = 2,
3915    PercentLthr = 3,
3916}
3917
3918impl HrZoneCalc {
3919    /// Snake-case canonical name from Profile.xlsx.
3920    pub fn as_str(&self) -> &'static str {
3921        match self {
3922            HrZoneCalc::Custom => "custom",
3923            HrZoneCalc::PercentMaxHr => "percent_max_hr",
3924            HrZoneCalc::PercentHrr => "percent_hrr",
3925            HrZoneCalc::PercentLthr => "percent_lthr",
3926        }
3927    }
3928
3929    /// Try to construct from the underlying numeric value.
3930    pub fn from_value(value: u8) -> Option<Self> {
3931        match value {
3932            0 => Some(HrZoneCalc::Custom),
3933            1 => Some(HrZoneCalc::PercentMaxHr),
3934            2 => Some(HrZoneCalc::PercentHrr),
3935            3 => Some(HrZoneCalc::PercentLthr),
3936            _ => None,
3937        }
3938    }
3939
3940    /// Try to construct from the snake-case canonical name.
3941    pub fn from_str(name: &str) -> Option<Self> {
3942        match name {
3943            "custom" => Some(HrZoneCalc::Custom),
3944            "percent_max_hr" => Some(HrZoneCalc::PercentMaxHr),
3945            "percent_hrr" => Some(HrZoneCalc::PercentHrr),
3946            "percent_lthr" => Some(HrZoneCalc::PercentLthr),
3947            _ => None,
3948        }
3949    }
3950}
3951
3952#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
3953#[repr(u8)]
3954#[non_exhaustive]
3955pub enum PwrZoneCalc {
3956    Custom = 0,
3957    PercentFtp = 1,
3958}
3959
3960impl PwrZoneCalc {
3961    /// Snake-case canonical name from Profile.xlsx.
3962    pub fn as_str(&self) -> &'static str {
3963        match self {
3964            PwrZoneCalc::Custom => "custom",
3965            PwrZoneCalc::PercentFtp => "percent_ftp",
3966        }
3967    }
3968
3969    /// Try to construct from the underlying numeric value.
3970    pub fn from_value(value: u8) -> Option<Self> {
3971        match value {
3972            0 => Some(PwrZoneCalc::Custom),
3973            1 => Some(PwrZoneCalc::PercentFtp),
3974            _ => None,
3975        }
3976    }
3977
3978    /// Try to construct from the snake-case canonical name.
3979    pub fn from_str(name: &str) -> Option<Self> {
3980        match name {
3981            "custom" => Some(PwrZoneCalc::Custom),
3982            "percent_ftp" => Some(PwrZoneCalc::PercentFtp),
3983            _ => None,
3984        }
3985    }
3986}
3987
3988#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
3989#[repr(u8)]
3990#[non_exhaustive]
3991pub enum WktStepDuration {
3992    Time = 0,
3993    Distance = 1,
3994    HrLessThan = 2,
3995    HrGreaterThan = 3,
3996    Calories = 4,
3997    Open = 5,
3998    RepeatUntilStepsCmplt = 6,
3999    RepeatUntilTime = 7,
4000    RepeatUntilDistance = 8,
4001    RepeatUntilCalories = 9,
4002    RepeatUntilHrLessThan = 10,
4003    RepeatUntilHrGreaterThan = 11,
4004    RepeatUntilPowerLessThan = 12,
4005    RepeatUntilPowerGreaterThan = 13,
4006    PowerLessThan = 14,
4007    PowerGreaterThan = 15,
4008    TrainingPeaksTss = 16,
4009    RepeatUntilPowerLastLapLessThan = 17,
4010    RepeatUntilMaxPowerLastLapLessThan = 18,
4011    Power3sLessThan = 19,
4012    Power10sLessThan = 20,
4013    Power30sLessThan = 21,
4014    Power3sGreaterThan = 22,
4015    Power10sGreaterThan = 23,
4016    Power30sGreaterThan = 24,
4017    PowerLapLessThan = 25,
4018    PowerLapGreaterThan = 26,
4019    RepeatUntilTrainingPeaksTss = 27,
4020    RepetitionTime = 28,
4021    Reps = 29,
4022    TimeOnly = 31,
4023}
4024
4025impl WktStepDuration {
4026    /// Snake-case canonical name from Profile.xlsx.
4027    pub fn as_str(&self) -> &'static str {
4028        match self {
4029            WktStepDuration::Time => "time",
4030            WktStepDuration::Distance => "distance",
4031            WktStepDuration::HrLessThan => "hr_less_than",
4032            WktStepDuration::HrGreaterThan => "hr_greater_than",
4033            WktStepDuration::Calories => "calories",
4034            WktStepDuration::Open => "open",
4035            WktStepDuration::RepeatUntilStepsCmplt => "repeat_until_steps_cmplt",
4036            WktStepDuration::RepeatUntilTime => "repeat_until_time",
4037            WktStepDuration::RepeatUntilDistance => "repeat_until_distance",
4038            WktStepDuration::RepeatUntilCalories => "repeat_until_calories",
4039            WktStepDuration::RepeatUntilHrLessThan => "repeat_until_hr_less_than",
4040            WktStepDuration::RepeatUntilHrGreaterThan => "repeat_until_hr_greater_than",
4041            WktStepDuration::RepeatUntilPowerLessThan => "repeat_until_power_less_than",
4042            WktStepDuration::RepeatUntilPowerGreaterThan => "repeat_until_power_greater_than",
4043            WktStepDuration::PowerLessThan => "power_less_than",
4044            WktStepDuration::PowerGreaterThan => "power_greater_than",
4045            WktStepDuration::TrainingPeaksTss => "training_peaks_tss",
4046            WktStepDuration::RepeatUntilPowerLastLapLessThan => {
4047                "repeat_until_power_last_lap_less_than"
4048            }
4049            WktStepDuration::RepeatUntilMaxPowerLastLapLessThan => {
4050                "repeat_until_max_power_last_lap_less_than"
4051            }
4052            WktStepDuration::Power3sLessThan => "power_3s_less_than",
4053            WktStepDuration::Power10sLessThan => "power_10s_less_than",
4054            WktStepDuration::Power30sLessThan => "power_30s_less_than",
4055            WktStepDuration::Power3sGreaterThan => "power_3s_greater_than",
4056            WktStepDuration::Power10sGreaterThan => "power_10s_greater_than",
4057            WktStepDuration::Power30sGreaterThan => "power_30s_greater_than",
4058            WktStepDuration::PowerLapLessThan => "power_lap_less_than",
4059            WktStepDuration::PowerLapGreaterThan => "power_lap_greater_than",
4060            WktStepDuration::RepeatUntilTrainingPeaksTss => "repeat_until_training_peaks_tss",
4061            WktStepDuration::RepetitionTime => "repetition_time",
4062            WktStepDuration::Reps => "reps",
4063            WktStepDuration::TimeOnly => "time_only",
4064        }
4065    }
4066
4067    /// Try to construct from the underlying numeric value.
4068    pub fn from_value(value: u8) -> Option<Self> {
4069        match value {
4070            0 => Some(WktStepDuration::Time),
4071            1 => Some(WktStepDuration::Distance),
4072            2 => Some(WktStepDuration::HrLessThan),
4073            3 => Some(WktStepDuration::HrGreaterThan),
4074            4 => Some(WktStepDuration::Calories),
4075            5 => Some(WktStepDuration::Open),
4076            6 => Some(WktStepDuration::RepeatUntilStepsCmplt),
4077            7 => Some(WktStepDuration::RepeatUntilTime),
4078            8 => Some(WktStepDuration::RepeatUntilDistance),
4079            9 => Some(WktStepDuration::RepeatUntilCalories),
4080            10 => Some(WktStepDuration::RepeatUntilHrLessThan),
4081            11 => Some(WktStepDuration::RepeatUntilHrGreaterThan),
4082            12 => Some(WktStepDuration::RepeatUntilPowerLessThan),
4083            13 => Some(WktStepDuration::RepeatUntilPowerGreaterThan),
4084            14 => Some(WktStepDuration::PowerLessThan),
4085            15 => Some(WktStepDuration::PowerGreaterThan),
4086            16 => Some(WktStepDuration::TrainingPeaksTss),
4087            17 => Some(WktStepDuration::RepeatUntilPowerLastLapLessThan),
4088            18 => Some(WktStepDuration::RepeatUntilMaxPowerLastLapLessThan),
4089            19 => Some(WktStepDuration::Power3sLessThan),
4090            20 => Some(WktStepDuration::Power10sLessThan),
4091            21 => Some(WktStepDuration::Power30sLessThan),
4092            22 => Some(WktStepDuration::Power3sGreaterThan),
4093            23 => Some(WktStepDuration::Power10sGreaterThan),
4094            24 => Some(WktStepDuration::Power30sGreaterThan),
4095            25 => Some(WktStepDuration::PowerLapLessThan),
4096            26 => Some(WktStepDuration::PowerLapGreaterThan),
4097            27 => Some(WktStepDuration::RepeatUntilTrainingPeaksTss),
4098            28 => Some(WktStepDuration::RepetitionTime),
4099            29 => Some(WktStepDuration::Reps),
4100            31 => Some(WktStepDuration::TimeOnly),
4101            _ => None,
4102        }
4103    }
4104
4105    /// Try to construct from the snake-case canonical name.
4106    pub fn from_str(name: &str) -> Option<Self> {
4107        match name {
4108            "time" => Some(WktStepDuration::Time),
4109            "distance" => Some(WktStepDuration::Distance),
4110            "hr_less_than" => Some(WktStepDuration::HrLessThan),
4111            "hr_greater_than" => Some(WktStepDuration::HrGreaterThan),
4112            "calories" => Some(WktStepDuration::Calories),
4113            "open" => Some(WktStepDuration::Open),
4114            "repeat_until_steps_cmplt" => Some(WktStepDuration::RepeatUntilStepsCmplt),
4115            "repeat_until_time" => Some(WktStepDuration::RepeatUntilTime),
4116            "repeat_until_distance" => Some(WktStepDuration::RepeatUntilDistance),
4117            "repeat_until_calories" => Some(WktStepDuration::RepeatUntilCalories),
4118            "repeat_until_hr_less_than" => Some(WktStepDuration::RepeatUntilHrLessThan),
4119            "repeat_until_hr_greater_than" => Some(WktStepDuration::RepeatUntilHrGreaterThan),
4120            "repeat_until_power_less_than" => Some(WktStepDuration::RepeatUntilPowerLessThan),
4121            "repeat_until_power_greater_than" => Some(WktStepDuration::RepeatUntilPowerGreaterThan),
4122            "power_less_than" => Some(WktStepDuration::PowerLessThan),
4123            "power_greater_than" => Some(WktStepDuration::PowerGreaterThan),
4124            "training_peaks_tss" => Some(WktStepDuration::TrainingPeaksTss),
4125            "repeat_until_power_last_lap_less_than" => {
4126                Some(WktStepDuration::RepeatUntilPowerLastLapLessThan)
4127            }
4128            "repeat_until_max_power_last_lap_less_than" => {
4129                Some(WktStepDuration::RepeatUntilMaxPowerLastLapLessThan)
4130            }
4131            "power_3s_less_than" => Some(WktStepDuration::Power3sLessThan),
4132            "power_10s_less_than" => Some(WktStepDuration::Power10sLessThan),
4133            "power_30s_less_than" => Some(WktStepDuration::Power30sLessThan),
4134            "power_3s_greater_than" => Some(WktStepDuration::Power3sGreaterThan),
4135            "power_10s_greater_than" => Some(WktStepDuration::Power10sGreaterThan),
4136            "power_30s_greater_than" => Some(WktStepDuration::Power30sGreaterThan),
4137            "power_lap_less_than" => Some(WktStepDuration::PowerLapLessThan),
4138            "power_lap_greater_than" => Some(WktStepDuration::PowerLapGreaterThan),
4139            "repeat_until_training_peaks_tss" => Some(WktStepDuration::RepeatUntilTrainingPeaksTss),
4140            "repetition_time" => Some(WktStepDuration::RepetitionTime),
4141            "reps" => Some(WktStepDuration::Reps),
4142            "time_only" => Some(WktStepDuration::TimeOnly),
4143            _ => None,
4144        }
4145    }
4146}
4147
4148#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
4149#[repr(u8)]
4150#[non_exhaustive]
4151pub enum WktStepTarget {
4152    Speed = 0,
4153    HeartRate = 1,
4154    Open = 2,
4155    Cadence = 3,
4156    Power = 4,
4157    Grade = 5,
4158    Resistance = 6,
4159    Power3s = 7,
4160    Power10s = 8,
4161    Power30s = 9,
4162    PowerLap = 10,
4163    SwimStroke = 11,
4164    SpeedLap = 12,
4165    HeartRateLap = 13,
4166}
4167
4168impl WktStepTarget {
4169    /// Snake-case canonical name from Profile.xlsx.
4170    pub fn as_str(&self) -> &'static str {
4171        match self {
4172            WktStepTarget::Speed => "speed",
4173            WktStepTarget::HeartRate => "heart_rate",
4174            WktStepTarget::Open => "open",
4175            WktStepTarget::Cadence => "cadence",
4176            WktStepTarget::Power => "power",
4177            WktStepTarget::Grade => "grade",
4178            WktStepTarget::Resistance => "resistance",
4179            WktStepTarget::Power3s => "power_3s",
4180            WktStepTarget::Power10s => "power_10s",
4181            WktStepTarget::Power30s => "power_30s",
4182            WktStepTarget::PowerLap => "power_lap",
4183            WktStepTarget::SwimStroke => "swim_stroke",
4184            WktStepTarget::SpeedLap => "speed_lap",
4185            WktStepTarget::HeartRateLap => "heart_rate_lap",
4186        }
4187    }
4188
4189    /// Try to construct from the underlying numeric value.
4190    pub fn from_value(value: u8) -> Option<Self> {
4191        match value {
4192            0 => Some(WktStepTarget::Speed),
4193            1 => Some(WktStepTarget::HeartRate),
4194            2 => Some(WktStepTarget::Open),
4195            3 => Some(WktStepTarget::Cadence),
4196            4 => Some(WktStepTarget::Power),
4197            5 => Some(WktStepTarget::Grade),
4198            6 => Some(WktStepTarget::Resistance),
4199            7 => Some(WktStepTarget::Power3s),
4200            8 => Some(WktStepTarget::Power10s),
4201            9 => Some(WktStepTarget::Power30s),
4202            10 => Some(WktStepTarget::PowerLap),
4203            11 => Some(WktStepTarget::SwimStroke),
4204            12 => Some(WktStepTarget::SpeedLap),
4205            13 => Some(WktStepTarget::HeartRateLap),
4206            _ => None,
4207        }
4208    }
4209
4210    /// Try to construct from the snake-case canonical name.
4211    pub fn from_str(name: &str) -> Option<Self> {
4212        match name {
4213            "speed" => Some(WktStepTarget::Speed),
4214            "heart_rate" => Some(WktStepTarget::HeartRate),
4215            "open" => Some(WktStepTarget::Open),
4216            "cadence" => Some(WktStepTarget::Cadence),
4217            "power" => Some(WktStepTarget::Power),
4218            "grade" => Some(WktStepTarget::Grade),
4219            "resistance" => Some(WktStepTarget::Resistance),
4220            "power_3s" => Some(WktStepTarget::Power3s),
4221            "power_10s" => Some(WktStepTarget::Power10s),
4222            "power_30s" => Some(WktStepTarget::Power30s),
4223            "power_lap" => Some(WktStepTarget::PowerLap),
4224            "swim_stroke" => Some(WktStepTarget::SwimStroke),
4225            "speed_lap" => Some(WktStepTarget::SpeedLap),
4226            "heart_rate_lap" => Some(WktStepTarget::HeartRateLap),
4227            _ => None,
4228        }
4229    }
4230}
4231
4232#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
4233#[repr(u8)]
4234#[non_exhaustive]
4235pub enum Goal {
4236    Time = 0,
4237    Distance = 1,
4238    Calories = 2,
4239    Frequency = 3,
4240    Steps = 4,
4241    Ascent = 5,
4242    ActiveMinutes = 6,
4243}
4244
4245impl Goal {
4246    /// Snake-case canonical name from Profile.xlsx.
4247    pub fn as_str(&self) -> &'static str {
4248        match self {
4249            Goal::Time => "time",
4250            Goal::Distance => "distance",
4251            Goal::Calories => "calories",
4252            Goal::Frequency => "frequency",
4253            Goal::Steps => "steps",
4254            Goal::Ascent => "ascent",
4255            Goal::ActiveMinutes => "active_minutes",
4256        }
4257    }
4258
4259    /// Try to construct from the underlying numeric value.
4260    pub fn from_value(value: u8) -> Option<Self> {
4261        match value {
4262            0 => Some(Goal::Time),
4263            1 => Some(Goal::Distance),
4264            2 => Some(Goal::Calories),
4265            3 => Some(Goal::Frequency),
4266            4 => Some(Goal::Steps),
4267            5 => Some(Goal::Ascent),
4268            6 => Some(Goal::ActiveMinutes),
4269            _ => None,
4270        }
4271    }
4272
4273    /// Try to construct from the snake-case canonical name.
4274    pub fn from_str(name: &str) -> Option<Self> {
4275        match name {
4276            "time" => Some(Goal::Time),
4277            "distance" => Some(Goal::Distance),
4278            "calories" => Some(Goal::Calories),
4279            "frequency" => Some(Goal::Frequency),
4280            "steps" => Some(Goal::Steps),
4281            "ascent" => Some(Goal::Ascent),
4282            "active_minutes" => Some(Goal::ActiveMinutes),
4283            _ => None,
4284        }
4285    }
4286}
4287
4288#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
4289#[repr(u8)]
4290#[non_exhaustive]
4291pub enum GoalRecurrence {
4292    Off = 0,
4293    Daily = 1,
4294    Weekly = 2,
4295    Monthly = 3,
4296    Yearly = 4,
4297    Custom = 5,
4298}
4299
4300impl GoalRecurrence {
4301    /// Snake-case canonical name from Profile.xlsx.
4302    pub fn as_str(&self) -> &'static str {
4303        match self {
4304            GoalRecurrence::Off => "off",
4305            GoalRecurrence::Daily => "daily",
4306            GoalRecurrence::Weekly => "weekly",
4307            GoalRecurrence::Monthly => "monthly",
4308            GoalRecurrence::Yearly => "yearly",
4309            GoalRecurrence::Custom => "custom",
4310        }
4311    }
4312
4313    /// Try to construct from the underlying numeric value.
4314    pub fn from_value(value: u8) -> Option<Self> {
4315        match value {
4316            0 => Some(GoalRecurrence::Off),
4317            1 => Some(GoalRecurrence::Daily),
4318            2 => Some(GoalRecurrence::Weekly),
4319            3 => Some(GoalRecurrence::Monthly),
4320            4 => Some(GoalRecurrence::Yearly),
4321            5 => Some(GoalRecurrence::Custom),
4322            _ => None,
4323        }
4324    }
4325
4326    /// Try to construct from the snake-case canonical name.
4327    pub fn from_str(name: &str) -> Option<Self> {
4328        match name {
4329            "off" => Some(GoalRecurrence::Off),
4330            "daily" => Some(GoalRecurrence::Daily),
4331            "weekly" => Some(GoalRecurrence::Weekly),
4332            "monthly" => Some(GoalRecurrence::Monthly),
4333            "yearly" => Some(GoalRecurrence::Yearly),
4334            "custom" => Some(GoalRecurrence::Custom),
4335            _ => None,
4336        }
4337    }
4338}
4339
4340#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
4341#[repr(u8)]
4342#[non_exhaustive]
4343pub enum GoalSource {
4344    Auto = 0,
4345    Community = 1,
4346    User = 2,
4347}
4348
4349impl GoalSource {
4350    /// Snake-case canonical name from Profile.xlsx.
4351    pub fn as_str(&self) -> &'static str {
4352        match self {
4353            GoalSource::Auto => "auto",
4354            GoalSource::Community => "community",
4355            GoalSource::User => "user",
4356        }
4357    }
4358
4359    /// Try to construct from the underlying numeric value.
4360    pub fn from_value(value: u8) -> Option<Self> {
4361        match value {
4362            0 => Some(GoalSource::Auto),
4363            1 => Some(GoalSource::Community),
4364            2 => Some(GoalSource::User),
4365            _ => None,
4366        }
4367    }
4368
4369    /// Try to construct from the snake-case canonical name.
4370    pub fn from_str(name: &str) -> Option<Self> {
4371        match name {
4372            "auto" => Some(GoalSource::Auto),
4373            "community" => Some(GoalSource::Community),
4374            "user" => Some(GoalSource::User),
4375            _ => None,
4376        }
4377    }
4378}
4379
4380#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
4381#[repr(u8)]
4382#[non_exhaustive]
4383pub enum Schedule {
4384    Workout = 0,
4385    Course = 1,
4386}
4387
4388impl Schedule {
4389    /// Snake-case canonical name from Profile.xlsx.
4390    pub fn as_str(&self) -> &'static str {
4391        match self {
4392            Schedule::Workout => "workout",
4393            Schedule::Course => "course",
4394        }
4395    }
4396
4397    /// Try to construct from the underlying numeric value.
4398    pub fn from_value(value: u8) -> Option<Self> {
4399        match value {
4400            0 => Some(Schedule::Workout),
4401            1 => Some(Schedule::Course),
4402            _ => None,
4403        }
4404    }
4405
4406    /// Try to construct from the snake-case canonical name.
4407    pub fn from_str(name: &str) -> Option<Self> {
4408        match name {
4409            "workout" => Some(Schedule::Workout),
4410            "course" => Some(Schedule::Course),
4411            _ => None,
4412        }
4413    }
4414}
4415
4416#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
4417#[repr(u8)]
4418#[non_exhaustive]
4419pub enum CoursePoint {
4420    Generic = 0,
4421    Summit = 1,
4422    Valley = 2,
4423    Water = 3,
4424    Food = 4,
4425    Danger = 5,
4426    Left = 6,
4427    Right = 7,
4428    Straight = 8,
4429    FirstAid = 9,
4430    FourthCategory = 10,
4431    ThirdCategory = 11,
4432    SecondCategory = 12,
4433    FirstCategory = 13,
4434    HorsCategory = 14,
4435    Sprint = 15,
4436    LeftFork = 16,
4437    RightFork = 17,
4438    MiddleFork = 18,
4439    SlightLeft = 19,
4440    SharpLeft = 20,
4441    SlightRight = 21,
4442    SharpRight = 22,
4443    UTurn = 23,
4444    SegmentStart = 24,
4445    SegmentEnd = 25,
4446    Campsite = 27,
4447    AidStation = 28,
4448    RestArea = 29,
4449    GeneralDistance = 30,
4450    Service = 31,
4451    EnergyGel = 32,
4452    SportsDrink = 33,
4453    MileMarker = 34,
4454    Checkpoint = 35,
4455    Shelter = 36,
4456    MeetingSpot = 37,
4457    Overlook = 38,
4458    Toilet = 39,
4459    Shower = 40,
4460    Gear = 41,
4461    SharpCurve = 42,
4462    SteepIncline = 43,
4463    Tunnel = 44,
4464    Bridge = 45,
4465    Obstacle = 46,
4466    Crossing = 47,
4467    Store = 48,
4468    Transition = 49,
4469    Navaid = 50,
4470    Transport = 51,
4471    Alert = 52,
4472    Info = 53,
4473}
4474
4475impl CoursePoint {
4476    /// Snake-case canonical name from Profile.xlsx.
4477    pub fn as_str(&self) -> &'static str {
4478        match self {
4479            CoursePoint::Generic => "generic",
4480            CoursePoint::Summit => "summit",
4481            CoursePoint::Valley => "valley",
4482            CoursePoint::Water => "water",
4483            CoursePoint::Food => "food",
4484            CoursePoint::Danger => "danger",
4485            CoursePoint::Left => "left",
4486            CoursePoint::Right => "right",
4487            CoursePoint::Straight => "straight",
4488            CoursePoint::FirstAid => "first_aid",
4489            CoursePoint::FourthCategory => "fourth_category",
4490            CoursePoint::ThirdCategory => "third_category",
4491            CoursePoint::SecondCategory => "second_category",
4492            CoursePoint::FirstCategory => "first_category",
4493            CoursePoint::HorsCategory => "hors_category",
4494            CoursePoint::Sprint => "sprint",
4495            CoursePoint::LeftFork => "left_fork",
4496            CoursePoint::RightFork => "right_fork",
4497            CoursePoint::MiddleFork => "middle_fork",
4498            CoursePoint::SlightLeft => "slight_left",
4499            CoursePoint::SharpLeft => "sharp_left",
4500            CoursePoint::SlightRight => "slight_right",
4501            CoursePoint::SharpRight => "sharp_right",
4502            CoursePoint::UTurn => "u_turn",
4503            CoursePoint::SegmentStart => "segment_start",
4504            CoursePoint::SegmentEnd => "segment_end",
4505            CoursePoint::Campsite => "campsite",
4506            CoursePoint::AidStation => "aid_station",
4507            CoursePoint::RestArea => "rest_area",
4508            CoursePoint::GeneralDistance => "general_distance",
4509            CoursePoint::Service => "service",
4510            CoursePoint::EnergyGel => "energy_gel",
4511            CoursePoint::SportsDrink => "sports_drink",
4512            CoursePoint::MileMarker => "mile_marker",
4513            CoursePoint::Checkpoint => "checkpoint",
4514            CoursePoint::Shelter => "shelter",
4515            CoursePoint::MeetingSpot => "meeting_spot",
4516            CoursePoint::Overlook => "overlook",
4517            CoursePoint::Toilet => "toilet",
4518            CoursePoint::Shower => "shower",
4519            CoursePoint::Gear => "gear",
4520            CoursePoint::SharpCurve => "sharp_curve",
4521            CoursePoint::SteepIncline => "steep_incline",
4522            CoursePoint::Tunnel => "tunnel",
4523            CoursePoint::Bridge => "bridge",
4524            CoursePoint::Obstacle => "obstacle",
4525            CoursePoint::Crossing => "crossing",
4526            CoursePoint::Store => "store",
4527            CoursePoint::Transition => "transition",
4528            CoursePoint::Navaid => "navaid",
4529            CoursePoint::Transport => "transport",
4530            CoursePoint::Alert => "alert",
4531            CoursePoint::Info => "info",
4532        }
4533    }
4534
4535    /// Try to construct from the underlying numeric value.
4536    pub fn from_value(value: u8) -> Option<Self> {
4537        match value {
4538            0 => Some(CoursePoint::Generic),
4539            1 => Some(CoursePoint::Summit),
4540            2 => Some(CoursePoint::Valley),
4541            3 => Some(CoursePoint::Water),
4542            4 => Some(CoursePoint::Food),
4543            5 => Some(CoursePoint::Danger),
4544            6 => Some(CoursePoint::Left),
4545            7 => Some(CoursePoint::Right),
4546            8 => Some(CoursePoint::Straight),
4547            9 => Some(CoursePoint::FirstAid),
4548            10 => Some(CoursePoint::FourthCategory),
4549            11 => Some(CoursePoint::ThirdCategory),
4550            12 => Some(CoursePoint::SecondCategory),
4551            13 => Some(CoursePoint::FirstCategory),
4552            14 => Some(CoursePoint::HorsCategory),
4553            15 => Some(CoursePoint::Sprint),
4554            16 => Some(CoursePoint::LeftFork),
4555            17 => Some(CoursePoint::RightFork),
4556            18 => Some(CoursePoint::MiddleFork),
4557            19 => Some(CoursePoint::SlightLeft),
4558            20 => Some(CoursePoint::SharpLeft),
4559            21 => Some(CoursePoint::SlightRight),
4560            22 => Some(CoursePoint::SharpRight),
4561            23 => Some(CoursePoint::UTurn),
4562            24 => Some(CoursePoint::SegmentStart),
4563            25 => Some(CoursePoint::SegmentEnd),
4564            27 => Some(CoursePoint::Campsite),
4565            28 => Some(CoursePoint::AidStation),
4566            29 => Some(CoursePoint::RestArea),
4567            30 => Some(CoursePoint::GeneralDistance),
4568            31 => Some(CoursePoint::Service),
4569            32 => Some(CoursePoint::EnergyGel),
4570            33 => Some(CoursePoint::SportsDrink),
4571            34 => Some(CoursePoint::MileMarker),
4572            35 => Some(CoursePoint::Checkpoint),
4573            36 => Some(CoursePoint::Shelter),
4574            37 => Some(CoursePoint::MeetingSpot),
4575            38 => Some(CoursePoint::Overlook),
4576            39 => Some(CoursePoint::Toilet),
4577            40 => Some(CoursePoint::Shower),
4578            41 => Some(CoursePoint::Gear),
4579            42 => Some(CoursePoint::SharpCurve),
4580            43 => Some(CoursePoint::SteepIncline),
4581            44 => Some(CoursePoint::Tunnel),
4582            45 => Some(CoursePoint::Bridge),
4583            46 => Some(CoursePoint::Obstacle),
4584            47 => Some(CoursePoint::Crossing),
4585            48 => Some(CoursePoint::Store),
4586            49 => Some(CoursePoint::Transition),
4587            50 => Some(CoursePoint::Navaid),
4588            51 => Some(CoursePoint::Transport),
4589            52 => Some(CoursePoint::Alert),
4590            53 => Some(CoursePoint::Info),
4591            _ => None,
4592        }
4593    }
4594
4595    /// Try to construct from the snake-case canonical name.
4596    pub fn from_str(name: &str) -> Option<Self> {
4597        match name {
4598            "generic" => Some(CoursePoint::Generic),
4599            "summit" => Some(CoursePoint::Summit),
4600            "valley" => Some(CoursePoint::Valley),
4601            "water" => Some(CoursePoint::Water),
4602            "food" => Some(CoursePoint::Food),
4603            "danger" => Some(CoursePoint::Danger),
4604            "left" => Some(CoursePoint::Left),
4605            "right" => Some(CoursePoint::Right),
4606            "straight" => Some(CoursePoint::Straight),
4607            "first_aid" => Some(CoursePoint::FirstAid),
4608            "fourth_category" => Some(CoursePoint::FourthCategory),
4609            "third_category" => Some(CoursePoint::ThirdCategory),
4610            "second_category" => Some(CoursePoint::SecondCategory),
4611            "first_category" => Some(CoursePoint::FirstCategory),
4612            "hors_category" => Some(CoursePoint::HorsCategory),
4613            "sprint" => Some(CoursePoint::Sprint),
4614            "left_fork" => Some(CoursePoint::LeftFork),
4615            "right_fork" => Some(CoursePoint::RightFork),
4616            "middle_fork" => Some(CoursePoint::MiddleFork),
4617            "slight_left" => Some(CoursePoint::SlightLeft),
4618            "sharp_left" => Some(CoursePoint::SharpLeft),
4619            "slight_right" => Some(CoursePoint::SlightRight),
4620            "sharp_right" => Some(CoursePoint::SharpRight),
4621            "u_turn" => Some(CoursePoint::UTurn),
4622            "segment_start" => Some(CoursePoint::SegmentStart),
4623            "segment_end" => Some(CoursePoint::SegmentEnd),
4624            "campsite" => Some(CoursePoint::Campsite),
4625            "aid_station" => Some(CoursePoint::AidStation),
4626            "rest_area" => Some(CoursePoint::RestArea),
4627            "general_distance" => Some(CoursePoint::GeneralDistance),
4628            "service" => Some(CoursePoint::Service),
4629            "energy_gel" => Some(CoursePoint::EnergyGel),
4630            "sports_drink" => Some(CoursePoint::SportsDrink),
4631            "mile_marker" => Some(CoursePoint::MileMarker),
4632            "checkpoint" => Some(CoursePoint::Checkpoint),
4633            "shelter" => Some(CoursePoint::Shelter),
4634            "meeting_spot" => Some(CoursePoint::MeetingSpot),
4635            "overlook" => Some(CoursePoint::Overlook),
4636            "toilet" => Some(CoursePoint::Toilet),
4637            "shower" => Some(CoursePoint::Shower),
4638            "gear" => Some(CoursePoint::Gear),
4639            "sharp_curve" => Some(CoursePoint::SharpCurve),
4640            "steep_incline" => Some(CoursePoint::SteepIncline),
4641            "tunnel" => Some(CoursePoint::Tunnel),
4642            "bridge" => Some(CoursePoint::Bridge),
4643            "obstacle" => Some(CoursePoint::Obstacle),
4644            "crossing" => Some(CoursePoint::Crossing),
4645            "store" => Some(CoursePoint::Store),
4646            "transition" => Some(CoursePoint::Transition),
4647            "navaid" => Some(CoursePoint::Navaid),
4648            "transport" => Some(CoursePoint::Transport),
4649            "alert" => Some(CoursePoint::Alert),
4650            "info" => Some(CoursePoint::Info),
4651            _ => None,
4652        }
4653    }
4654}
4655
4656#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
4657#[repr(u16)]
4658#[non_exhaustive]
4659pub enum Manufacturer {
4660    Garmin = 1,
4661    GarminFr405Antfs = 2,
4662    Zephyr = 3,
4663    Dayton = 4,
4664    Idt = 5,
4665    Srm = 6,
4666    Quarq = 7,
4667    Ibike = 8,
4668    Saris = 9,
4669    SparkHk = 10,
4670    Tanita = 11,
4671    Echowell = 12,
4672    DynastreamOem = 13,
4673    Nautilus = 14,
4674    Dynastream = 15,
4675    Timex = 16,
4676    Metrigear = 17,
4677    Xelic = 18,
4678    Beurer = 19,
4679    Cardiosport = 20,
4680    AAndD = 21,
4681    Hmm = 22,
4682    Suunto = 23,
4683    ThitaElektronik = 24,
4684    Gpulse = 25,
4685    CleanMobile = 26,
4686    PedalBrain = 27,
4687    Peaksware = 28,
4688    Saxonar = 29,
4689    LemondFitness = 30,
4690    Dexcom = 31,
4691    WahooFitness = 32,
4692    OctaneFitness = 33,
4693    Archinoetics = 34,
4694    TheHurtBox = 35,
4695    CitizenSystems = 36,
4696    Magellan = 37,
4697    Osynce = 38,
4698    Holux = 39,
4699    Concept2 = 40,
4700    Shimano = 41,
4701    OneGiantLeap = 42,
4702    AceSensor = 43,
4703    BrimBrothers = 44,
4704    Xplova = 45,
4705    PerceptionDigital = 46,
4706    Bf1systems = 47,
4707    Pioneer = 48,
4708    Spantec = 49,
4709    Metalogics = 50,
4710    _4iiiis = 51,
4711    SeikoEpson = 52,
4712    SeikoEpsonOem = 53,
4713    IforPowell = 54,
4714    MaxwellGuider = 55,
4715    StarTrac = 56,
4716    Breakaway = 57,
4717    AlatechTechnologyLtd = 58,
4718    MioTechnologyEurope = 59,
4719    Rotor = 60,
4720    Geonaute = 61,
4721    IdBike = 62,
4722    Specialized = 63,
4723    Wtek = 64,
4724    PhysicalEnterprises = 65,
4725    NorthPoleEngineering = 66,
4726    Bkool = 67,
4727    Cateye = 68,
4728    StagesCycling = 69,
4729    Sigmasport = 70,
4730    Tomtom = 71,
4731    Peripedal = 72,
4732    Wattbike = 73,
4733    Moxy = 76,
4734    Ciclosport = 77,
4735    Powerbahn = 78,
4736    AcornProjectsAps = 79,
4737    Lifebeam = 80,
4738    Bontrager = 81,
4739    Wellgo = 82,
4740    Scosche = 83,
4741    Magura = 84,
4742    Woodway = 85,
4743    Elite = 86,
4744    NielsenKellerman = 87,
4745    DkCity = 88,
4746    Tacx = 89,
4747    DirectionTechnology = 90,
4748    Magtonic = 91,
4749    _1partcarbon = 92,
4750    InsideRideTechnologies = 93,
4751    SoundOfMotion = 94,
4752    Stryd = 95,
4753    Icg = 96,
4754    MiPulse = 97,
4755    BsxAthletics = 98,
4756    Look = 99,
4757    CampagnoloSrl = 100,
4758    BodyBikeSmart = 101,
4759    Praxisworks = 102,
4760    LimitsTechnology = 103,
4761    TopactionTechnology = 104,
4762    Cosinuss = 105,
4763    Fitcare = 106,
4764    Magene = 107,
4765    GiantManufacturingCo = 108,
4766    Tigrasport = 109,
4767    Salutron = 110,
4768    Technogym = 111,
4769    BrytonSensors = 112,
4770    LatitudeLimited = 113,
4771    SoaringTechnology = 114,
4772    Igpsport = 115,
4773    Thinkrider = 116,
4774    GopherSport = 117,
4775    Waterrower = 118,
4776    Orangetheory = 119,
4777    Inpeak = 120,
4778    Kinetic = 121,
4779    JohnsonHealthTech = 122,
4780    PolarElectro = 123,
4781    Seesense = 124,
4782    NciTechnology = 125,
4783    Iqsquare = 126,
4784    Leomo = 127,
4785    IfitCom = 128,
4786    CorosByte = 129,
4787    VersaDesign = 130,
4788    Chileaf = 131,
4789    Cycplus = 132,
4790    GravaaByte = 133,
4791    Sigeyi = 134,
4792    Coospo = 135,
4793    Geoid = 136,
4794    Bosch = 137,
4795    Kyto = 138,
4796    KineticSports = 139,
4797    DecathlonByte = 140,
4798    TqSystems = 141,
4799    TagHeuer = 142,
4800    KeiserFitness = 143,
4801    ZwiftByte = 144,
4802    PorscheEp = 145,
4803    Blackbird = 146,
4804    MeilanByte = 147,
4805    Ezon = 148,
4806    Laisi = 149,
4807    Myzone = 150,
4808    Abawo = 151,
4809    Bafang = 152,
4810    LuhongTechnology = 153,
4811    Development = 255,
4812    Healthandlife = 257,
4813    Lezyne = 258,
4814    ScribeLabs = 259,
4815    Zwift = 260,
4816    Watteam = 261,
4817    Recon = 262,
4818    FaveroElectronics = 263,
4819    Dynovelo = 264,
4820    Strava = 265,
4821    Precor = 266,
4822    Bryton = 267,
4823    Sram = 268,
4824    Navman = 269,
4825    Cobi = 270,
4826    Spivi = 271,
4827    MioMagellan = 272,
4828    Evesports = 273,
4829    SensitivusGauge = 274,
4830    Podoon = 275,
4831    LifeTimeFitness = 276,
4832    FalcoEMotors = 277,
4833    Minoura = 278,
4834    Cycliq = 279,
4835    Luxottica = 280,
4836    TrainerRoad = 281,
4837    TheSufferfest = 282,
4838    Fullspeedahead = 283,
4839    Virtualtraining = 284,
4840    Feedbacksports = 285,
4841    Omata = 286,
4842    Vdo = 287,
4843    Magneticdays = 288,
4844    Hammerhead = 289,
4845    KineticByKurt = 290,
4846    Shapelog = 291,
4847    Dabuziduo = 292,
4848    Jetblack = 293,
4849    Coros = 294,
4850    Virtugo = 295,
4851    Velosense = 296,
4852    Cycligentinc = 297,
4853    Trailforks = 298,
4854    MahleEbikemotion = 299,
4855    Nurvv = 300,
4856    Microprogram = 301,
4857    Zone5cloud = 302,
4858    Greenteg = 303,
4859    YamahaMotors = 304,
4860    Whoop = 305,
4861    Gravaa = 306,
4862    Onelap = 307,
4863    MonarkExercise = 308,
4864    Form = 309,
4865    Decathlon = 310,
4866    Syncros = 311,
4867    Heatup = 312,
4868    Cannondale = 313,
4869    TrueFitness = 314,
4870    RGTCycling = 315,
4871    Vasa = 316,
4872    RaceRepublic = 317,
4873    Fazua = 318,
4874    OrekaTraining = 319,
4875    Lsec = 320,
4876    LululemonStudio = 321,
4877    Shanyue = 322,
4878    SpinningMda = 323,
4879    Hilldating = 324,
4880    AeroSensor = 325,
4881    Nike = 326,
4882    Magicshine = 327,
4883    Ictrainer = 328,
4884    AbsoluteCycling = 329,
4885    EoSwimbetter = 330,
4886    Mywhoosh = 331,
4887    Ravemen = 332,
4888    TektroRacingProducts = 333,
4889    DaradInnovationCorporation = 334,
4890    Cycloptim = 335,
4891    Runna = 337,
4892    Zepp = 339,
4893    Peloton = 340,
4894    Carv = 341,
4895    Tissot = 342,
4896    RealVelo = 345,
4897    Wetech = 346,
4898    Jespr = 347,
4899    Huawei = 348,
4900    Gotoes = 349,
4901    Actigraphcorp = 5759,
4902}
4903
4904impl Manufacturer {
4905    /// Snake-case canonical name from Profile.xlsx.
4906    pub fn as_str(&self) -> &'static str {
4907        match self {
4908            Manufacturer::Garmin => "garmin",
4909            Manufacturer::GarminFr405Antfs => "garmin_fr405_antfs",
4910            Manufacturer::Zephyr => "zephyr",
4911            Manufacturer::Dayton => "dayton",
4912            Manufacturer::Idt => "idt",
4913            Manufacturer::Srm => "srm",
4914            Manufacturer::Quarq => "quarq",
4915            Manufacturer::Ibike => "ibike",
4916            Manufacturer::Saris => "saris",
4917            Manufacturer::SparkHk => "spark_hk",
4918            Manufacturer::Tanita => "tanita",
4919            Manufacturer::Echowell => "echowell",
4920            Manufacturer::DynastreamOem => "dynastream_oem",
4921            Manufacturer::Nautilus => "nautilus",
4922            Manufacturer::Dynastream => "dynastream",
4923            Manufacturer::Timex => "timex",
4924            Manufacturer::Metrigear => "metrigear",
4925            Manufacturer::Xelic => "xelic",
4926            Manufacturer::Beurer => "beurer",
4927            Manufacturer::Cardiosport => "cardiosport",
4928            Manufacturer::AAndD => "a_and_d",
4929            Manufacturer::Hmm => "hmm",
4930            Manufacturer::Suunto => "suunto",
4931            Manufacturer::ThitaElektronik => "thita_elektronik",
4932            Manufacturer::Gpulse => "gpulse",
4933            Manufacturer::CleanMobile => "clean_mobile",
4934            Manufacturer::PedalBrain => "pedal_brain",
4935            Manufacturer::Peaksware => "peaksware",
4936            Manufacturer::Saxonar => "saxonar",
4937            Manufacturer::LemondFitness => "lemond_fitness",
4938            Manufacturer::Dexcom => "dexcom",
4939            Manufacturer::WahooFitness => "wahoo_fitness",
4940            Manufacturer::OctaneFitness => "octane_fitness",
4941            Manufacturer::Archinoetics => "archinoetics",
4942            Manufacturer::TheHurtBox => "the_hurt_box",
4943            Manufacturer::CitizenSystems => "citizen_systems",
4944            Manufacturer::Magellan => "magellan",
4945            Manufacturer::Osynce => "osynce",
4946            Manufacturer::Holux => "holux",
4947            Manufacturer::Concept2 => "concept2",
4948            Manufacturer::Shimano => "shimano",
4949            Manufacturer::OneGiantLeap => "one_giant_leap",
4950            Manufacturer::AceSensor => "ace_sensor",
4951            Manufacturer::BrimBrothers => "brim_brothers",
4952            Manufacturer::Xplova => "xplova",
4953            Manufacturer::PerceptionDigital => "perception_digital",
4954            Manufacturer::Bf1systems => "bf1systems",
4955            Manufacturer::Pioneer => "pioneer",
4956            Manufacturer::Spantec => "spantec",
4957            Manufacturer::Metalogics => "metalogics",
4958            Manufacturer::_4iiiis => "4iiiis",
4959            Manufacturer::SeikoEpson => "seiko_epson",
4960            Manufacturer::SeikoEpsonOem => "seiko_epson_oem",
4961            Manufacturer::IforPowell => "ifor_powell",
4962            Manufacturer::MaxwellGuider => "maxwell_guider",
4963            Manufacturer::StarTrac => "star_trac",
4964            Manufacturer::Breakaway => "breakaway",
4965            Manufacturer::AlatechTechnologyLtd => "alatech_technology_ltd",
4966            Manufacturer::MioTechnologyEurope => "mio_technology_europe",
4967            Manufacturer::Rotor => "rotor",
4968            Manufacturer::Geonaute => "geonaute",
4969            Manufacturer::IdBike => "id_bike",
4970            Manufacturer::Specialized => "specialized",
4971            Manufacturer::Wtek => "wtek",
4972            Manufacturer::PhysicalEnterprises => "physical_enterprises",
4973            Manufacturer::NorthPoleEngineering => "north_pole_engineering",
4974            Manufacturer::Bkool => "bkool",
4975            Manufacturer::Cateye => "cateye",
4976            Manufacturer::StagesCycling => "stages_cycling",
4977            Manufacturer::Sigmasport => "sigmasport",
4978            Manufacturer::Tomtom => "tomtom",
4979            Manufacturer::Peripedal => "peripedal",
4980            Manufacturer::Wattbike => "wattbike",
4981            Manufacturer::Moxy => "moxy",
4982            Manufacturer::Ciclosport => "ciclosport",
4983            Manufacturer::Powerbahn => "powerbahn",
4984            Manufacturer::AcornProjectsAps => "acorn_projects_aps",
4985            Manufacturer::Lifebeam => "lifebeam",
4986            Manufacturer::Bontrager => "bontrager",
4987            Manufacturer::Wellgo => "wellgo",
4988            Manufacturer::Scosche => "scosche",
4989            Manufacturer::Magura => "magura",
4990            Manufacturer::Woodway => "woodway",
4991            Manufacturer::Elite => "elite",
4992            Manufacturer::NielsenKellerman => "nielsen_kellerman",
4993            Manufacturer::DkCity => "dk_city",
4994            Manufacturer::Tacx => "tacx",
4995            Manufacturer::DirectionTechnology => "direction_technology",
4996            Manufacturer::Magtonic => "magtonic",
4997            Manufacturer::_1partcarbon => "1partcarbon",
4998            Manufacturer::InsideRideTechnologies => "inside_ride_technologies",
4999            Manufacturer::SoundOfMotion => "sound_of_motion",
5000            Manufacturer::Stryd => "stryd",
5001            Manufacturer::Icg => "icg",
5002            Manufacturer::MiPulse => "MiPulse",
5003            Manufacturer::BsxAthletics => "bsx_athletics",
5004            Manufacturer::Look => "look",
5005            Manufacturer::CampagnoloSrl => "campagnolo_srl",
5006            Manufacturer::BodyBikeSmart => "body_bike_smart",
5007            Manufacturer::Praxisworks => "praxisworks",
5008            Manufacturer::LimitsTechnology => "limits_technology",
5009            Manufacturer::TopactionTechnology => "topaction_technology",
5010            Manufacturer::Cosinuss => "cosinuss",
5011            Manufacturer::Fitcare => "fitcare",
5012            Manufacturer::Magene => "magene",
5013            Manufacturer::GiantManufacturingCo => "giant_manufacturing_co",
5014            Manufacturer::Tigrasport => "tigrasport",
5015            Manufacturer::Salutron => "salutron",
5016            Manufacturer::Technogym => "technogym",
5017            Manufacturer::BrytonSensors => "bryton_sensors",
5018            Manufacturer::LatitudeLimited => "latitude_limited",
5019            Manufacturer::SoaringTechnology => "soaring_technology",
5020            Manufacturer::Igpsport => "igpsport",
5021            Manufacturer::Thinkrider => "thinkrider",
5022            Manufacturer::GopherSport => "gopher_sport",
5023            Manufacturer::Waterrower => "waterrower",
5024            Manufacturer::Orangetheory => "orangetheory",
5025            Manufacturer::Inpeak => "inpeak",
5026            Manufacturer::Kinetic => "kinetic",
5027            Manufacturer::JohnsonHealthTech => "johnson_health_tech",
5028            Manufacturer::PolarElectro => "polar_electro",
5029            Manufacturer::Seesense => "seesense",
5030            Manufacturer::NciTechnology => "nci_technology",
5031            Manufacturer::Iqsquare => "iqsquare",
5032            Manufacturer::Leomo => "leomo",
5033            Manufacturer::IfitCom => "ifit_com",
5034            Manufacturer::CorosByte => "coros_byte",
5035            Manufacturer::VersaDesign => "versa_design",
5036            Manufacturer::Chileaf => "chileaf",
5037            Manufacturer::Cycplus => "cycplus",
5038            Manufacturer::GravaaByte => "gravaa_byte",
5039            Manufacturer::Sigeyi => "sigeyi",
5040            Manufacturer::Coospo => "coospo",
5041            Manufacturer::Geoid => "geoid",
5042            Manufacturer::Bosch => "bosch",
5043            Manufacturer::Kyto => "kyto",
5044            Manufacturer::KineticSports => "kinetic_sports",
5045            Manufacturer::DecathlonByte => "decathlon_byte",
5046            Manufacturer::TqSystems => "tq_systems",
5047            Manufacturer::TagHeuer => "tag_heuer",
5048            Manufacturer::KeiserFitness => "keiser_fitness",
5049            Manufacturer::ZwiftByte => "zwift_byte",
5050            Manufacturer::PorscheEp => "porsche_ep",
5051            Manufacturer::Blackbird => "blackbird",
5052            Manufacturer::MeilanByte => "meilan_byte",
5053            Manufacturer::Ezon => "ezon",
5054            Manufacturer::Laisi => "laisi",
5055            Manufacturer::Myzone => "myzone",
5056            Manufacturer::Abawo => "abawo",
5057            Manufacturer::Bafang => "bafang",
5058            Manufacturer::LuhongTechnology => "luhong_technology",
5059            Manufacturer::Development => "development",
5060            Manufacturer::Healthandlife => "healthandlife",
5061            Manufacturer::Lezyne => "lezyne",
5062            Manufacturer::ScribeLabs => "scribe_labs",
5063            Manufacturer::Zwift => "zwift",
5064            Manufacturer::Watteam => "watteam",
5065            Manufacturer::Recon => "recon",
5066            Manufacturer::FaveroElectronics => "favero_electronics",
5067            Manufacturer::Dynovelo => "dynovelo",
5068            Manufacturer::Strava => "strava",
5069            Manufacturer::Precor => "precor",
5070            Manufacturer::Bryton => "bryton",
5071            Manufacturer::Sram => "sram",
5072            Manufacturer::Navman => "navman",
5073            Manufacturer::Cobi => "cobi",
5074            Manufacturer::Spivi => "spivi",
5075            Manufacturer::MioMagellan => "mio_magellan",
5076            Manufacturer::Evesports => "evesports",
5077            Manufacturer::SensitivusGauge => "sensitivus_gauge",
5078            Manufacturer::Podoon => "podoon",
5079            Manufacturer::LifeTimeFitness => "life_time_fitness",
5080            Manufacturer::FalcoEMotors => "falco_e_motors",
5081            Manufacturer::Minoura => "minoura",
5082            Manufacturer::Cycliq => "cycliq",
5083            Manufacturer::Luxottica => "luxottica",
5084            Manufacturer::TrainerRoad => "trainer_road",
5085            Manufacturer::TheSufferfest => "the_sufferfest",
5086            Manufacturer::Fullspeedahead => "fullspeedahead",
5087            Manufacturer::Virtualtraining => "virtualtraining",
5088            Manufacturer::Feedbacksports => "feedbacksports",
5089            Manufacturer::Omata => "omata",
5090            Manufacturer::Vdo => "vdo",
5091            Manufacturer::Magneticdays => "magneticdays",
5092            Manufacturer::Hammerhead => "hammerhead",
5093            Manufacturer::KineticByKurt => "kinetic_by_kurt",
5094            Manufacturer::Shapelog => "shapelog",
5095            Manufacturer::Dabuziduo => "dabuziduo",
5096            Manufacturer::Jetblack => "jetblack",
5097            Manufacturer::Coros => "coros",
5098            Manufacturer::Virtugo => "virtugo",
5099            Manufacturer::Velosense => "velosense",
5100            Manufacturer::Cycligentinc => "cycligentinc",
5101            Manufacturer::Trailforks => "trailforks",
5102            Manufacturer::MahleEbikemotion => "mahle_ebikemotion",
5103            Manufacturer::Nurvv => "nurvv",
5104            Manufacturer::Microprogram => "microprogram",
5105            Manufacturer::Zone5cloud => "zone5cloud",
5106            Manufacturer::Greenteg => "greenteg",
5107            Manufacturer::YamahaMotors => "yamaha_motors",
5108            Manufacturer::Whoop => "whoop",
5109            Manufacturer::Gravaa => "gravaa",
5110            Manufacturer::Onelap => "onelap",
5111            Manufacturer::MonarkExercise => "monark_exercise",
5112            Manufacturer::Form => "form",
5113            Manufacturer::Decathlon => "decathlon",
5114            Manufacturer::Syncros => "syncros",
5115            Manufacturer::Heatup => "heatup",
5116            Manufacturer::Cannondale => "cannondale",
5117            Manufacturer::TrueFitness => "true_fitness",
5118            Manufacturer::RGTCycling => "RGT_cycling",
5119            Manufacturer::Vasa => "vasa",
5120            Manufacturer::RaceRepublic => "race_republic",
5121            Manufacturer::Fazua => "fazua",
5122            Manufacturer::OrekaTraining => "oreka_training",
5123            Manufacturer::Lsec => "lsec",
5124            Manufacturer::LululemonStudio => "lululemon_studio",
5125            Manufacturer::Shanyue => "shanyue",
5126            Manufacturer::SpinningMda => "spinning_mda",
5127            Manufacturer::Hilldating => "hilldating",
5128            Manufacturer::AeroSensor => "aero_sensor",
5129            Manufacturer::Nike => "nike",
5130            Manufacturer::Magicshine => "magicshine",
5131            Manufacturer::Ictrainer => "ictrainer",
5132            Manufacturer::AbsoluteCycling => "absolute_cycling",
5133            Manufacturer::EoSwimbetter => "eo_swimbetter",
5134            Manufacturer::Mywhoosh => "mywhoosh",
5135            Manufacturer::Ravemen => "ravemen",
5136            Manufacturer::TektroRacingProducts => "tektro_racing_products",
5137            Manufacturer::DaradInnovationCorporation => "darad_innovation_corporation",
5138            Manufacturer::Cycloptim => "cycloptim",
5139            Manufacturer::Runna => "runna",
5140            Manufacturer::Zepp => "zepp",
5141            Manufacturer::Peloton => "peloton",
5142            Manufacturer::Carv => "carv",
5143            Manufacturer::Tissot => "tissot",
5144            Manufacturer::RealVelo => "real_velo",
5145            Manufacturer::Wetech => "wetech",
5146            Manufacturer::Jespr => "jespr",
5147            Manufacturer::Huawei => "huawei",
5148            Manufacturer::Gotoes => "gotoes",
5149            Manufacturer::Actigraphcorp => "actigraphcorp",
5150        }
5151    }
5152
5153    /// Try to construct from the underlying numeric value.
5154    pub fn from_value(value: u16) -> Option<Self> {
5155        match value {
5156            1 => Some(Manufacturer::Garmin),
5157            2 => Some(Manufacturer::GarminFr405Antfs),
5158            3 => Some(Manufacturer::Zephyr),
5159            4 => Some(Manufacturer::Dayton),
5160            5 => Some(Manufacturer::Idt),
5161            6 => Some(Manufacturer::Srm),
5162            7 => Some(Manufacturer::Quarq),
5163            8 => Some(Manufacturer::Ibike),
5164            9 => Some(Manufacturer::Saris),
5165            10 => Some(Manufacturer::SparkHk),
5166            11 => Some(Manufacturer::Tanita),
5167            12 => Some(Manufacturer::Echowell),
5168            13 => Some(Manufacturer::DynastreamOem),
5169            14 => Some(Manufacturer::Nautilus),
5170            15 => Some(Manufacturer::Dynastream),
5171            16 => Some(Manufacturer::Timex),
5172            17 => Some(Manufacturer::Metrigear),
5173            18 => Some(Manufacturer::Xelic),
5174            19 => Some(Manufacturer::Beurer),
5175            20 => Some(Manufacturer::Cardiosport),
5176            21 => Some(Manufacturer::AAndD),
5177            22 => Some(Manufacturer::Hmm),
5178            23 => Some(Manufacturer::Suunto),
5179            24 => Some(Manufacturer::ThitaElektronik),
5180            25 => Some(Manufacturer::Gpulse),
5181            26 => Some(Manufacturer::CleanMobile),
5182            27 => Some(Manufacturer::PedalBrain),
5183            28 => Some(Manufacturer::Peaksware),
5184            29 => Some(Manufacturer::Saxonar),
5185            30 => Some(Manufacturer::LemondFitness),
5186            31 => Some(Manufacturer::Dexcom),
5187            32 => Some(Manufacturer::WahooFitness),
5188            33 => Some(Manufacturer::OctaneFitness),
5189            34 => Some(Manufacturer::Archinoetics),
5190            35 => Some(Manufacturer::TheHurtBox),
5191            36 => Some(Manufacturer::CitizenSystems),
5192            37 => Some(Manufacturer::Magellan),
5193            38 => Some(Manufacturer::Osynce),
5194            39 => Some(Manufacturer::Holux),
5195            40 => Some(Manufacturer::Concept2),
5196            41 => Some(Manufacturer::Shimano),
5197            42 => Some(Manufacturer::OneGiantLeap),
5198            43 => Some(Manufacturer::AceSensor),
5199            44 => Some(Manufacturer::BrimBrothers),
5200            45 => Some(Manufacturer::Xplova),
5201            46 => Some(Manufacturer::PerceptionDigital),
5202            47 => Some(Manufacturer::Bf1systems),
5203            48 => Some(Manufacturer::Pioneer),
5204            49 => Some(Manufacturer::Spantec),
5205            50 => Some(Manufacturer::Metalogics),
5206            51 => Some(Manufacturer::_4iiiis),
5207            52 => Some(Manufacturer::SeikoEpson),
5208            53 => Some(Manufacturer::SeikoEpsonOem),
5209            54 => Some(Manufacturer::IforPowell),
5210            55 => Some(Manufacturer::MaxwellGuider),
5211            56 => Some(Manufacturer::StarTrac),
5212            57 => Some(Manufacturer::Breakaway),
5213            58 => Some(Manufacturer::AlatechTechnologyLtd),
5214            59 => Some(Manufacturer::MioTechnologyEurope),
5215            60 => Some(Manufacturer::Rotor),
5216            61 => Some(Manufacturer::Geonaute),
5217            62 => Some(Manufacturer::IdBike),
5218            63 => Some(Manufacturer::Specialized),
5219            64 => Some(Manufacturer::Wtek),
5220            65 => Some(Manufacturer::PhysicalEnterprises),
5221            66 => Some(Manufacturer::NorthPoleEngineering),
5222            67 => Some(Manufacturer::Bkool),
5223            68 => Some(Manufacturer::Cateye),
5224            69 => Some(Manufacturer::StagesCycling),
5225            70 => Some(Manufacturer::Sigmasport),
5226            71 => Some(Manufacturer::Tomtom),
5227            72 => Some(Manufacturer::Peripedal),
5228            73 => Some(Manufacturer::Wattbike),
5229            76 => Some(Manufacturer::Moxy),
5230            77 => Some(Manufacturer::Ciclosport),
5231            78 => Some(Manufacturer::Powerbahn),
5232            79 => Some(Manufacturer::AcornProjectsAps),
5233            80 => Some(Manufacturer::Lifebeam),
5234            81 => Some(Manufacturer::Bontrager),
5235            82 => Some(Manufacturer::Wellgo),
5236            83 => Some(Manufacturer::Scosche),
5237            84 => Some(Manufacturer::Magura),
5238            85 => Some(Manufacturer::Woodway),
5239            86 => Some(Manufacturer::Elite),
5240            87 => Some(Manufacturer::NielsenKellerman),
5241            88 => Some(Manufacturer::DkCity),
5242            89 => Some(Manufacturer::Tacx),
5243            90 => Some(Manufacturer::DirectionTechnology),
5244            91 => Some(Manufacturer::Magtonic),
5245            92 => Some(Manufacturer::_1partcarbon),
5246            93 => Some(Manufacturer::InsideRideTechnologies),
5247            94 => Some(Manufacturer::SoundOfMotion),
5248            95 => Some(Manufacturer::Stryd),
5249            96 => Some(Manufacturer::Icg),
5250            97 => Some(Manufacturer::MiPulse),
5251            98 => Some(Manufacturer::BsxAthletics),
5252            99 => Some(Manufacturer::Look),
5253            100 => Some(Manufacturer::CampagnoloSrl),
5254            101 => Some(Manufacturer::BodyBikeSmart),
5255            102 => Some(Manufacturer::Praxisworks),
5256            103 => Some(Manufacturer::LimitsTechnology),
5257            104 => Some(Manufacturer::TopactionTechnology),
5258            105 => Some(Manufacturer::Cosinuss),
5259            106 => Some(Manufacturer::Fitcare),
5260            107 => Some(Manufacturer::Magene),
5261            108 => Some(Manufacturer::GiantManufacturingCo),
5262            109 => Some(Manufacturer::Tigrasport),
5263            110 => Some(Manufacturer::Salutron),
5264            111 => Some(Manufacturer::Technogym),
5265            112 => Some(Manufacturer::BrytonSensors),
5266            113 => Some(Manufacturer::LatitudeLimited),
5267            114 => Some(Manufacturer::SoaringTechnology),
5268            115 => Some(Manufacturer::Igpsport),
5269            116 => Some(Manufacturer::Thinkrider),
5270            117 => Some(Manufacturer::GopherSport),
5271            118 => Some(Manufacturer::Waterrower),
5272            119 => Some(Manufacturer::Orangetheory),
5273            120 => Some(Manufacturer::Inpeak),
5274            121 => Some(Manufacturer::Kinetic),
5275            122 => Some(Manufacturer::JohnsonHealthTech),
5276            123 => Some(Manufacturer::PolarElectro),
5277            124 => Some(Manufacturer::Seesense),
5278            125 => Some(Manufacturer::NciTechnology),
5279            126 => Some(Manufacturer::Iqsquare),
5280            127 => Some(Manufacturer::Leomo),
5281            128 => Some(Manufacturer::IfitCom),
5282            129 => Some(Manufacturer::CorosByte),
5283            130 => Some(Manufacturer::VersaDesign),
5284            131 => Some(Manufacturer::Chileaf),
5285            132 => Some(Manufacturer::Cycplus),
5286            133 => Some(Manufacturer::GravaaByte),
5287            134 => Some(Manufacturer::Sigeyi),
5288            135 => Some(Manufacturer::Coospo),
5289            136 => Some(Manufacturer::Geoid),
5290            137 => Some(Manufacturer::Bosch),
5291            138 => Some(Manufacturer::Kyto),
5292            139 => Some(Manufacturer::KineticSports),
5293            140 => Some(Manufacturer::DecathlonByte),
5294            141 => Some(Manufacturer::TqSystems),
5295            142 => Some(Manufacturer::TagHeuer),
5296            143 => Some(Manufacturer::KeiserFitness),
5297            144 => Some(Manufacturer::ZwiftByte),
5298            145 => Some(Manufacturer::PorscheEp),
5299            146 => Some(Manufacturer::Blackbird),
5300            147 => Some(Manufacturer::MeilanByte),
5301            148 => Some(Manufacturer::Ezon),
5302            149 => Some(Manufacturer::Laisi),
5303            150 => Some(Manufacturer::Myzone),
5304            151 => Some(Manufacturer::Abawo),
5305            152 => Some(Manufacturer::Bafang),
5306            153 => Some(Manufacturer::LuhongTechnology),
5307            255 => Some(Manufacturer::Development),
5308            257 => Some(Manufacturer::Healthandlife),
5309            258 => Some(Manufacturer::Lezyne),
5310            259 => Some(Manufacturer::ScribeLabs),
5311            260 => Some(Manufacturer::Zwift),
5312            261 => Some(Manufacturer::Watteam),
5313            262 => Some(Manufacturer::Recon),
5314            263 => Some(Manufacturer::FaveroElectronics),
5315            264 => Some(Manufacturer::Dynovelo),
5316            265 => Some(Manufacturer::Strava),
5317            266 => Some(Manufacturer::Precor),
5318            267 => Some(Manufacturer::Bryton),
5319            268 => Some(Manufacturer::Sram),
5320            269 => Some(Manufacturer::Navman),
5321            270 => Some(Manufacturer::Cobi),
5322            271 => Some(Manufacturer::Spivi),
5323            272 => Some(Manufacturer::MioMagellan),
5324            273 => Some(Manufacturer::Evesports),
5325            274 => Some(Manufacturer::SensitivusGauge),
5326            275 => Some(Manufacturer::Podoon),
5327            276 => Some(Manufacturer::LifeTimeFitness),
5328            277 => Some(Manufacturer::FalcoEMotors),
5329            278 => Some(Manufacturer::Minoura),
5330            279 => Some(Manufacturer::Cycliq),
5331            280 => Some(Manufacturer::Luxottica),
5332            281 => Some(Manufacturer::TrainerRoad),
5333            282 => Some(Manufacturer::TheSufferfest),
5334            283 => Some(Manufacturer::Fullspeedahead),
5335            284 => Some(Manufacturer::Virtualtraining),
5336            285 => Some(Manufacturer::Feedbacksports),
5337            286 => Some(Manufacturer::Omata),
5338            287 => Some(Manufacturer::Vdo),
5339            288 => Some(Manufacturer::Magneticdays),
5340            289 => Some(Manufacturer::Hammerhead),
5341            290 => Some(Manufacturer::KineticByKurt),
5342            291 => Some(Manufacturer::Shapelog),
5343            292 => Some(Manufacturer::Dabuziduo),
5344            293 => Some(Manufacturer::Jetblack),
5345            294 => Some(Manufacturer::Coros),
5346            295 => Some(Manufacturer::Virtugo),
5347            296 => Some(Manufacturer::Velosense),
5348            297 => Some(Manufacturer::Cycligentinc),
5349            298 => Some(Manufacturer::Trailforks),
5350            299 => Some(Manufacturer::MahleEbikemotion),
5351            300 => Some(Manufacturer::Nurvv),
5352            301 => Some(Manufacturer::Microprogram),
5353            302 => Some(Manufacturer::Zone5cloud),
5354            303 => Some(Manufacturer::Greenteg),
5355            304 => Some(Manufacturer::YamahaMotors),
5356            305 => Some(Manufacturer::Whoop),
5357            306 => Some(Manufacturer::Gravaa),
5358            307 => Some(Manufacturer::Onelap),
5359            308 => Some(Manufacturer::MonarkExercise),
5360            309 => Some(Manufacturer::Form),
5361            310 => Some(Manufacturer::Decathlon),
5362            311 => Some(Manufacturer::Syncros),
5363            312 => Some(Manufacturer::Heatup),
5364            313 => Some(Manufacturer::Cannondale),
5365            314 => Some(Manufacturer::TrueFitness),
5366            315 => Some(Manufacturer::RGTCycling),
5367            316 => Some(Manufacturer::Vasa),
5368            317 => Some(Manufacturer::RaceRepublic),
5369            318 => Some(Manufacturer::Fazua),
5370            319 => Some(Manufacturer::OrekaTraining),
5371            320 => Some(Manufacturer::Lsec),
5372            321 => Some(Manufacturer::LululemonStudio),
5373            322 => Some(Manufacturer::Shanyue),
5374            323 => Some(Manufacturer::SpinningMda),
5375            324 => Some(Manufacturer::Hilldating),
5376            325 => Some(Manufacturer::AeroSensor),
5377            326 => Some(Manufacturer::Nike),
5378            327 => Some(Manufacturer::Magicshine),
5379            328 => Some(Manufacturer::Ictrainer),
5380            329 => Some(Manufacturer::AbsoluteCycling),
5381            330 => Some(Manufacturer::EoSwimbetter),
5382            331 => Some(Manufacturer::Mywhoosh),
5383            332 => Some(Manufacturer::Ravemen),
5384            333 => Some(Manufacturer::TektroRacingProducts),
5385            334 => Some(Manufacturer::DaradInnovationCorporation),
5386            335 => Some(Manufacturer::Cycloptim),
5387            337 => Some(Manufacturer::Runna),
5388            339 => Some(Manufacturer::Zepp),
5389            340 => Some(Manufacturer::Peloton),
5390            341 => Some(Manufacturer::Carv),
5391            342 => Some(Manufacturer::Tissot),
5392            345 => Some(Manufacturer::RealVelo),
5393            346 => Some(Manufacturer::Wetech),
5394            347 => Some(Manufacturer::Jespr),
5395            348 => Some(Manufacturer::Huawei),
5396            349 => Some(Manufacturer::Gotoes),
5397            5759 => Some(Manufacturer::Actigraphcorp),
5398            _ => None,
5399        }
5400    }
5401
5402    /// Try to construct from the snake-case canonical name.
5403    pub fn from_str(name: &str) -> Option<Self> {
5404        match name {
5405            "garmin" => Some(Manufacturer::Garmin),
5406            "garmin_fr405_antfs" => Some(Manufacturer::GarminFr405Antfs),
5407            "zephyr" => Some(Manufacturer::Zephyr),
5408            "dayton" => Some(Manufacturer::Dayton),
5409            "idt" => Some(Manufacturer::Idt),
5410            "srm" => Some(Manufacturer::Srm),
5411            "quarq" => Some(Manufacturer::Quarq),
5412            "ibike" => Some(Manufacturer::Ibike),
5413            "saris" => Some(Manufacturer::Saris),
5414            "spark_hk" => Some(Manufacturer::SparkHk),
5415            "tanita" => Some(Manufacturer::Tanita),
5416            "echowell" => Some(Manufacturer::Echowell),
5417            "dynastream_oem" => Some(Manufacturer::DynastreamOem),
5418            "nautilus" => Some(Manufacturer::Nautilus),
5419            "dynastream" => Some(Manufacturer::Dynastream),
5420            "timex" => Some(Manufacturer::Timex),
5421            "metrigear" => Some(Manufacturer::Metrigear),
5422            "xelic" => Some(Manufacturer::Xelic),
5423            "beurer" => Some(Manufacturer::Beurer),
5424            "cardiosport" => Some(Manufacturer::Cardiosport),
5425            "a_and_d" => Some(Manufacturer::AAndD),
5426            "hmm" => Some(Manufacturer::Hmm),
5427            "suunto" => Some(Manufacturer::Suunto),
5428            "thita_elektronik" => Some(Manufacturer::ThitaElektronik),
5429            "gpulse" => Some(Manufacturer::Gpulse),
5430            "clean_mobile" => Some(Manufacturer::CleanMobile),
5431            "pedal_brain" => Some(Manufacturer::PedalBrain),
5432            "peaksware" => Some(Manufacturer::Peaksware),
5433            "saxonar" => Some(Manufacturer::Saxonar),
5434            "lemond_fitness" => Some(Manufacturer::LemondFitness),
5435            "dexcom" => Some(Manufacturer::Dexcom),
5436            "wahoo_fitness" => Some(Manufacturer::WahooFitness),
5437            "octane_fitness" => Some(Manufacturer::OctaneFitness),
5438            "archinoetics" => Some(Manufacturer::Archinoetics),
5439            "the_hurt_box" => Some(Manufacturer::TheHurtBox),
5440            "citizen_systems" => Some(Manufacturer::CitizenSystems),
5441            "magellan" => Some(Manufacturer::Magellan),
5442            "osynce" => Some(Manufacturer::Osynce),
5443            "holux" => Some(Manufacturer::Holux),
5444            "concept2" => Some(Manufacturer::Concept2),
5445            "shimano" => Some(Manufacturer::Shimano),
5446            "one_giant_leap" => Some(Manufacturer::OneGiantLeap),
5447            "ace_sensor" => Some(Manufacturer::AceSensor),
5448            "brim_brothers" => Some(Manufacturer::BrimBrothers),
5449            "xplova" => Some(Manufacturer::Xplova),
5450            "perception_digital" => Some(Manufacturer::PerceptionDigital),
5451            "bf1systems" => Some(Manufacturer::Bf1systems),
5452            "pioneer" => Some(Manufacturer::Pioneer),
5453            "spantec" => Some(Manufacturer::Spantec),
5454            "metalogics" => Some(Manufacturer::Metalogics),
5455            "4iiiis" => Some(Manufacturer::_4iiiis),
5456            "seiko_epson" => Some(Manufacturer::SeikoEpson),
5457            "seiko_epson_oem" => Some(Manufacturer::SeikoEpsonOem),
5458            "ifor_powell" => Some(Manufacturer::IforPowell),
5459            "maxwell_guider" => Some(Manufacturer::MaxwellGuider),
5460            "star_trac" => Some(Manufacturer::StarTrac),
5461            "breakaway" => Some(Manufacturer::Breakaway),
5462            "alatech_technology_ltd" => Some(Manufacturer::AlatechTechnologyLtd),
5463            "mio_technology_europe" => Some(Manufacturer::MioTechnologyEurope),
5464            "rotor" => Some(Manufacturer::Rotor),
5465            "geonaute" => Some(Manufacturer::Geonaute),
5466            "id_bike" => Some(Manufacturer::IdBike),
5467            "specialized" => Some(Manufacturer::Specialized),
5468            "wtek" => Some(Manufacturer::Wtek),
5469            "physical_enterprises" => Some(Manufacturer::PhysicalEnterprises),
5470            "north_pole_engineering" => Some(Manufacturer::NorthPoleEngineering),
5471            "bkool" => Some(Manufacturer::Bkool),
5472            "cateye" => Some(Manufacturer::Cateye),
5473            "stages_cycling" => Some(Manufacturer::StagesCycling),
5474            "sigmasport" => Some(Manufacturer::Sigmasport),
5475            "tomtom" => Some(Manufacturer::Tomtom),
5476            "peripedal" => Some(Manufacturer::Peripedal),
5477            "wattbike" => Some(Manufacturer::Wattbike),
5478            "moxy" => Some(Manufacturer::Moxy),
5479            "ciclosport" => Some(Manufacturer::Ciclosport),
5480            "powerbahn" => Some(Manufacturer::Powerbahn),
5481            "acorn_projects_aps" => Some(Manufacturer::AcornProjectsAps),
5482            "lifebeam" => Some(Manufacturer::Lifebeam),
5483            "bontrager" => Some(Manufacturer::Bontrager),
5484            "wellgo" => Some(Manufacturer::Wellgo),
5485            "scosche" => Some(Manufacturer::Scosche),
5486            "magura" => Some(Manufacturer::Magura),
5487            "woodway" => Some(Manufacturer::Woodway),
5488            "elite" => Some(Manufacturer::Elite),
5489            "nielsen_kellerman" => Some(Manufacturer::NielsenKellerman),
5490            "dk_city" => Some(Manufacturer::DkCity),
5491            "tacx" => Some(Manufacturer::Tacx),
5492            "direction_technology" => Some(Manufacturer::DirectionTechnology),
5493            "magtonic" => Some(Manufacturer::Magtonic),
5494            "1partcarbon" => Some(Manufacturer::_1partcarbon),
5495            "inside_ride_technologies" => Some(Manufacturer::InsideRideTechnologies),
5496            "sound_of_motion" => Some(Manufacturer::SoundOfMotion),
5497            "stryd" => Some(Manufacturer::Stryd),
5498            "icg" => Some(Manufacturer::Icg),
5499            "MiPulse" => Some(Manufacturer::MiPulse),
5500            "bsx_athletics" => Some(Manufacturer::BsxAthletics),
5501            "look" => Some(Manufacturer::Look),
5502            "campagnolo_srl" => Some(Manufacturer::CampagnoloSrl),
5503            "body_bike_smart" => Some(Manufacturer::BodyBikeSmart),
5504            "praxisworks" => Some(Manufacturer::Praxisworks),
5505            "limits_technology" => Some(Manufacturer::LimitsTechnology),
5506            "topaction_technology" => Some(Manufacturer::TopactionTechnology),
5507            "cosinuss" => Some(Manufacturer::Cosinuss),
5508            "fitcare" => Some(Manufacturer::Fitcare),
5509            "magene" => Some(Manufacturer::Magene),
5510            "giant_manufacturing_co" => Some(Manufacturer::GiantManufacturingCo),
5511            "tigrasport" => Some(Manufacturer::Tigrasport),
5512            "salutron" => Some(Manufacturer::Salutron),
5513            "technogym" => Some(Manufacturer::Technogym),
5514            "bryton_sensors" => Some(Manufacturer::BrytonSensors),
5515            "latitude_limited" => Some(Manufacturer::LatitudeLimited),
5516            "soaring_technology" => Some(Manufacturer::SoaringTechnology),
5517            "igpsport" => Some(Manufacturer::Igpsport),
5518            "thinkrider" => Some(Manufacturer::Thinkrider),
5519            "gopher_sport" => Some(Manufacturer::GopherSport),
5520            "waterrower" => Some(Manufacturer::Waterrower),
5521            "orangetheory" => Some(Manufacturer::Orangetheory),
5522            "inpeak" => Some(Manufacturer::Inpeak),
5523            "kinetic" => Some(Manufacturer::Kinetic),
5524            "johnson_health_tech" => Some(Manufacturer::JohnsonHealthTech),
5525            "polar_electro" => Some(Manufacturer::PolarElectro),
5526            "seesense" => Some(Manufacturer::Seesense),
5527            "nci_technology" => Some(Manufacturer::NciTechnology),
5528            "iqsquare" => Some(Manufacturer::Iqsquare),
5529            "leomo" => Some(Manufacturer::Leomo),
5530            "ifit_com" => Some(Manufacturer::IfitCom),
5531            "coros_byte" => Some(Manufacturer::CorosByte),
5532            "versa_design" => Some(Manufacturer::VersaDesign),
5533            "chileaf" => Some(Manufacturer::Chileaf),
5534            "cycplus" => Some(Manufacturer::Cycplus),
5535            "gravaa_byte" => Some(Manufacturer::GravaaByte),
5536            "sigeyi" => Some(Manufacturer::Sigeyi),
5537            "coospo" => Some(Manufacturer::Coospo),
5538            "geoid" => Some(Manufacturer::Geoid),
5539            "bosch" => Some(Manufacturer::Bosch),
5540            "kyto" => Some(Manufacturer::Kyto),
5541            "kinetic_sports" => Some(Manufacturer::KineticSports),
5542            "decathlon_byte" => Some(Manufacturer::DecathlonByte),
5543            "tq_systems" => Some(Manufacturer::TqSystems),
5544            "tag_heuer" => Some(Manufacturer::TagHeuer),
5545            "keiser_fitness" => Some(Manufacturer::KeiserFitness),
5546            "zwift_byte" => Some(Manufacturer::ZwiftByte),
5547            "porsche_ep" => Some(Manufacturer::PorscheEp),
5548            "blackbird" => Some(Manufacturer::Blackbird),
5549            "meilan_byte" => Some(Manufacturer::MeilanByte),
5550            "ezon" => Some(Manufacturer::Ezon),
5551            "laisi" => Some(Manufacturer::Laisi),
5552            "myzone" => Some(Manufacturer::Myzone),
5553            "abawo" => Some(Manufacturer::Abawo),
5554            "bafang" => Some(Manufacturer::Bafang),
5555            "luhong_technology" => Some(Manufacturer::LuhongTechnology),
5556            "development" => Some(Manufacturer::Development),
5557            "healthandlife" => Some(Manufacturer::Healthandlife),
5558            "lezyne" => Some(Manufacturer::Lezyne),
5559            "scribe_labs" => Some(Manufacturer::ScribeLabs),
5560            "zwift" => Some(Manufacturer::Zwift),
5561            "watteam" => Some(Manufacturer::Watteam),
5562            "recon" => Some(Manufacturer::Recon),
5563            "favero_electronics" => Some(Manufacturer::FaveroElectronics),
5564            "dynovelo" => Some(Manufacturer::Dynovelo),
5565            "strava" => Some(Manufacturer::Strava),
5566            "precor" => Some(Manufacturer::Precor),
5567            "bryton" => Some(Manufacturer::Bryton),
5568            "sram" => Some(Manufacturer::Sram),
5569            "navman" => Some(Manufacturer::Navman),
5570            "cobi" => Some(Manufacturer::Cobi),
5571            "spivi" => Some(Manufacturer::Spivi),
5572            "mio_magellan" => Some(Manufacturer::MioMagellan),
5573            "evesports" => Some(Manufacturer::Evesports),
5574            "sensitivus_gauge" => Some(Manufacturer::SensitivusGauge),
5575            "podoon" => Some(Manufacturer::Podoon),
5576            "life_time_fitness" => Some(Manufacturer::LifeTimeFitness),
5577            "falco_e_motors" => Some(Manufacturer::FalcoEMotors),
5578            "minoura" => Some(Manufacturer::Minoura),
5579            "cycliq" => Some(Manufacturer::Cycliq),
5580            "luxottica" => Some(Manufacturer::Luxottica),
5581            "trainer_road" => Some(Manufacturer::TrainerRoad),
5582            "the_sufferfest" => Some(Manufacturer::TheSufferfest),
5583            "fullspeedahead" => Some(Manufacturer::Fullspeedahead),
5584            "virtualtraining" => Some(Manufacturer::Virtualtraining),
5585            "feedbacksports" => Some(Manufacturer::Feedbacksports),
5586            "omata" => Some(Manufacturer::Omata),
5587            "vdo" => Some(Manufacturer::Vdo),
5588            "magneticdays" => Some(Manufacturer::Magneticdays),
5589            "hammerhead" => Some(Manufacturer::Hammerhead),
5590            "kinetic_by_kurt" => Some(Manufacturer::KineticByKurt),
5591            "shapelog" => Some(Manufacturer::Shapelog),
5592            "dabuziduo" => Some(Manufacturer::Dabuziduo),
5593            "jetblack" => Some(Manufacturer::Jetblack),
5594            "coros" => Some(Manufacturer::Coros),
5595            "virtugo" => Some(Manufacturer::Virtugo),
5596            "velosense" => Some(Manufacturer::Velosense),
5597            "cycligentinc" => Some(Manufacturer::Cycligentinc),
5598            "trailforks" => Some(Manufacturer::Trailforks),
5599            "mahle_ebikemotion" => Some(Manufacturer::MahleEbikemotion),
5600            "nurvv" => Some(Manufacturer::Nurvv),
5601            "microprogram" => Some(Manufacturer::Microprogram),
5602            "zone5cloud" => Some(Manufacturer::Zone5cloud),
5603            "greenteg" => Some(Manufacturer::Greenteg),
5604            "yamaha_motors" => Some(Manufacturer::YamahaMotors),
5605            "whoop" => Some(Manufacturer::Whoop),
5606            "gravaa" => Some(Manufacturer::Gravaa),
5607            "onelap" => Some(Manufacturer::Onelap),
5608            "monark_exercise" => Some(Manufacturer::MonarkExercise),
5609            "form" => Some(Manufacturer::Form),
5610            "decathlon" => Some(Manufacturer::Decathlon),
5611            "syncros" => Some(Manufacturer::Syncros),
5612            "heatup" => Some(Manufacturer::Heatup),
5613            "cannondale" => Some(Manufacturer::Cannondale),
5614            "true_fitness" => Some(Manufacturer::TrueFitness),
5615            "RGT_cycling" => Some(Manufacturer::RGTCycling),
5616            "vasa" => Some(Manufacturer::Vasa),
5617            "race_republic" => Some(Manufacturer::RaceRepublic),
5618            "fazua" => Some(Manufacturer::Fazua),
5619            "oreka_training" => Some(Manufacturer::OrekaTraining),
5620            "lsec" => Some(Manufacturer::Lsec),
5621            "lululemon_studio" => Some(Manufacturer::LululemonStudio),
5622            "shanyue" => Some(Manufacturer::Shanyue),
5623            "spinning_mda" => Some(Manufacturer::SpinningMda),
5624            "hilldating" => Some(Manufacturer::Hilldating),
5625            "aero_sensor" => Some(Manufacturer::AeroSensor),
5626            "nike" => Some(Manufacturer::Nike),
5627            "magicshine" => Some(Manufacturer::Magicshine),
5628            "ictrainer" => Some(Manufacturer::Ictrainer),
5629            "absolute_cycling" => Some(Manufacturer::AbsoluteCycling),
5630            "eo_swimbetter" => Some(Manufacturer::EoSwimbetter),
5631            "mywhoosh" => Some(Manufacturer::Mywhoosh),
5632            "ravemen" => Some(Manufacturer::Ravemen),
5633            "tektro_racing_products" => Some(Manufacturer::TektroRacingProducts),
5634            "darad_innovation_corporation" => Some(Manufacturer::DaradInnovationCorporation),
5635            "cycloptim" => Some(Manufacturer::Cycloptim),
5636            "runna" => Some(Manufacturer::Runna),
5637            "zepp" => Some(Manufacturer::Zepp),
5638            "peloton" => Some(Manufacturer::Peloton),
5639            "carv" => Some(Manufacturer::Carv),
5640            "tissot" => Some(Manufacturer::Tissot),
5641            "real_velo" => Some(Manufacturer::RealVelo),
5642            "wetech" => Some(Manufacturer::Wetech),
5643            "jespr" => Some(Manufacturer::Jespr),
5644            "huawei" => Some(Manufacturer::Huawei),
5645            "gotoes" => Some(Manufacturer::Gotoes),
5646            "actigraphcorp" => Some(Manufacturer::Actigraphcorp),
5647            _ => None,
5648        }
5649    }
5650}
5651
5652#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
5653#[repr(u16)]
5654#[non_exhaustive]
5655pub enum GarminProduct {
5656    Hrm1 = 1,
5657    Axh01 = 2,
5658    Axb01 = 3,
5659    Axb02 = 4,
5660    Hrm2ss = 5,
5661    DsiAlf02 = 6,
5662    Hrm3ss = 7,
5663    HrmRunSingleByteProductId = 8,
5664    Bsm = 9,
5665    Bcm = 10,
5666    Axs01 = 11,
5667    HrmTriSingleByteProductId = 12,
5668    Hrm4RunSingleByteProductId = 13,
5669    Fr225SingleByteProductId = 14,
5670    Gen3BsmSingleByteProductId = 15,
5671    Gen3BcmSingleByteProductId = 16,
5672    HrmFitSingleByteProductId = 22,
5673    OHR = 255,
5674    Fr301China = 473,
5675    Fr301Japan = 474,
5676    Fr301Korea = 475,
5677    Fr301Taiwan = 494,
5678    Fr405 = 717,
5679    Fr50 = 782,
5680    Fr405Japan = 987,
5681    Fr60 = 988,
5682    DsiAlf01 = 1011,
5683    Fr310xt = 1018,
5684    Edge500 = 1036,
5685    Fr110 = 1124,
5686    Edge800 = 1169,
5687    Edge500Taiwan = 1199,
5688    Edge500Japan = 1213,
5689    Chirp = 1253,
5690    Fr110Japan = 1274,
5691    Edge200 = 1325,
5692    Fr910xt = 1328,
5693    Edge800Taiwan = 1333,
5694    Edge800Japan = 1334,
5695    Alf04 = 1341,
5696    Fr610 = 1345,
5697    Fr210Japan = 1360,
5698    VectorSs = 1380,
5699    VectorCp = 1381,
5700    Edge800China = 1386,
5701    Edge500China = 1387,
5702    ApproachG10 = 1405,
5703    Fr610Japan = 1410,
5704    Edge500Korea = 1422,
5705    Fr70 = 1436,
5706    Fr310xt4t = 1446,
5707    Amx = 1461,
5708    Fr10 = 1482,
5709    Edge800Korea = 1497,
5710    Swim = 1499,
5711    Fr910xtChina = 1537,
5712    Fenix = 1551,
5713    Edge200Taiwan = 1555,
5714    Edge510 = 1561,
5715    Edge810 = 1567,
5716    Tempe = 1570,
5717    Fr910xtJapan = 1600,
5718    Fr620 = 1623,
5719    Fr220 = 1632,
5720    Fr910xtKorea = 1664,
5721    Fr10Japan = 1688,
5722    Edge810Japan = 1721,
5723    VirbElite = 1735,
5724    EdgeTouring = 1736,
5725    Edge510Japan = 1742,
5726    HrmTri = 1743,
5727    HrmRun = 1752,
5728    Fr920xt = 1765,
5729    Edge510Asia = 1821,
5730    Edge810China = 1822,
5731    Edge810Taiwan = 1823,
5732    Edge1000 = 1836,
5733    VivoFit = 1837,
5734    VirbRemote = 1853,
5735    VivoKi = 1885,
5736    Fr15 = 1903,
5737    VivoActive = 1907,
5738    Edge510Korea = 1918,
5739    Fr620Japan = 1928,
5740    Fr620China = 1929,
5741    Fr220Japan = 1930,
5742    Fr220China = 1931,
5743    ApproachS6 = 1936,
5744    VivoSmart = 1956,
5745    Fenix2 = 1967,
5746    Epix = 1988,
5747    Fenix3 = 2050,
5748    Edge1000Taiwan = 2052,
5749    Edge1000Japan = 2053,
5750    Fr15Japan = 2061,
5751    Edge520 = 2067,
5752    Edge1000China = 2070,
5753    Fr620Russia = 2072,
5754    Fr220Russia = 2073,
5755    VectorS = 2079,
5756    Edge1000Korea = 2100,
5757    Fr920xtTaiwan = 2130,
5758    Fr920xtChina = 2131,
5759    Fr920xtJapan = 2132,
5760    Virbx = 2134,
5761    VivoSmartApac = 2135,
5762    EtrexTouch = 2140,
5763    Edge25 = 2147,
5764    Fr25 = 2148,
5765    VivoFit2 = 2150,
5766    Fr225 = 2153,
5767    Fr630 = 2156,
5768    Fr230 = 2157,
5769    Fr735xt = 2158,
5770    VivoActiveApac = 2160,
5771    Vector2 = 2161,
5772    Vector2s = 2162,
5773    Virbxe = 2172,
5774    Fr620Taiwan = 2173,
5775    Fr220Taiwan = 2174,
5776    Truswing = 2175,
5777    D2airvenu = 2187,
5778    Fenix3China = 2188,
5779    Fenix3Twn = 2189,
5780    VariaHeadlight = 2192,
5781    VariaTaillightOld = 2193,
5782    EdgeExplore1000 = 2204,
5783    Fr225Asia = 2219,
5784    VariaRadarTaillight = 2225,
5785    VariaRadarDisplay = 2226,
5786    Edge20 = 2238,
5787    Edge520Asia = 2260,
5788    Edge520Japan = 2261,
5789    D2Bravo = 2262,
5790    ApproachS20 = 2266,
5791    VivoSmart2 = 2271,
5792    Edge1000Thai = 2274,
5793    VariaRemote = 2276,
5794    Edge25Asia = 2288,
5795    Edge25Jpn = 2289,
5796    Edge20Asia = 2290,
5797    ApproachX40 = 2292,
5798    Fenix3Japan = 2293,
5799    VivoSmartEmea = 2294,
5800    Fr630Asia = 2310,
5801    Fr630Jpn = 2311,
5802    Fr230Jpn = 2313,
5803    Hrm4Run = 2327,
5804    EpixJapan = 2332,
5805    VivoActiveHr = 2337,
5806    VivoSmartGpsHr = 2347,
5807    VivoSmartHr = 2348,
5808    VivoSmartHrAsia = 2361,
5809    VivoSmartGpsHrAsia = 2362,
5810    VivoMove = 2368,
5811    VariaTaillight = 2379,
5812    Fr235Asia = 2396,
5813    Fr235Japan = 2397,
5814    VariaVision = 2398,
5815    VivoFit3 = 2406,
5816    Fenix3Korea = 2407,
5817    Fenix3Sea = 2408,
5818    Fenix3Hr = 2413,
5819    VirbUltra30 = 2417,
5820    IndexSmartScale = 2429,
5821    Fr235 = 2431,
5822    Fenix3Chronos = 2432,
5823    Oregon7xx = 2441,
5824    Rino7xx = 2444,
5825    EpixKorea = 2457,
5826    Fenix3HrChn = 2473,
5827    Fenix3HrTwn = 2474,
5828    Fenix3HrJpn = 2475,
5829    Fenix3HrSea = 2476,
5830    Fenix3HrKor = 2477,
5831    Nautix = 2496,
5832    VivoActiveHrApac = 2497,
5833    Fr35 = 2503,
5834    Oregon7xxWw = 2512,
5835    Edge820 = 2530,
5836    EdgeExplore820 = 2531,
5837    Fr735xtApac = 2533,
5838    Fr735xtJapan = 2534,
5839    Fenix5s = 2544,
5840    D2BravoTitanium = 2547,
5841    VariaUt800 = 2567,
5842    RunningDynamicsPod = 2593,
5843    Edge820China = 2599,
5844    Edge820Japan = 2600,
5845    Fenix5x = 2604,
5846    VivoFitJr = 2606,
5847    VivoSmart3 = 2622,
5848    VivoSport = 2623,
5849    Edge820Taiwan = 2628,
5850    Edge820Korea = 2629,
5851    Edge820Sea = 2630,
5852    Fr35Hebrew = 2650,
5853    ApproachS60 = 2656,
5854    Fr35Apac = 2667,
5855    Fr35Japan = 2668,
5856    Fenix3ChronosAsia = 2675,
5857    Virb360 = 2687,
5858    Fr935 = 2691,
5859    Fenix5 = 2697,
5860    Vivoactive3 = 2700,
5861    Fr235ChinaNfc = 2733,
5862    Foretrex601701 = 2769,
5863    VivoMoveHr = 2772,
5864    Edge1030 = 2713,
5865    Fr35Sea = 2727,
5866    Vector3 = 2787,
5867    Fenix5Asia = 2796,
5868    Fenix5sAsia = 2797,
5869    Fenix5xAsia = 2798,
5870    ApproachZ80 = 2806,
5871    Fr35Korea = 2814,
5872    D2charlie = 2819,
5873    VivoSmart3Apac = 2831,
5874    VivoSportApac = 2832,
5875    Fr935Asia = 2833,
5876    Descent = 2859,
5877    VivoFit4 = 2878,
5878    Fr645 = 2886,
5879    Fr645m = 2888,
5880    Fr30 = 2891,
5881    Fenix5sPlus = 2900,
5882    Edge130 = 2909,
5883    Edge1030Asia = 2924,
5884    Vivosmart4 = 2927,
5885    VivoMoveHrAsia = 2945,
5886    ApproachX10 = 2962,
5887    Fr30Asia = 2977,
5888    Vivoactive3mW = 2988,
5889    Fr645Asia = 3003,
5890    Fr645mAsia = 3004,
5891    EdgeExplore = 3011,
5892    Gpsmap66 = 3028,
5893    ApproachS10 = 3049,
5894    Vivoactive3mL = 3066,
5895    Fr245 = 3076,
5896    Fr245Music = 3077,
5897    ApproachG80 = 3085,
5898    Edge130Asia = 3092,
5899    Edge1030Bontrager = 3095,
5900    Fenix5Plus = 3110,
5901    Fenix5xPlus = 3111,
5902    Edge520Plus = 3112,
5903    Fr945 = 3113,
5904    Edge530 = 3121,
5905    Edge830 = 3122,
5906    InstinctEsports = 3126,
5907    Fenix5sPlusApac = 3134,
5908    Fenix5xPlusApac = 3135,
5909    Edge520PlusApac = 3142,
5910    DescentT1 = 3143,
5911    Fr235lAsia = 3144,
5912    Fr245Asia = 3145,
5913    VivoActive3mApac = 3163,
5914    Gen3Bsm = 3192,
5915    Gen3Bcm = 3193,
5916    VivoSmart4Asia = 3218,
5917    Vivoactive4Small = 3224,
5918    Vivoactive4Large = 3225,
5919    Venu = 3226,
5920    MarqDriver = 3246,
5921    MarqAviator = 3247,
5922    MarqCaptain = 3248,
5923    MarqCommander = 3249,
5924    MarqExpedition = 3250,
5925    MarqAthlete = 3251,
5926    DescentMk2 = 3258,
5927    Fr45 = 3282,
5928    Gpsmap66i = 3284,
5929    Fenix6SSport = 3287,
5930    Fenix6S = 3288,
5931    Fenix6Sport = 3289,
5932    Fenix6 = 3290,
5933    Fenix6x = 3291,
5934    HrmDual = 3299,
5935    HrmPro = 3300,
5936    VivoMove3Premium = 3308,
5937    ApproachS40 = 3314,
5938    Fr245mAsia = 3321,
5939    Edge530Apac = 3349,
5940    Edge830Apac = 3350,
5941    VivoMove3 = 3378,
5942    VivoActive4SmallAsia = 3387,
5943    VivoActive4LargeAsia = 3388,
5944    VivoActive4OledAsia = 3389,
5945    Swim2 = 3405,
5946    MarqDriverAsia = 3420,
5947    MarqAviatorAsia = 3421,
5948    VivoMove3Asia = 3422,
5949    Fr945Asia = 3441,
5950    VivoActive3tChn = 3446,
5951    MarqCaptainAsia = 3448,
5952    MarqCommanderAsia = 3449,
5953    MarqExpeditionAsia = 3450,
5954    MarqAthleteAsia = 3451,
5955    IndexSmartScale2 = 3461,
5956    InstinctSolar = 3466,
5957    Fr45Asia = 3469,
5958    Vivoactive3Daimler = 3473,
5959    LegacyRey = 3498,
5960    LegacyDarthVader = 3499,
5961    LegacyCaptainMarvel = 3500,
5962    LegacyFirstAvenger = 3501,
5963    Fenix6sSportAsia = 3512,
5964    Fenix6sAsia = 3513,
5965    Fenix6SportAsia = 3514,
5966    Fenix6Asia = 3515,
5967    Fenix6xAsia = 3516,
5968    LegacyCaptainMarvelAsia = 3535,
5969    LegacyFirstAvengerAsia = 3536,
5970    LegacyReyAsia = 3537,
5971    LegacyDarthVaderAsia = 3538,
5972    DescentMk2s = 3542,
5973    Edge130Plus = 3558,
5974    Edge1030Plus = 3570,
5975    Rally200 = 3578,
5976    Fr745 = 3589,
5977    VenusqMusic = 3596,
5978    VenusqMusicV2 = 3599,
5979    Venusq = 3600,
5980    Lily = 3615,
5981    MarqAdventurer = 3624,
5982    Enduro = 3638,
5983    Swim2Apac = 3639,
5984    MarqAdventurerAsia = 3648,
5985    Fr945Lte = 3652,
5986    DescentMk2Asia = 3702,
5987    Venu2 = 3703,
5988    Venu2s = 3704,
5989    VenuDaimlerAsia = 3737,
5990    MarqGolfer = 3739,
5991    VenuDaimler = 3740,
5992    Fr745Asia = 3794,
5993    VariaRct715 = 3808,
5994    LilyAsia = 3809,
5995    Edge1030PlusAsia = 3812,
5996    Edge130PlusAsia = 3813,
5997    ApproachS12 = 3823,
5998    EnduroAsia = 3872,
5999    VenusqAsia = 3837,
6000    Edge1040 = 3843,
6001    MarqGolferAsia = 3850,
6002    Venu2Plus = 3851,
6003    Gnss = 3865,
6004    Fr55 = 3869,
6005    Instinct2 = 3888,
6006    Instinct2s = 3889,
6007    Fenix7s = 3905,
6008    Fenix7 = 3906,
6009    Fenix7x = 3907,
6010    Fenix7sApac = 3908,
6011    Fenix7Apac = 3909,
6012    Fenix7xApac = 3910,
6013    ApproachG12 = 3927,
6014    DescentMk2sAsia = 3930,
6015    ApproachS42 = 3934,
6016    EpixGen2 = 3943,
6017    EpixGen2Apac = 3944,
6018    Venu2sAsia = 3949,
6019    Venu2Asia = 3950,
6020    Fr945LteAsia = 3978,
6021    VivoMoveSport = 3982,
6022    VivomoveTrend = 3983,
6023    ApproachS12Asia = 3986,
6024    Fr255Music = 3990,
6025    Fr255SmallMusic = 3991,
6026    Fr255 = 3992,
6027    Fr255Small = 3993,
6028    ApproachG12Asia = 4001,
6029    ApproachS42Asia = 4002,
6030    DescentG1 = 4005,
6031    Venu2PlusAsia = 4017,
6032    Fr955 = 4024,
6033    Fr55Asia = 4033,
6034    Edge540 = 4061,
6035    Edge840 = 4062,
6036    Vivosmart5 = 4063,
6037    Instinct2Asia = 4071,
6038    MarqGen2 = 4105,
6039    Venusq2 = 4115,
6040    Venusq2music = 4116,
6041    MarqGen2Aviator = 4124,
6042    D2AirX10 = 4125,
6043    HrmProPlus = 4130,
6044    DescentG1Asia = 4132,
6045    Tactix7 = 4135,
6046    InstinctCrossover = 4155,
6047    EdgeExplore2 = 4169,
6048    DescentMk3 = 4222,
6049    DescentMk3i = 4223,
6050    ApproachS70 = 4233,
6051    Fr265Large = 4257,
6052    Fr265Small = 4258,
6053    Venu3 = 4260,
6054    Venu3s = 4261,
6055    TacxNeoSmart = 4265,
6056    TacxNeo2Smart = 4266,
6057    TacxNeo2TSmart = 4267,
6058    TacxNeoSmartBike = 4268,
6059    TacxSatoriSmart = 4269,
6060    TacxFlowSmart = 4270,
6061    TacxVortexSmart = 4271,
6062    TacxBushidoSmart = 4272,
6063    TacxGeniusSmart = 4273,
6064    TacxFluxFluxSSmart = 4274,
6065    TacxFlux2Smart = 4275,
6066    TacxMagnum = 4276,
6067    Edge1040Asia = 4305,
6068    EpixGen2Pro42 = 4312,
6069    EpixGen2Pro47 = 4313,
6070    EpixGen2Pro51 = 4314,
6071    Fr965 = 4315,
6072    Enduro2 = 4341,
6073    Fenix7sProSolar = 4374,
6074    Fenix7ProSolar = 4375,
6075    Fenix7xProSolar = 4376,
6076    Lily2 = 4380,
6077    Instinct2x = 4394,
6078    Vivoactive5 = 4426,
6079    Fr165 = 4432,
6080    Fr165Music = 4433,
6081    Edge1050 = 4440,
6082    DescentT2 = 4442,
6083    HrmFit = 4446,
6084    MarqGen2Commander = 4472,
6085    LilyAthlete = 4477,
6086    RallyX10 = 4525,
6087    Fenix8Solar = 4532,
6088    Fenix8SolarLarge = 4533,
6089    Fenix8Small = 4534,
6090    Fenix8 = 4536,
6091    D2Mach1Pro = 4556,
6092    Enduro3 = 4575,
6093    InstinctE40mm = 4583,
6094    InstinctE45mm = 4584,
6095    Instinct3Solar45mm = 4585,
6096    Instinct3Amoled45mm = 4586,
6097    Instinct3Amoled50mm = 4587,
6098    DescentG2 = 4588,
6099    VenuX1 = 4603,
6100    Hrm200 = 4606,
6101    Vivoactive6 = 4625,
6102    Fenix8Pro = 4631,
6103    Edge550 = 4633,
6104    Edge850 = 4634,
6105    Venu4 = 4643,
6106    Venu4s = 4644,
6107    ApproachS44 = 4647,
6108    EdgeMtb = 4655,
6109    ApproachS50 = 4656,
6110    FenixE = 4666,
6111    Bounce2 = 4745,
6112    Instinct3Solar50mm = 4759,
6113    Tactix8Amoled = 4775,
6114    Tactix8Solar = 4776,
6115    ApproachJ1 = 4825,
6116    D2Mach2 = 4879,
6117    InstinctCrossoverAmoled = 4678,
6118    D2AirX15 = 4944,
6119    Sdm4 = 10007,
6120    EdgeRemote = 10014,
6121    TacxTrainingAppWin = 20533,
6122    TacxTrainingAppMac = 20534,
6123    TacxTrainingAppMacCatalyst = 20565,
6124    TrainingCenter = 20119,
6125    TacxTrainingAppAndroid = 30045,
6126    TacxTrainingAppIos = 30046,
6127    TacxTrainingAppLegacy = 30047,
6128    ConnectiqSimulator = 65531,
6129    AndroidAntplusPlugin = 65532,
6130    Connect = 65534,
6131}
6132
6133impl GarminProduct {
6134    /// Snake-case canonical name from Profile.xlsx.
6135    pub fn as_str(&self) -> &'static str {
6136        match self {
6137            GarminProduct::Hrm1 => "hrm1",
6138            GarminProduct::Axh01 => "axh01",
6139            GarminProduct::Axb01 => "axb01",
6140            GarminProduct::Axb02 => "axb02",
6141            GarminProduct::Hrm2ss => "hrm2ss",
6142            GarminProduct::DsiAlf02 => "dsi_alf02",
6143            GarminProduct::Hrm3ss => "hrm3ss",
6144            GarminProduct::HrmRunSingleByteProductId => "hrm_run_single_byte_product_id",
6145            GarminProduct::Bsm => "bsm",
6146            GarminProduct::Bcm => "bcm",
6147            GarminProduct::Axs01 => "axs01",
6148            GarminProduct::HrmTriSingleByteProductId => "hrm_tri_single_byte_product_id",
6149            GarminProduct::Hrm4RunSingleByteProductId => "hrm4_run_single_byte_product_id",
6150            GarminProduct::Fr225SingleByteProductId => "fr225_single_byte_product_id",
6151            GarminProduct::Gen3BsmSingleByteProductId => "gen3_bsm_single_byte_product_id",
6152            GarminProduct::Gen3BcmSingleByteProductId => "gen3_bcm_single_byte_product_id",
6153            GarminProduct::HrmFitSingleByteProductId => "hrm_fit_single_byte_product_id",
6154            GarminProduct::OHR => "OHR",
6155            GarminProduct::Fr301China => "fr301_china",
6156            GarminProduct::Fr301Japan => "fr301_japan",
6157            GarminProduct::Fr301Korea => "fr301_korea",
6158            GarminProduct::Fr301Taiwan => "fr301_taiwan",
6159            GarminProduct::Fr405 => "fr405",
6160            GarminProduct::Fr50 => "fr50",
6161            GarminProduct::Fr405Japan => "fr405_japan",
6162            GarminProduct::Fr60 => "fr60",
6163            GarminProduct::DsiAlf01 => "dsi_alf01",
6164            GarminProduct::Fr310xt => "fr310xt",
6165            GarminProduct::Edge500 => "edge500",
6166            GarminProduct::Fr110 => "fr110",
6167            GarminProduct::Edge800 => "edge800",
6168            GarminProduct::Edge500Taiwan => "edge500_taiwan",
6169            GarminProduct::Edge500Japan => "edge500_japan",
6170            GarminProduct::Chirp => "chirp",
6171            GarminProduct::Fr110Japan => "fr110_japan",
6172            GarminProduct::Edge200 => "edge200",
6173            GarminProduct::Fr910xt => "fr910xt",
6174            GarminProduct::Edge800Taiwan => "edge800_taiwan",
6175            GarminProduct::Edge800Japan => "edge800_japan",
6176            GarminProduct::Alf04 => "alf04",
6177            GarminProduct::Fr610 => "fr610",
6178            GarminProduct::Fr210Japan => "fr210_japan",
6179            GarminProduct::VectorSs => "vector_ss",
6180            GarminProduct::VectorCp => "vector_cp",
6181            GarminProduct::Edge800China => "edge800_china",
6182            GarminProduct::Edge500China => "edge500_china",
6183            GarminProduct::ApproachG10 => "approach_g10",
6184            GarminProduct::Fr610Japan => "fr610_japan",
6185            GarminProduct::Edge500Korea => "edge500_korea",
6186            GarminProduct::Fr70 => "fr70",
6187            GarminProduct::Fr310xt4t => "fr310xt_4t",
6188            GarminProduct::Amx => "amx",
6189            GarminProduct::Fr10 => "fr10",
6190            GarminProduct::Edge800Korea => "edge800_korea",
6191            GarminProduct::Swim => "swim",
6192            GarminProduct::Fr910xtChina => "fr910xt_china",
6193            GarminProduct::Fenix => "fenix",
6194            GarminProduct::Edge200Taiwan => "edge200_taiwan",
6195            GarminProduct::Edge510 => "edge510",
6196            GarminProduct::Edge810 => "edge810",
6197            GarminProduct::Tempe => "tempe",
6198            GarminProduct::Fr910xtJapan => "fr910xt_japan",
6199            GarminProduct::Fr620 => "fr620",
6200            GarminProduct::Fr220 => "fr220",
6201            GarminProduct::Fr910xtKorea => "fr910xt_korea",
6202            GarminProduct::Fr10Japan => "fr10_japan",
6203            GarminProduct::Edge810Japan => "edge810_japan",
6204            GarminProduct::VirbElite => "virb_elite",
6205            GarminProduct::EdgeTouring => "edge_touring",
6206            GarminProduct::Edge510Japan => "edge510_japan",
6207            GarminProduct::HrmTri => "hrm_tri",
6208            GarminProduct::HrmRun => "hrm_run",
6209            GarminProduct::Fr920xt => "fr920xt",
6210            GarminProduct::Edge510Asia => "edge510_asia",
6211            GarminProduct::Edge810China => "edge810_china",
6212            GarminProduct::Edge810Taiwan => "edge810_taiwan",
6213            GarminProduct::Edge1000 => "edge1000",
6214            GarminProduct::VivoFit => "vivo_fit",
6215            GarminProduct::VirbRemote => "virb_remote",
6216            GarminProduct::VivoKi => "vivo_ki",
6217            GarminProduct::Fr15 => "fr15",
6218            GarminProduct::VivoActive => "vivo_active",
6219            GarminProduct::Edge510Korea => "edge510_korea",
6220            GarminProduct::Fr620Japan => "fr620_japan",
6221            GarminProduct::Fr620China => "fr620_china",
6222            GarminProduct::Fr220Japan => "fr220_japan",
6223            GarminProduct::Fr220China => "fr220_china",
6224            GarminProduct::ApproachS6 => "approach_s6",
6225            GarminProduct::VivoSmart => "vivo_smart",
6226            GarminProduct::Fenix2 => "fenix2",
6227            GarminProduct::Epix => "epix",
6228            GarminProduct::Fenix3 => "fenix3",
6229            GarminProduct::Edge1000Taiwan => "edge1000_taiwan",
6230            GarminProduct::Edge1000Japan => "edge1000_japan",
6231            GarminProduct::Fr15Japan => "fr15_japan",
6232            GarminProduct::Edge520 => "edge520",
6233            GarminProduct::Edge1000China => "edge1000_china",
6234            GarminProduct::Fr620Russia => "fr620_russia",
6235            GarminProduct::Fr220Russia => "fr220_russia",
6236            GarminProduct::VectorS => "vector_s",
6237            GarminProduct::Edge1000Korea => "edge1000_korea",
6238            GarminProduct::Fr920xtTaiwan => "fr920xt_taiwan",
6239            GarminProduct::Fr920xtChina => "fr920xt_china",
6240            GarminProduct::Fr920xtJapan => "fr920xt_japan",
6241            GarminProduct::Virbx => "virbx",
6242            GarminProduct::VivoSmartApac => "vivo_smart_apac",
6243            GarminProduct::EtrexTouch => "etrex_touch",
6244            GarminProduct::Edge25 => "edge25",
6245            GarminProduct::Fr25 => "fr25",
6246            GarminProduct::VivoFit2 => "vivo_fit2",
6247            GarminProduct::Fr225 => "fr225",
6248            GarminProduct::Fr630 => "fr630",
6249            GarminProduct::Fr230 => "fr230",
6250            GarminProduct::Fr735xt => "fr735xt",
6251            GarminProduct::VivoActiveApac => "vivo_active_apac",
6252            GarminProduct::Vector2 => "vector_2",
6253            GarminProduct::Vector2s => "vector_2s",
6254            GarminProduct::Virbxe => "virbxe",
6255            GarminProduct::Fr620Taiwan => "fr620_taiwan",
6256            GarminProduct::Fr220Taiwan => "fr220_taiwan",
6257            GarminProduct::Truswing => "truswing",
6258            GarminProduct::D2airvenu => "d2airvenu",
6259            GarminProduct::Fenix3China => "fenix3_china",
6260            GarminProduct::Fenix3Twn => "fenix3_twn",
6261            GarminProduct::VariaHeadlight => "varia_headlight",
6262            GarminProduct::VariaTaillightOld => "varia_taillight_old",
6263            GarminProduct::EdgeExplore1000 => "edge_explore_1000",
6264            GarminProduct::Fr225Asia => "fr225_asia",
6265            GarminProduct::VariaRadarTaillight => "varia_radar_taillight",
6266            GarminProduct::VariaRadarDisplay => "varia_radar_display",
6267            GarminProduct::Edge20 => "edge20",
6268            GarminProduct::Edge520Asia => "edge520_asia",
6269            GarminProduct::Edge520Japan => "edge520_japan",
6270            GarminProduct::D2Bravo => "d2_bravo",
6271            GarminProduct::ApproachS20 => "approach_s20",
6272            GarminProduct::VivoSmart2 => "vivo_smart2",
6273            GarminProduct::Edge1000Thai => "edge1000_thai",
6274            GarminProduct::VariaRemote => "varia_remote",
6275            GarminProduct::Edge25Asia => "edge25_asia",
6276            GarminProduct::Edge25Jpn => "edge25_jpn",
6277            GarminProduct::Edge20Asia => "edge20_asia",
6278            GarminProduct::ApproachX40 => "approach_x40",
6279            GarminProduct::Fenix3Japan => "fenix3_japan",
6280            GarminProduct::VivoSmartEmea => "vivo_smart_emea",
6281            GarminProduct::Fr630Asia => "fr630_asia",
6282            GarminProduct::Fr630Jpn => "fr630_jpn",
6283            GarminProduct::Fr230Jpn => "fr230_jpn",
6284            GarminProduct::Hrm4Run => "hrm4_run",
6285            GarminProduct::EpixJapan => "epix_japan",
6286            GarminProduct::VivoActiveHr => "vivo_active_hr",
6287            GarminProduct::VivoSmartGpsHr => "vivo_smart_gps_hr",
6288            GarminProduct::VivoSmartHr => "vivo_smart_hr",
6289            GarminProduct::VivoSmartHrAsia => "vivo_smart_hr_asia",
6290            GarminProduct::VivoSmartGpsHrAsia => "vivo_smart_gps_hr_asia",
6291            GarminProduct::VivoMove => "vivo_move",
6292            GarminProduct::VariaTaillight => "varia_taillight",
6293            GarminProduct::Fr235Asia => "fr235_asia",
6294            GarminProduct::Fr235Japan => "fr235_japan",
6295            GarminProduct::VariaVision => "varia_vision",
6296            GarminProduct::VivoFit3 => "vivo_fit3",
6297            GarminProduct::Fenix3Korea => "fenix3_korea",
6298            GarminProduct::Fenix3Sea => "fenix3_sea",
6299            GarminProduct::Fenix3Hr => "fenix3_hr",
6300            GarminProduct::VirbUltra30 => "virb_ultra_30",
6301            GarminProduct::IndexSmartScale => "index_smart_scale",
6302            GarminProduct::Fr235 => "fr235",
6303            GarminProduct::Fenix3Chronos => "fenix3_chronos",
6304            GarminProduct::Oregon7xx => "oregon7xx",
6305            GarminProduct::Rino7xx => "rino7xx",
6306            GarminProduct::EpixKorea => "epix_korea",
6307            GarminProduct::Fenix3HrChn => "fenix3_hr_chn",
6308            GarminProduct::Fenix3HrTwn => "fenix3_hr_twn",
6309            GarminProduct::Fenix3HrJpn => "fenix3_hr_jpn",
6310            GarminProduct::Fenix3HrSea => "fenix3_hr_sea",
6311            GarminProduct::Fenix3HrKor => "fenix3_hr_kor",
6312            GarminProduct::Nautix => "nautix",
6313            GarminProduct::VivoActiveHrApac => "vivo_active_hr_apac",
6314            GarminProduct::Fr35 => "fr35",
6315            GarminProduct::Oregon7xxWw => "oregon7xx_ww",
6316            GarminProduct::Edge820 => "edge_820",
6317            GarminProduct::EdgeExplore820 => "edge_explore_820",
6318            GarminProduct::Fr735xtApac => "fr735xt_apac",
6319            GarminProduct::Fr735xtJapan => "fr735xt_japan",
6320            GarminProduct::Fenix5s => "fenix5s",
6321            GarminProduct::D2BravoTitanium => "d2_bravo_titanium",
6322            GarminProduct::VariaUt800 => "varia_ut800",
6323            GarminProduct::RunningDynamicsPod => "running_dynamics_pod",
6324            GarminProduct::Edge820China => "edge_820_china",
6325            GarminProduct::Edge820Japan => "edge_820_japan",
6326            GarminProduct::Fenix5x => "fenix5x",
6327            GarminProduct::VivoFitJr => "vivo_fit_jr",
6328            GarminProduct::VivoSmart3 => "vivo_smart3",
6329            GarminProduct::VivoSport => "vivo_sport",
6330            GarminProduct::Edge820Taiwan => "edge_820_taiwan",
6331            GarminProduct::Edge820Korea => "edge_820_korea",
6332            GarminProduct::Edge820Sea => "edge_820_sea",
6333            GarminProduct::Fr35Hebrew => "fr35_hebrew",
6334            GarminProduct::ApproachS60 => "approach_s60",
6335            GarminProduct::Fr35Apac => "fr35_apac",
6336            GarminProduct::Fr35Japan => "fr35_japan",
6337            GarminProduct::Fenix3ChronosAsia => "fenix3_chronos_asia",
6338            GarminProduct::Virb360 => "virb_360",
6339            GarminProduct::Fr935 => "fr935",
6340            GarminProduct::Fenix5 => "fenix5",
6341            GarminProduct::Vivoactive3 => "vivoactive3",
6342            GarminProduct::Fr235ChinaNfc => "fr235_china_nfc",
6343            GarminProduct::Foretrex601701 => "foretrex_601_701",
6344            GarminProduct::VivoMoveHr => "vivo_move_hr",
6345            GarminProduct::Edge1030 => "edge_1030",
6346            GarminProduct::Fr35Sea => "fr35_sea",
6347            GarminProduct::Vector3 => "vector_3",
6348            GarminProduct::Fenix5Asia => "fenix5_asia",
6349            GarminProduct::Fenix5sAsia => "fenix5s_asia",
6350            GarminProduct::Fenix5xAsia => "fenix5x_asia",
6351            GarminProduct::ApproachZ80 => "approach_z80",
6352            GarminProduct::Fr35Korea => "fr35_korea",
6353            GarminProduct::D2charlie => "d2charlie",
6354            GarminProduct::VivoSmart3Apac => "vivo_smart3_apac",
6355            GarminProduct::VivoSportApac => "vivo_sport_apac",
6356            GarminProduct::Fr935Asia => "fr935_asia",
6357            GarminProduct::Descent => "descent",
6358            GarminProduct::VivoFit4 => "vivo_fit4",
6359            GarminProduct::Fr645 => "fr645",
6360            GarminProduct::Fr645m => "fr645m",
6361            GarminProduct::Fr30 => "fr30",
6362            GarminProduct::Fenix5sPlus => "fenix5s_plus",
6363            GarminProduct::Edge130 => "Edge_130",
6364            GarminProduct::Edge1030Asia => "edge_1030_asia",
6365            GarminProduct::Vivosmart4 => "vivosmart_4",
6366            GarminProduct::VivoMoveHrAsia => "vivo_move_hr_asia",
6367            GarminProduct::ApproachX10 => "approach_x10",
6368            GarminProduct::Fr30Asia => "fr30_asia",
6369            GarminProduct::Vivoactive3mW => "vivoactive3m_w",
6370            GarminProduct::Fr645Asia => "fr645_asia",
6371            GarminProduct::Fr645mAsia => "fr645m_asia",
6372            GarminProduct::EdgeExplore => "edge_explore",
6373            GarminProduct::Gpsmap66 => "gpsmap66",
6374            GarminProduct::ApproachS10 => "approach_s10",
6375            GarminProduct::Vivoactive3mL => "vivoactive3m_l",
6376            GarminProduct::Fr245 => "fr245",
6377            GarminProduct::Fr245Music => "fr245_music",
6378            GarminProduct::ApproachG80 => "approach_g80",
6379            GarminProduct::Edge130Asia => "edge_130_asia",
6380            GarminProduct::Edge1030Bontrager => "edge_1030_bontrager",
6381            GarminProduct::Fenix5Plus => "fenix5_plus",
6382            GarminProduct::Fenix5xPlus => "fenix5x_plus",
6383            GarminProduct::Edge520Plus => "edge_520_plus",
6384            GarminProduct::Fr945 => "fr945",
6385            GarminProduct::Edge530 => "edge_530",
6386            GarminProduct::Edge830 => "edge_830",
6387            GarminProduct::InstinctEsports => "instinct_esports",
6388            GarminProduct::Fenix5sPlusApac => "fenix5s_plus_apac",
6389            GarminProduct::Fenix5xPlusApac => "fenix5x_plus_apac",
6390            GarminProduct::Edge520PlusApac => "edge_520_plus_apac",
6391            GarminProduct::DescentT1 => "descent_t1",
6392            GarminProduct::Fr235lAsia => "fr235l_asia",
6393            GarminProduct::Fr245Asia => "fr245_asia",
6394            GarminProduct::VivoActive3mApac => "vivo_active3m_apac",
6395            GarminProduct::Gen3Bsm => "gen3_bsm",
6396            GarminProduct::Gen3Bcm => "gen3_bcm",
6397            GarminProduct::VivoSmart4Asia => "vivo_smart4_asia",
6398            GarminProduct::Vivoactive4Small => "vivoactive4_small",
6399            GarminProduct::Vivoactive4Large => "vivoactive4_large",
6400            GarminProduct::Venu => "venu",
6401            GarminProduct::MarqDriver => "marq_driver",
6402            GarminProduct::MarqAviator => "marq_aviator",
6403            GarminProduct::MarqCaptain => "marq_captain",
6404            GarminProduct::MarqCommander => "marq_commander",
6405            GarminProduct::MarqExpedition => "marq_expedition",
6406            GarminProduct::MarqAthlete => "marq_athlete",
6407            GarminProduct::DescentMk2 => "descent_mk2",
6408            GarminProduct::Fr45 => "fr45",
6409            GarminProduct::Gpsmap66i => "gpsmap66i",
6410            GarminProduct::Fenix6SSport => "fenix6S_sport",
6411            GarminProduct::Fenix6S => "fenix6S",
6412            GarminProduct::Fenix6Sport => "fenix6_sport",
6413            GarminProduct::Fenix6 => "fenix6",
6414            GarminProduct::Fenix6x => "fenix6x",
6415            GarminProduct::HrmDual => "hrm_dual",
6416            GarminProduct::HrmPro => "hrm_pro",
6417            GarminProduct::VivoMove3Premium => "vivo_move3_premium",
6418            GarminProduct::ApproachS40 => "approach_s40",
6419            GarminProduct::Fr245mAsia => "fr245m_asia",
6420            GarminProduct::Edge530Apac => "edge_530_apac",
6421            GarminProduct::Edge830Apac => "edge_830_apac",
6422            GarminProduct::VivoMove3 => "vivo_move3",
6423            GarminProduct::VivoActive4SmallAsia => "vivo_active4_small_asia",
6424            GarminProduct::VivoActive4LargeAsia => "vivo_active4_large_asia",
6425            GarminProduct::VivoActive4OledAsia => "vivo_active4_oled_asia",
6426            GarminProduct::Swim2 => "swim2",
6427            GarminProduct::MarqDriverAsia => "marq_driver_asia",
6428            GarminProduct::MarqAviatorAsia => "marq_aviator_asia",
6429            GarminProduct::VivoMove3Asia => "vivo_move3_asia",
6430            GarminProduct::Fr945Asia => "fr945_asia",
6431            GarminProduct::VivoActive3tChn => "vivo_active3t_chn",
6432            GarminProduct::MarqCaptainAsia => "marq_captain_asia",
6433            GarminProduct::MarqCommanderAsia => "marq_commander_asia",
6434            GarminProduct::MarqExpeditionAsia => "marq_expedition_asia",
6435            GarminProduct::MarqAthleteAsia => "marq_athlete_asia",
6436            GarminProduct::IndexSmartScale2 => "index_smart_scale_2",
6437            GarminProduct::InstinctSolar => "instinct_solar",
6438            GarminProduct::Fr45Asia => "fr45_asia",
6439            GarminProduct::Vivoactive3Daimler => "vivoactive3_daimler",
6440            GarminProduct::LegacyRey => "legacy_rey",
6441            GarminProduct::LegacyDarthVader => "legacy_darth_vader",
6442            GarminProduct::LegacyCaptainMarvel => "legacy_captain_marvel",
6443            GarminProduct::LegacyFirstAvenger => "legacy_first_avenger",
6444            GarminProduct::Fenix6sSportAsia => "fenix6s_sport_asia",
6445            GarminProduct::Fenix6sAsia => "fenix6s_asia",
6446            GarminProduct::Fenix6SportAsia => "fenix6_sport_asia",
6447            GarminProduct::Fenix6Asia => "fenix6_asia",
6448            GarminProduct::Fenix6xAsia => "fenix6x_asia",
6449            GarminProduct::LegacyCaptainMarvelAsia => "legacy_captain_marvel_asia",
6450            GarminProduct::LegacyFirstAvengerAsia => "legacy_first_avenger_asia",
6451            GarminProduct::LegacyReyAsia => "legacy_rey_asia",
6452            GarminProduct::LegacyDarthVaderAsia => "legacy_darth_vader_asia",
6453            GarminProduct::DescentMk2s => "descent_mk2s",
6454            GarminProduct::Edge130Plus => "edge_130_plus",
6455            GarminProduct::Edge1030Plus => "edge_1030_plus",
6456            GarminProduct::Rally200 => "rally_200",
6457            GarminProduct::Fr745 => "fr745",
6458            GarminProduct::VenusqMusic => "venusq_music",
6459            GarminProduct::VenusqMusicV2 => "venusq_music_v2",
6460            GarminProduct::Venusq => "venusq",
6461            GarminProduct::Lily => "lily",
6462            GarminProduct::MarqAdventurer => "marq_adventurer",
6463            GarminProduct::Enduro => "enduro",
6464            GarminProduct::Swim2Apac => "swim2_apac",
6465            GarminProduct::MarqAdventurerAsia => "marq_adventurer_asia",
6466            GarminProduct::Fr945Lte => "fr945_lte",
6467            GarminProduct::DescentMk2Asia => "descent_mk2_asia",
6468            GarminProduct::Venu2 => "venu2",
6469            GarminProduct::Venu2s => "venu2s",
6470            GarminProduct::VenuDaimlerAsia => "venu_daimler_asia",
6471            GarminProduct::MarqGolfer => "marq_golfer",
6472            GarminProduct::VenuDaimler => "venu_daimler",
6473            GarminProduct::Fr745Asia => "fr745_asia",
6474            GarminProduct::VariaRct715 => "varia_rct715",
6475            GarminProduct::LilyAsia => "lily_asia",
6476            GarminProduct::Edge1030PlusAsia => "edge_1030_plus_asia",
6477            GarminProduct::Edge130PlusAsia => "edge_130_plus_asia",
6478            GarminProduct::ApproachS12 => "approach_s12",
6479            GarminProduct::EnduroAsia => "enduro_asia",
6480            GarminProduct::VenusqAsia => "venusq_asia",
6481            GarminProduct::Edge1040 => "edge_1040",
6482            GarminProduct::MarqGolferAsia => "marq_golfer_asia",
6483            GarminProduct::Venu2Plus => "venu2_plus",
6484            GarminProduct::Gnss => "gnss",
6485            GarminProduct::Fr55 => "fr55",
6486            GarminProduct::Instinct2 => "instinct_2",
6487            GarminProduct::Instinct2s => "instinct_2s",
6488            GarminProduct::Fenix7s => "fenix7s",
6489            GarminProduct::Fenix7 => "fenix7",
6490            GarminProduct::Fenix7x => "fenix7x",
6491            GarminProduct::Fenix7sApac => "fenix7s_apac",
6492            GarminProduct::Fenix7Apac => "fenix7_apac",
6493            GarminProduct::Fenix7xApac => "fenix7x_apac",
6494            GarminProduct::ApproachG12 => "approach_g12",
6495            GarminProduct::DescentMk2sAsia => "descent_mk2s_asia",
6496            GarminProduct::ApproachS42 => "approach_s42",
6497            GarminProduct::EpixGen2 => "epix_gen2",
6498            GarminProduct::EpixGen2Apac => "epix_gen2_apac",
6499            GarminProduct::Venu2sAsia => "venu2s_asia",
6500            GarminProduct::Venu2Asia => "venu2_asia",
6501            GarminProduct::Fr945LteAsia => "fr945_lte_asia",
6502            GarminProduct::VivoMoveSport => "vivo_move_sport",
6503            GarminProduct::VivomoveTrend => "vivomove_trend",
6504            GarminProduct::ApproachS12Asia => "approach_S12_asia",
6505            GarminProduct::Fr255Music => "fr255_music",
6506            GarminProduct::Fr255SmallMusic => "fr255_small_music",
6507            GarminProduct::Fr255 => "fr255",
6508            GarminProduct::Fr255Small => "fr255_small",
6509            GarminProduct::ApproachG12Asia => "approach_g12_asia",
6510            GarminProduct::ApproachS42Asia => "approach_s42_asia",
6511            GarminProduct::DescentG1 => "descent_g1",
6512            GarminProduct::Venu2PlusAsia => "venu2_plus_asia",
6513            GarminProduct::Fr955 => "fr955",
6514            GarminProduct::Fr55Asia => "fr55_asia",
6515            GarminProduct::Edge540 => "edge_540",
6516            GarminProduct::Edge840 => "edge_840",
6517            GarminProduct::Vivosmart5 => "vivosmart_5",
6518            GarminProduct::Instinct2Asia => "instinct_2_asia",
6519            GarminProduct::MarqGen2 => "marq_gen2",
6520            GarminProduct::Venusq2 => "venusq2",
6521            GarminProduct::Venusq2music => "venusq2music",
6522            GarminProduct::MarqGen2Aviator => "marq_gen2_aviator",
6523            GarminProduct::D2AirX10 => "d2_air_x10",
6524            GarminProduct::HrmProPlus => "hrm_pro_plus",
6525            GarminProduct::DescentG1Asia => "descent_g1_asia",
6526            GarminProduct::Tactix7 => "tactix7",
6527            GarminProduct::InstinctCrossover => "instinct_crossover",
6528            GarminProduct::EdgeExplore2 => "edge_explore2",
6529            GarminProduct::DescentMk3 => "descent_mk3",
6530            GarminProduct::DescentMk3i => "descent_mk3i",
6531            GarminProduct::ApproachS70 => "approach_s70",
6532            GarminProduct::Fr265Large => "fr265_large",
6533            GarminProduct::Fr265Small => "fr265_small",
6534            GarminProduct::Venu3 => "venu3",
6535            GarminProduct::Venu3s => "venu3s",
6536            GarminProduct::TacxNeoSmart => "tacx_neo_smart",
6537            GarminProduct::TacxNeo2Smart => "tacx_neo2_smart",
6538            GarminProduct::TacxNeo2TSmart => "tacx_neo2_t_smart",
6539            GarminProduct::TacxNeoSmartBike => "tacx_neo_smart_bike",
6540            GarminProduct::TacxSatoriSmart => "tacx_satori_smart",
6541            GarminProduct::TacxFlowSmart => "tacx_flow_smart",
6542            GarminProduct::TacxVortexSmart => "tacx_vortex_smart",
6543            GarminProduct::TacxBushidoSmart => "tacx_bushido_smart",
6544            GarminProduct::TacxGeniusSmart => "tacx_genius_smart",
6545            GarminProduct::TacxFluxFluxSSmart => "tacx_flux_flux_s_smart",
6546            GarminProduct::TacxFlux2Smart => "tacx_flux2_smart",
6547            GarminProduct::TacxMagnum => "tacx_magnum",
6548            GarminProduct::Edge1040Asia => "edge_1040_asia",
6549            GarminProduct::EpixGen2Pro42 => "epix_gen2_pro_42",
6550            GarminProduct::EpixGen2Pro47 => "epix_gen2_pro_47",
6551            GarminProduct::EpixGen2Pro51 => "epix_gen2_pro_51",
6552            GarminProduct::Fr965 => "fr965",
6553            GarminProduct::Enduro2 => "enduro2",
6554            GarminProduct::Fenix7sProSolar => "fenix7s_pro_solar",
6555            GarminProduct::Fenix7ProSolar => "fenix7_pro_solar",
6556            GarminProduct::Fenix7xProSolar => "fenix7x_pro_solar",
6557            GarminProduct::Lily2 => "lily2",
6558            GarminProduct::Instinct2x => "instinct_2x",
6559            GarminProduct::Vivoactive5 => "vivoactive5",
6560            GarminProduct::Fr165 => "fr165",
6561            GarminProduct::Fr165Music => "fr165_music",
6562            GarminProduct::Edge1050 => "edge_1050",
6563            GarminProduct::DescentT2 => "descent_t2",
6564            GarminProduct::HrmFit => "hrm_fit",
6565            GarminProduct::MarqGen2Commander => "marq_gen2_commander",
6566            GarminProduct::LilyAthlete => "lily_athlete",
6567            GarminProduct::RallyX10 => "rally_x10",
6568            GarminProduct::Fenix8Solar => "fenix8_solar",
6569            GarminProduct::Fenix8SolarLarge => "fenix8_solar_large",
6570            GarminProduct::Fenix8Small => "fenix8_small",
6571            GarminProduct::Fenix8 => "fenix8",
6572            GarminProduct::D2Mach1Pro => "d2_mach1_pro",
6573            GarminProduct::Enduro3 => "enduro3",
6574            GarminProduct::InstinctE40mm => "instinctE_40mm",
6575            GarminProduct::InstinctE45mm => "instinctE_45mm",
6576            GarminProduct::Instinct3Solar45mm => "instinct3_solar_45mm",
6577            GarminProduct::Instinct3Amoled45mm => "instinct3_amoled_45mm",
6578            GarminProduct::Instinct3Amoled50mm => "instinct3_amoled_50mm",
6579            GarminProduct::DescentG2 => "descent_g2",
6580            GarminProduct::VenuX1 => "venu_x1",
6581            GarminProduct::Hrm200 => "hrm_200",
6582            GarminProduct::Vivoactive6 => "vivoactive6",
6583            GarminProduct::Fenix8Pro => "fenix8_pro",
6584            GarminProduct::Edge550 => "edge_550",
6585            GarminProduct::Edge850 => "edge_850",
6586            GarminProduct::Venu4 => "venu4",
6587            GarminProduct::Venu4s => "venu4s",
6588            GarminProduct::ApproachS44 => "approachS44",
6589            GarminProduct::EdgeMtb => "edge_mtb",
6590            GarminProduct::ApproachS50 => "approachS50",
6591            GarminProduct::FenixE => "fenix_e",
6592            GarminProduct::Bounce2 => "bounce2",
6593            GarminProduct::Instinct3Solar50mm => "instinct3_solar_50mm",
6594            GarminProduct::Tactix8Amoled => "tactix8_amoled",
6595            GarminProduct::Tactix8Solar => "tactix8_solar",
6596            GarminProduct::ApproachJ1 => "approach_j1",
6597            GarminProduct::D2Mach2 => "d2_mach2",
6598            GarminProduct::InstinctCrossoverAmoled => "instinct_crossover_amoled",
6599            GarminProduct::D2AirX15 => "d2_air_x15",
6600            GarminProduct::Sdm4 => "sdm4",
6601            GarminProduct::EdgeRemote => "edge_remote",
6602            GarminProduct::TacxTrainingAppWin => "tacx_training_app_win",
6603            GarminProduct::TacxTrainingAppMac => "tacx_training_app_mac",
6604            GarminProduct::TacxTrainingAppMacCatalyst => "tacx_training_app_mac_catalyst",
6605            GarminProduct::TrainingCenter => "training_center",
6606            GarminProduct::TacxTrainingAppAndroid => "tacx_training_app_android",
6607            GarminProduct::TacxTrainingAppIos => "tacx_training_app_ios",
6608            GarminProduct::TacxTrainingAppLegacy => "tacx_training_app_legacy",
6609            GarminProduct::ConnectiqSimulator => "connectiq_simulator",
6610            GarminProduct::AndroidAntplusPlugin => "android_antplus_plugin",
6611            GarminProduct::Connect => "connect",
6612        }
6613    }
6614
6615    /// Try to construct from the underlying numeric value.
6616    pub fn from_value(value: u16) -> Option<Self> {
6617        match value {
6618            1 => Some(GarminProduct::Hrm1),
6619            2 => Some(GarminProduct::Axh01),
6620            3 => Some(GarminProduct::Axb01),
6621            4 => Some(GarminProduct::Axb02),
6622            5 => Some(GarminProduct::Hrm2ss),
6623            6 => Some(GarminProduct::DsiAlf02),
6624            7 => Some(GarminProduct::Hrm3ss),
6625            8 => Some(GarminProduct::HrmRunSingleByteProductId),
6626            9 => Some(GarminProduct::Bsm),
6627            10 => Some(GarminProduct::Bcm),
6628            11 => Some(GarminProduct::Axs01),
6629            12 => Some(GarminProduct::HrmTriSingleByteProductId),
6630            13 => Some(GarminProduct::Hrm4RunSingleByteProductId),
6631            14 => Some(GarminProduct::Fr225SingleByteProductId),
6632            15 => Some(GarminProduct::Gen3BsmSingleByteProductId),
6633            16 => Some(GarminProduct::Gen3BcmSingleByteProductId),
6634            22 => Some(GarminProduct::HrmFitSingleByteProductId),
6635            255 => Some(GarminProduct::OHR),
6636            473 => Some(GarminProduct::Fr301China),
6637            474 => Some(GarminProduct::Fr301Japan),
6638            475 => Some(GarminProduct::Fr301Korea),
6639            494 => Some(GarminProduct::Fr301Taiwan),
6640            717 => Some(GarminProduct::Fr405),
6641            782 => Some(GarminProduct::Fr50),
6642            987 => Some(GarminProduct::Fr405Japan),
6643            988 => Some(GarminProduct::Fr60),
6644            1011 => Some(GarminProduct::DsiAlf01),
6645            1018 => Some(GarminProduct::Fr310xt),
6646            1036 => Some(GarminProduct::Edge500),
6647            1124 => Some(GarminProduct::Fr110),
6648            1169 => Some(GarminProduct::Edge800),
6649            1199 => Some(GarminProduct::Edge500Taiwan),
6650            1213 => Some(GarminProduct::Edge500Japan),
6651            1253 => Some(GarminProduct::Chirp),
6652            1274 => Some(GarminProduct::Fr110Japan),
6653            1325 => Some(GarminProduct::Edge200),
6654            1328 => Some(GarminProduct::Fr910xt),
6655            1333 => Some(GarminProduct::Edge800Taiwan),
6656            1334 => Some(GarminProduct::Edge800Japan),
6657            1341 => Some(GarminProduct::Alf04),
6658            1345 => Some(GarminProduct::Fr610),
6659            1360 => Some(GarminProduct::Fr210Japan),
6660            1380 => Some(GarminProduct::VectorSs),
6661            1381 => Some(GarminProduct::VectorCp),
6662            1386 => Some(GarminProduct::Edge800China),
6663            1387 => Some(GarminProduct::Edge500China),
6664            1405 => Some(GarminProduct::ApproachG10),
6665            1410 => Some(GarminProduct::Fr610Japan),
6666            1422 => Some(GarminProduct::Edge500Korea),
6667            1436 => Some(GarminProduct::Fr70),
6668            1446 => Some(GarminProduct::Fr310xt4t),
6669            1461 => Some(GarminProduct::Amx),
6670            1482 => Some(GarminProduct::Fr10),
6671            1497 => Some(GarminProduct::Edge800Korea),
6672            1499 => Some(GarminProduct::Swim),
6673            1537 => Some(GarminProduct::Fr910xtChina),
6674            1551 => Some(GarminProduct::Fenix),
6675            1555 => Some(GarminProduct::Edge200Taiwan),
6676            1561 => Some(GarminProduct::Edge510),
6677            1567 => Some(GarminProduct::Edge810),
6678            1570 => Some(GarminProduct::Tempe),
6679            1600 => Some(GarminProduct::Fr910xtJapan),
6680            1623 => Some(GarminProduct::Fr620),
6681            1632 => Some(GarminProduct::Fr220),
6682            1664 => Some(GarminProduct::Fr910xtKorea),
6683            1688 => Some(GarminProduct::Fr10Japan),
6684            1721 => Some(GarminProduct::Edge810Japan),
6685            1735 => Some(GarminProduct::VirbElite),
6686            1736 => Some(GarminProduct::EdgeTouring),
6687            1742 => Some(GarminProduct::Edge510Japan),
6688            1743 => Some(GarminProduct::HrmTri),
6689            1752 => Some(GarminProduct::HrmRun),
6690            1765 => Some(GarminProduct::Fr920xt),
6691            1821 => Some(GarminProduct::Edge510Asia),
6692            1822 => Some(GarminProduct::Edge810China),
6693            1823 => Some(GarminProduct::Edge810Taiwan),
6694            1836 => Some(GarminProduct::Edge1000),
6695            1837 => Some(GarminProduct::VivoFit),
6696            1853 => Some(GarminProduct::VirbRemote),
6697            1885 => Some(GarminProduct::VivoKi),
6698            1903 => Some(GarminProduct::Fr15),
6699            1907 => Some(GarminProduct::VivoActive),
6700            1918 => Some(GarminProduct::Edge510Korea),
6701            1928 => Some(GarminProduct::Fr620Japan),
6702            1929 => Some(GarminProduct::Fr620China),
6703            1930 => Some(GarminProduct::Fr220Japan),
6704            1931 => Some(GarminProduct::Fr220China),
6705            1936 => Some(GarminProduct::ApproachS6),
6706            1956 => Some(GarminProduct::VivoSmart),
6707            1967 => Some(GarminProduct::Fenix2),
6708            1988 => Some(GarminProduct::Epix),
6709            2050 => Some(GarminProduct::Fenix3),
6710            2052 => Some(GarminProduct::Edge1000Taiwan),
6711            2053 => Some(GarminProduct::Edge1000Japan),
6712            2061 => Some(GarminProduct::Fr15Japan),
6713            2067 => Some(GarminProduct::Edge520),
6714            2070 => Some(GarminProduct::Edge1000China),
6715            2072 => Some(GarminProduct::Fr620Russia),
6716            2073 => Some(GarminProduct::Fr220Russia),
6717            2079 => Some(GarminProduct::VectorS),
6718            2100 => Some(GarminProduct::Edge1000Korea),
6719            2130 => Some(GarminProduct::Fr920xtTaiwan),
6720            2131 => Some(GarminProduct::Fr920xtChina),
6721            2132 => Some(GarminProduct::Fr920xtJapan),
6722            2134 => Some(GarminProduct::Virbx),
6723            2135 => Some(GarminProduct::VivoSmartApac),
6724            2140 => Some(GarminProduct::EtrexTouch),
6725            2147 => Some(GarminProduct::Edge25),
6726            2148 => Some(GarminProduct::Fr25),
6727            2150 => Some(GarminProduct::VivoFit2),
6728            2153 => Some(GarminProduct::Fr225),
6729            2156 => Some(GarminProduct::Fr630),
6730            2157 => Some(GarminProduct::Fr230),
6731            2158 => Some(GarminProduct::Fr735xt),
6732            2160 => Some(GarminProduct::VivoActiveApac),
6733            2161 => Some(GarminProduct::Vector2),
6734            2162 => Some(GarminProduct::Vector2s),
6735            2172 => Some(GarminProduct::Virbxe),
6736            2173 => Some(GarminProduct::Fr620Taiwan),
6737            2174 => Some(GarminProduct::Fr220Taiwan),
6738            2175 => Some(GarminProduct::Truswing),
6739            2187 => Some(GarminProduct::D2airvenu),
6740            2188 => Some(GarminProduct::Fenix3China),
6741            2189 => Some(GarminProduct::Fenix3Twn),
6742            2192 => Some(GarminProduct::VariaHeadlight),
6743            2193 => Some(GarminProduct::VariaTaillightOld),
6744            2204 => Some(GarminProduct::EdgeExplore1000),
6745            2219 => Some(GarminProduct::Fr225Asia),
6746            2225 => Some(GarminProduct::VariaRadarTaillight),
6747            2226 => Some(GarminProduct::VariaRadarDisplay),
6748            2238 => Some(GarminProduct::Edge20),
6749            2260 => Some(GarminProduct::Edge520Asia),
6750            2261 => Some(GarminProduct::Edge520Japan),
6751            2262 => Some(GarminProduct::D2Bravo),
6752            2266 => Some(GarminProduct::ApproachS20),
6753            2271 => Some(GarminProduct::VivoSmart2),
6754            2274 => Some(GarminProduct::Edge1000Thai),
6755            2276 => Some(GarminProduct::VariaRemote),
6756            2288 => Some(GarminProduct::Edge25Asia),
6757            2289 => Some(GarminProduct::Edge25Jpn),
6758            2290 => Some(GarminProduct::Edge20Asia),
6759            2292 => Some(GarminProduct::ApproachX40),
6760            2293 => Some(GarminProduct::Fenix3Japan),
6761            2294 => Some(GarminProduct::VivoSmartEmea),
6762            2310 => Some(GarminProduct::Fr630Asia),
6763            2311 => Some(GarminProduct::Fr630Jpn),
6764            2313 => Some(GarminProduct::Fr230Jpn),
6765            2327 => Some(GarminProduct::Hrm4Run),
6766            2332 => Some(GarminProduct::EpixJapan),
6767            2337 => Some(GarminProduct::VivoActiveHr),
6768            2347 => Some(GarminProduct::VivoSmartGpsHr),
6769            2348 => Some(GarminProduct::VivoSmartHr),
6770            2361 => Some(GarminProduct::VivoSmartHrAsia),
6771            2362 => Some(GarminProduct::VivoSmartGpsHrAsia),
6772            2368 => Some(GarminProduct::VivoMove),
6773            2379 => Some(GarminProduct::VariaTaillight),
6774            2396 => Some(GarminProduct::Fr235Asia),
6775            2397 => Some(GarminProduct::Fr235Japan),
6776            2398 => Some(GarminProduct::VariaVision),
6777            2406 => Some(GarminProduct::VivoFit3),
6778            2407 => Some(GarminProduct::Fenix3Korea),
6779            2408 => Some(GarminProduct::Fenix3Sea),
6780            2413 => Some(GarminProduct::Fenix3Hr),
6781            2417 => Some(GarminProduct::VirbUltra30),
6782            2429 => Some(GarminProduct::IndexSmartScale),
6783            2431 => Some(GarminProduct::Fr235),
6784            2432 => Some(GarminProduct::Fenix3Chronos),
6785            2441 => Some(GarminProduct::Oregon7xx),
6786            2444 => Some(GarminProduct::Rino7xx),
6787            2457 => Some(GarminProduct::EpixKorea),
6788            2473 => Some(GarminProduct::Fenix3HrChn),
6789            2474 => Some(GarminProduct::Fenix3HrTwn),
6790            2475 => Some(GarminProduct::Fenix3HrJpn),
6791            2476 => Some(GarminProduct::Fenix3HrSea),
6792            2477 => Some(GarminProduct::Fenix3HrKor),
6793            2496 => Some(GarminProduct::Nautix),
6794            2497 => Some(GarminProduct::VivoActiveHrApac),
6795            2503 => Some(GarminProduct::Fr35),
6796            2512 => Some(GarminProduct::Oregon7xxWw),
6797            2530 => Some(GarminProduct::Edge820),
6798            2531 => Some(GarminProduct::EdgeExplore820),
6799            2533 => Some(GarminProduct::Fr735xtApac),
6800            2534 => Some(GarminProduct::Fr735xtJapan),
6801            2544 => Some(GarminProduct::Fenix5s),
6802            2547 => Some(GarminProduct::D2BravoTitanium),
6803            2567 => Some(GarminProduct::VariaUt800),
6804            2593 => Some(GarminProduct::RunningDynamicsPod),
6805            2599 => Some(GarminProduct::Edge820China),
6806            2600 => Some(GarminProduct::Edge820Japan),
6807            2604 => Some(GarminProduct::Fenix5x),
6808            2606 => Some(GarminProduct::VivoFitJr),
6809            2622 => Some(GarminProduct::VivoSmart3),
6810            2623 => Some(GarminProduct::VivoSport),
6811            2628 => Some(GarminProduct::Edge820Taiwan),
6812            2629 => Some(GarminProduct::Edge820Korea),
6813            2630 => Some(GarminProduct::Edge820Sea),
6814            2650 => Some(GarminProduct::Fr35Hebrew),
6815            2656 => Some(GarminProduct::ApproachS60),
6816            2667 => Some(GarminProduct::Fr35Apac),
6817            2668 => Some(GarminProduct::Fr35Japan),
6818            2675 => Some(GarminProduct::Fenix3ChronosAsia),
6819            2687 => Some(GarminProduct::Virb360),
6820            2691 => Some(GarminProduct::Fr935),
6821            2697 => Some(GarminProduct::Fenix5),
6822            2700 => Some(GarminProduct::Vivoactive3),
6823            2733 => Some(GarminProduct::Fr235ChinaNfc),
6824            2769 => Some(GarminProduct::Foretrex601701),
6825            2772 => Some(GarminProduct::VivoMoveHr),
6826            2713 => Some(GarminProduct::Edge1030),
6827            2727 => Some(GarminProduct::Fr35Sea),
6828            2787 => Some(GarminProduct::Vector3),
6829            2796 => Some(GarminProduct::Fenix5Asia),
6830            2797 => Some(GarminProduct::Fenix5sAsia),
6831            2798 => Some(GarminProduct::Fenix5xAsia),
6832            2806 => Some(GarminProduct::ApproachZ80),
6833            2814 => Some(GarminProduct::Fr35Korea),
6834            2819 => Some(GarminProduct::D2charlie),
6835            2831 => Some(GarminProduct::VivoSmart3Apac),
6836            2832 => Some(GarminProduct::VivoSportApac),
6837            2833 => Some(GarminProduct::Fr935Asia),
6838            2859 => Some(GarminProduct::Descent),
6839            2878 => Some(GarminProduct::VivoFit4),
6840            2886 => Some(GarminProduct::Fr645),
6841            2888 => Some(GarminProduct::Fr645m),
6842            2891 => Some(GarminProduct::Fr30),
6843            2900 => Some(GarminProduct::Fenix5sPlus),
6844            2909 => Some(GarminProduct::Edge130),
6845            2924 => Some(GarminProduct::Edge1030Asia),
6846            2927 => Some(GarminProduct::Vivosmart4),
6847            2945 => Some(GarminProduct::VivoMoveHrAsia),
6848            2962 => Some(GarminProduct::ApproachX10),
6849            2977 => Some(GarminProduct::Fr30Asia),
6850            2988 => Some(GarminProduct::Vivoactive3mW),
6851            3003 => Some(GarminProduct::Fr645Asia),
6852            3004 => Some(GarminProduct::Fr645mAsia),
6853            3011 => Some(GarminProduct::EdgeExplore),
6854            3028 => Some(GarminProduct::Gpsmap66),
6855            3049 => Some(GarminProduct::ApproachS10),
6856            3066 => Some(GarminProduct::Vivoactive3mL),
6857            3076 => Some(GarminProduct::Fr245),
6858            3077 => Some(GarminProduct::Fr245Music),
6859            3085 => Some(GarminProduct::ApproachG80),
6860            3092 => Some(GarminProduct::Edge130Asia),
6861            3095 => Some(GarminProduct::Edge1030Bontrager),
6862            3110 => Some(GarminProduct::Fenix5Plus),
6863            3111 => Some(GarminProduct::Fenix5xPlus),
6864            3112 => Some(GarminProduct::Edge520Plus),
6865            3113 => Some(GarminProduct::Fr945),
6866            3121 => Some(GarminProduct::Edge530),
6867            3122 => Some(GarminProduct::Edge830),
6868            3126 => Some(GarminProduct::InstinctEsports),
6869            3134 => Some(GarminProduct::Fenix5sPlusApac),
6870            3135 => Some(GarminProduct::Fenix5xPlusApac),
6871            3142 => Some(GarminProduct::Edge520PlusApac),
6872            3143 => Some(GarminProduct::DescentT1),
6873            3144 => Some(GarminProduct::Fr235lAsia),
6874            3145 => Some(GarminProduct::Fr245Asia),
6875            3163 => Some(GarminProduct::VivoActive3mApac),
6876            3192 => Some(GarminProduct::Gen3Bsm),
6877            3193 => Some(GarminProduct::Gen3Bcm),
6878            3218 => Some(GarminProduct::VivoSmart4Asia),
6879            3224 => Some(GarminProduct::Vivoactive4Small),
6880            3225 => Some(GarminProduct::Vivoactive4Large),
6881            3226 => Some(GarminProduct::Venu),
6882            3246 => Some(GarminProduct::MarqDriver),
6883            3247 => Some(GarminProduct::MarqAviator),
6884            3248 => Some(GarminProduct::MarqCaptain),
6885            3249 => Some(GarminProduct::MarqCommander),
6886            3250 => Some(GarminProduct::MarqExpedition),
6887            3251 => Some(GarminProduct::MarqAthlete),
6888            3258 => Some(GarminProduct::DescentMk2),
6889            3282 => Some(GarminProduct::Fr45),
6890            3284 => Some(GarminProduct::Gpsmap66i),
6891            3287 => Some(GarminProduct::Fenix6SSport),
6892            3288 => Some(GarminProduct::Fenix6S),
6893            3289 => Some(GarminProduct::Fenix6Sport),
6894            3290 => Some(GarminProduct::Fenix6),
6895            3291 => Some(GarminProduct::Fenix6x),
6896            3299 => Some(GarminProduct::HrmDual),
6897            3300 => Some(GarminProduct::HrmPro),
6898            3308 => Some(GarminProduct::VivoMove3Premium),
6899            3314 => Some(GarminProduct::ApproachS40),
6900            3321 => Some(GarminProduct::Fr245mAsia),
6901            3349 => Some(GarminProduct::Edge530Apac),
6902            3350 => Some(GarminProduct::Edge830Apac),
6903            3378 => Some(GarminProduct::VivoMove3),
6904            3387 => Some(GarminProduct::VivoActive4SmallAsia),
6905            3388 => Some(GarminProduct::VivoActive4LargeAsia),
6906            3389 => Some(GarminProduct::VivoActive4OledAsia),
6907            3405 => Some(GarminProduct::Swim2),
6908            3420 => Some(GarminProduct::MarqDriverAsia),
6909            3421 => Some(GarminProduct::MarqAviatorAsia),
6910            3422 => Some(GarminProduct::VivoMove3Asia),
6911            3441 => Some(GarminProduct::Fr945Asia),
6912            3446 => Some(GarminProduct::VivoActive3tChn),
6913            3448 => Some(GarminProduct::MarqCaptainAsia),
6914            3449 => Some(GarminProduct::MarqCommanderAsia),
6915            3450 => Some(GarminProduct::MarqExpeditionAsia),
6916            3451 => Some(GarminProduct::MarqAthleteAsia),
6917            3461 => Some(GarminProduct::IndexSmartScale2),
6918            3466 => Some(GarminProduct::InstinctSolar),
6919            3469 => Some(GarminProduct::Fr45Asia),
6920            3473 => Some(GarminProduct::Vivoactive3Daimler),
6921            3498 => Some(GarminProduct::LegacyRey),
6922            3499 => Some(GarminProduct::LegacyDarthVader),
6923            3500 => Some(GarminProduct::LegacyCaptainMarvel),
6924            3501 => Some(GarminProduct::LegacyFirstAvenger),
6925            3512 => Some(GarminProduct::Fenix6sSportAsia),
6926            3513 => Some(GarminProduct::Fenix6sAsia),
6927            3514 => Some(GarminProduct::Fenix6SportAsia),
6928            3515 => Some(GarminProduct::Fenix6Asia),
6929            3516 => Some(GarminProduct::Fenix6xAsia),
6930            3535 => Some(GarminProduct::LegacyCaptainMarvelAsia),
6931            3536 => Some(GarminProduct::LegacyFirstAvengerAsia),
6932            3537 => Some(GarminProduct::LegacyReyAsia),
6933            3538 => Some(GarminProduct::LegacyDarthVaderAsia),
6934            3542 => Some(GarminProduct::DescentMk2s),
6935            3558 => Some(GarminProduct::Edge130Plus),
6936            3570 => Some(GarminProduct::Edge1030Plus),
6937            3578 => Some(GarminProduct::Rally200),
6938            3589 => Some(GarminProduct::Fr745),
6939            3596 => Some(GarminProduct::VenusqMusic),
6940            3599 => Some(GarminProduct::VenusqMusicV2),
6941            3600 => Some(GarminProduct::Venusq),
6942            3615 => Some(GarminProduct::Lily),
6943            3624 => Some(GarminProduct::MarqAdventurer),
6944            3638 => Some(GarminProduct::Enduro),
6945            3639 => Some(GarminProduct::Swim2Apac),
6946            3648 => Some(GarminProduct::MarqAdventurerAsia),
6947            3652 => Some(GarminProduct::Fr945Lte),
6948            3702 => Some(GarminProduct::DescentMk2Asia),
6949            3703 => Some(GarminProduct::Venu2),
6950            3704 => Some(GarminProduct::Venu2s),
6951            3737 => Some(GarminProduct::VenuDaimlerAsia),
6952            3739 => Some(GarminProduct::MarqGolfer),
6953            3740 => Some(GarminProduct::VenuDaimler),
6954            3794 => Some(GarminProduct::Fr745Asia),
6955            3808 => Some(GarminProduct::VariaRct715),
6956            3809 => Some(GarminProduct::LilyAsia),
6957            3812 => Some(GarminProduct::Edge1030PlusAsia),
6958            3813 => Some(GarminProduct::Edge130PlusAsia),
6959            3823 => Some(GarminProduct::ApproachS12),
6960            3872 => Some(GarminProduct::EnduroAsia),
6961            3837 => Some(GarminProduct::VenusqAsia),
6962            3843 => Some(GarminProduct::Edge1040),
6963            3850 => Some(GarminProduct::MarqGolferAsia),
6964            3851 => Some(GarminProduct::Venu2Plus),
6965            3865 => Some(GarminProduct::Gnss),
6966            3869 => Some(GarminProduct::Fr55),
6967            3888 => Some(GarminProduct::Instinct2),
6968            3889 => Some(GarminProduct::Instinct2s),
6969            3905 => Some(GarminProduct::Fenix7s),
6970            3906 => Some(GarminProduct::Fenix7),
6971            3907 => Some(GarminProduct::Fenix7x),
6972            3908 => Some(GarminProduct::Fenix7sApac),
6973            3909 => Some(GarminProduct::Fenix7Apac),
6974            3910 => Some(GarminProduct::Fenix7xApac),
6975            3927 => Some(GarminProduct::ApproachG12),
6976            3930 => Some(GarminProduct::DescentMk2sAsia),
6977            3934 => Some(GarminProduct::ApproachS42),
6978            3943 => Some(GarminProduct::EpixGen2),
6979            3944 => Some(GarminProduct::EpixGen2Apac),
6980            3949 => Some(GarminProduct::Venu2sAsia),
6981            3950 => Some(GarminProduct::Venu2Asia),
6982            3978 => Some(GarminProduct::Fr945LteAsia),
6983            3982 => Some(GarminProduct::VivoMoveSport),
6984            3983 => Some(GarminProduct::VivomoveTrend),
6985            3986 => Some(GarminProduct::ApproachS12Asia),
6986            3990 => Some(GarminProduct::Fr255Music),
6987            3991 => Some(GarminProduct::Fr255SmallMusic),
6988            3992 => Some(GarminProduct::Fr255),
6989            3993 => Some(GarminProduct::Fr255Small),
6990            4001 => Some(GarminProduct::ApproachG12Asia),
6991            4002 => Some(GarminProduct::ApproachS42Asia),
6992            4005 => Some(GarminProduct::DescentG1),
6993            4017 => Some(GarminProduct::Venu2PlusAsia),
6994            4024 => Some(GarminProduct::Fr955),
6995            4033 => Some(GarminProduct::Fr55Asia),
6996            4061 => Some(GarminProduct::Edge540),
6997            4062 => Some(GarminProduct::Edge840),
6998            4063 => Some(GarminProduct::Vivosmart5),
6999            4071 => Some(GarminProduct::Instinct2Asia),
7000            4105 => Some(GarminProduct::MarqGen2),
7001            4115 => Some(GarminProduct::Venusq2),
7002            4116 => Some(GarminProduct::Venusq2music),
7003            4124 => Some(GarminProduct::MarqGen2Aviator),
7004            4125 => Some(GarminProduct::D2AirX10),
7005            4130 => Some(GarminProduct::HrmProPlus),
7006            4132 => Some(GarminProduct::DescentG1Asia),
7007            4135 => Some(GarminProduct::Tactix7),
7008            4155 => Some(GarminProduct::InstinctCrossover),
7009            4169 => Some(GarminProduct::EdgeExplore2),
7010            4222 => Some(GarminProduct::DescentMk3),
7011            4223 => Some(GarminProduct::DescentMk3i),
7012            4233 => Some(GarminProduct::ApproachS70),
7013            4257 => Some(GarminProduct::Fr265Large),
7014            4258 => Some(GarminProduct::Fr265Small),
7015            4260 => Some(GarminProduct::Venu3),
7016            4261 => Some(GarminProduct::Venu3s),
7017            4265 => Some(GarminProduct::TacxNeoSmart),
7018            4266 => Some(GarminProduct::TacxNeo2Smart),
7019            4267 => Some(GarminProduct::TacxNeo2TSmart),
7020            4268 => Some(GarminProduct::TacxNeoSmartBike),
7021            4269 => Some(GarminProduct::TacxSatoriSmart),
7022            4270 => Some(GarminProduct::TacxFlowSmart),
7023            4271 => Some(GarminProduct::TacxVortexSmart),
7024            4272 => Some(GarminProduct::TacxBushidoSmart),
7025            4273 => Some(GarminProduct::TacxGeniusSmart),
7026            4274 => Some(GarminProduct::TacxFluxFluxSSmart),
7027            4275 => Some(GarminProduct::TacxFlux2Smart),
7028            4276 => Some(GarminProduct::TacxMagnum),
7029            4305 => Some(GarminProduct::Edge1040Asia),
7030            4312 => Some(GarminProduct::EpixGen2Pro42),
7031            4313 => Some(GarminProduct::EpixGen2Pro47),
7032            4314 => Some(GarminProduct::EpixGen2Pro51),
7033            4315 => Some(GarminProduct::Fr965),
7034            4341 => Some(GarminProduct::Enduro2),
7035            4374 => Some(GarminProduct::Fenix7sProSolar),
7036            4375 => Some(GarminProduct::Fenix7ProSolar),
7037            4376 => Some(GarminProduct::Fenix7xProSolar),
7038            4380 => Some(GarminProduct::Lily2),
7039            4394 => Some(GarminProduct::Instinct2x),
7040            4426 => Some(GarminProduct::Vivoactive5),
7041            4432 => Some(GarminProduct::Fr165),
7042            4433 => Some(GarminProduct::Fr165Music),
7043            4440 => Some(GarminProduct::Edge1050),
7044            4442 => Some(GarminProduct::DescentT2),
7045            4446 => Some(GarminProduct::HrmFit),
7046            4472 => Some(GarminProduct::MarqGen2Commander),
7047            4477 => Some(GarminProduct::LilyAthlete),
7048            4525 => Some(GarminProduct::RallyX10),
7049            4532 => Some(GarminProduct::Fenix8Solar),
7050            4533 => Some(GarminProduct::Fenix8SolarLarge),
7051            4534 => Some(GarminProduct::Fenix8Small),
7052            4536 => Some(GarminProduct::Fenix8),
7053            4556 => Some(GarminProduct::D2Mach1Pro),
7054            4575 => Some(GarminProduct::Enduro3),
7055            4583 => Some(GarminProduct::InstinctE40mm),
7056            4584 => Some(GarminProduct::InstinctE45mm),
7057            4585 => Some(GarminProduct::Instinct3Solar45mm),
7058            4586 => Some(GarminProduct::Instinct3Amoled45mm),
7059            4587 => Some(GarminProduct::Instinct3Amoled50mm),
7060            4588 => Some(GarminProduct::DescentG2),
7061            4603 => Some(GarminProduct::VenuX1),
7062            4606 => Some(GarminProduct::Hrm200),
7063            4625 => Some(GarminProduct::Vivoactive6),
7064            4631 => Some(GarminProduct::Fenix8Pro),
7065            4633 => Some(GarminProduct::Edge550),
7066            4634 => Some(GarminProduct::Edge850),
7067            4643 => Some(GarminProduct::Venu4),
7068            4644 => Some(GarminProduct::Venu4s),
7069            4647 => Some(GarminProduct::ApproachS44),
7070            4655 => Some(GarminProduct::EdgeMtb),
7071            4656 => Some(GarminProduct::ApproachS50),
7072            4666 => Some(GarminProduct::FenixE),
7073            4745 => Some(GarminProduct::Bounce2),
7074            4759 => Some(GarminProduct::Instinct3Solar50mm),
7075            4775 => Some(GarminProduct::Tactix8Amoled),
7076            4776 => Some(GarminProduct::Tactix8Solar),
7077            4825 => Some(GarminProduct::ApproachJ1),
7078            4879 => Some(GarminProduct::D2Mach2),
7079            4678 => Some(GarminProduct::InstinctCrossoverAmoled),
7080            4944 => Some(GarminProduct::D2AirX15),
7081            10007 => Some(GarminProduct::Sdm4),
7082            10014 => Some(GarminProduct::EdgeRemote),
7083            20533 => Some(GarminProduct::TacxTrainingAppWin),
7084            20534 => Some(GarminProduct::TacxTrainingAppMac),
7085            20565 => Some(GarminProduct::TacxTrainingAppMacCatalyst),
7086            20119 => Some(GarminProduct::TrainingCenter),
7087            30045 => Some(GarminProduct::TacxTrainingAppAndroid),
7088            30046 => Some(GarminProduct::TacxTrainingAppIos),
7089            30047 => Some(GarminProduct::TacxTrainingAppLegacy),
7090            65531 => Some(GarminProduct::ConnectiqSimulator),
7091            65532 => Some(GarminProduct::AndroidAntplusPlugin),
7092            65534 => Some(GarminProduct::Connect),
7093            _ => None,
7094        }
7095    }
7096
7097    /// Try to construct from the snake-case canonical name.
7098    pub fn from_str(name: &str) -> Option<Self> {
7099        match name {
7100            "hrm1" => Some(GarminProduct::Hrm1),
7101            "axh01" => Some(GarminProduct::Axh01),
7102            "axb01" => Some(GarminProduct::Axb01),
7103            "axb02" => Some(GarminProduct::Axb02),
7104            "hrm2ss" => Some(GarminProduct::Hrm2ss),
7105            "dsi_alf02" => Some(GarminProduct::DsiAlf02),
7106            "hrm3ss" => Some(GarminProduct::Hrm3ss),
7107            "hrm_run_single_byte_product_id" => Some(GarminProduct::HrmRunSingleByteProductId),
7108            "bsm" => Some(GarminProduct::Bsm),
7109            "bcm" => Some(GarminProduct::Bcm),
7110            "axs01" => Some(GarminProduct::Axs01),
7111            "hrm_tri_single_byte_product_id" => Some(GarminProduct::HrmTriSingleByteProductId),
7112            "hrm4_run_single_byte_product_id" => Some(GarminProduct::Hrm4RunSingleByteProductId),
7113            "fr225_single_byte_product_id" => Some(GarminProduct::Fr225SingleByteProductId),
7114            "gen3_bsm_single_byte_product_id" => Some(GarminProduct::Gen3BsmSingleByteProductId),
7115            "gen3_bcm_single_byte_product_id" => Some(GarminProduct::Gen3BcmSingleByteProductId),
7116            "hrm_fit_single_byte_product_id" => Some(GarminProduct::HrmFitSingleByteProductId),
7117            "OHR" => Some(GarminProduct::OHR),
7118            "fr301_china" => Some(GarminProduct::Fr301China),
7119            "fr301_japan" => Some(GarminProduct::Fr301Japan),
7120            "fr301_korea" => Some(GarminProduct::Fr301Korea),
7121            "fr301_taiwan" => Some(GarminProduct::Fr301Taiwan),
7122            "fr405" => Some(GarminProduct::Fr405),
7123            "fr50" => Some(GarminProduct::Fr50),
7124            "fr405_japan" => Some(GarminProduct::Fr405Japan),
7125            "fr60" => Some(GarminProduct::Fr60),
7126            "dsi_alf01" => Some(GarminProduct::DsiAlf01),
7127            "fr310xt" => Some(GarminProduct::Fr310xt),
7128            "edge500" => Some(GarminProduct::Edge500),
7129            "fr110" => Some(GarminProduct::Fr110),
7130            "edge800" => Some(GarminProduct::Edge800),
7131            "edge500_taiwan" => Some(GarminProduct::Edge500Taiwan),
7132            "edge500_japan" => Some(GarminProduct::Edge500Japan),
7133            "chirp" => Some(GarminProduct::Chirp),
7134            "fr110_japan" => Some(GarminProduct::Fr110Japan),
7135            "edge200" => Some(GarminProduct::Edge200),
7136            "fr910xt" => Some(GarminProduct::Fr910xt),
7137            "edge800_taiwan" => Some(GarminProduct::Edge800Taiwan),
7138            "edge800_japan" => Some(GarminProduct::Edge800Japan),
7139            "alf04" => Some(GarminProduct::Alf04),
7140            "fr610" => Some(GarminProduct::Fr610),
7141            "fr210_japan" => Some(GarminProduct::Fr210Japan),
7142            "vector_ss" => Some(GarminProduct::VectorSs),
7143            "vector_cp" => Some(GarminProduct::VectorCp),
7144            "edge800_china" => Some(GarminProduct::Edge800China),
7145            "edge500_china" => Some(GarminProduct::Edge500China),
7146            "approach_g10" => Some(GarminProduct::ApproachG10),
7147            "fr610_japan" => Some(GarminProduct::Fr610Japan),
7148            "edge500_korea" => Some(GarminProduct::Edge500Korea),
7149            "fr70" => Some(GarminProduct::Fr70),
7150            "fr310xt_4t" => Some(GarminProduct::Fr310xt4t),
7151            "amx" => Some(GarminProduct::Amx),
7152            "fr10" => Some(GarminProduct::Fr10),
7153            "edge800_korea" => Some(GarminProduct::Edge800Korea),
7154            "swim" => Some(GarminProduct::Swim),
7155            "fr910xt_china" => Some(GarminProduct::Fr910xtChina),
7156            "fenix" => Some(GarminProduct::Fenix),
7157            "edge200_taiwan" => Some(GarminProduct::Edge200Taiwan),
7158            "edge510" => Some(GarminProduct::Edge510),
7159            "edge810" => Some(GarminProduct::Edge810),
7160            "tempe" => Some(GarminProduct::Tempe),
7161            "fr910xt_japan" => Some(GarminProduct::Fr910xtJapan),
7162            "fr620" => Some(GarminProduct::Fr620),
7163            "fr220" => Some(GarminProduct::Fr220),
7164            "fr910xt_korea" => Some(GarminProduct::Fr910xtKorea),
7165            "fr10_japan" => Some(GarminProduct::Fr10Japan),
7166            "edge810_japan" => Some(GarminProduct::Edge810Japan),
7167            "virb_elite" => Some(GarminProduct::VirbElite),
7168            "edge_touring" => Some(GarminProduct::EdgeTouring),
7169            "edge510_japan" => Some(GarminProduct::Edge510Japan),
7170            "hrm_tri" => Some(GarminProduct::HrmTri),
7171            "hrm_run" => Some(GarminProduct::HrmRun),
7172            "fr920xt" => Some(GarminProduct::Fr920xt),
7173            "edge510_asia" => Some(GarminProduct::Edge510Asia),
7174            "edge810_china" => Some(GarminProduct::Edge810China),
7175            "edge810_taiwan" => Some(GarminProduct::Edge810Taiwan),
7176            "edge1000" => Some(GarminProduct::Edge1000),
7177            "vivo_fit" => Some(GarminProduct::VivoFit),
7178            "virb_remote" => Some(GarminProduct::VirbRemote),
7179            "vivo_ki" => Some(GarminProduct::VivoKi),
7180            "fr15" => Some(GarminProduct::Fr15),
7181            "vivo_active" => Some(GarminProduct::VivoActive),
7182            "edge510_korea" => Some(GarminProduct::Edge510Korea),
7183            "fr620_japan" => Some(GarminProduct::Fr620Japan),
7184            "fr620_china" => Some(GarminProduct::Fr620China),
7185            "fr220_japan" => Some(GarminProduct::Fr220Japan),
7186            "fr220_china" => Some(GarminProduct::Fr220China),
7187            "approach_s6" => Some(GarminProduct::ApproachS6),
7188            "vivo_smart" => Some(GarminProduct::VivoSmart),
7189            "fenix2" => Some(GarminProduct::Fenix2),
7190            "epix" => Some(GarminProduct::Epix),
7191            "fenix3" => Some(GarminProduct::Fenix3),
7192            "edge1000_taiwan" => Some(GarminProduct::Edge1000Taiwan),
7193            "edge1000_japan" => Some(GarminProduct::Edge1000Japan),
7194            "fr15_japan" => Some(GarminProduct::Fr15Japan),
7195            "edge520" => Some(GarminProduct::Edge520),
7196            "edge1000_china" => Some(GarminProduct::Edge1000China),
7197            "fr620_russia" => Some(GarminProduct::Fr620Russia),
7198            "fr220_russia" => Some(GarminProduct::Fr220Russia),
7199            "vector_s" => Some(GarminProduct::VectorS),
7200            "edge1000_korea" => Some(GarminProduct::Edge1000Korea),
7201            "fr920xt_taiwan" => Some(GarminProduct::Fr920xtTaiwan),
7202            "fr920xt_china" => Some(GarminProduct::Fr920xtChina),
7203            "fr920xt_japan" => Some(GarminProduct::Fr920xtJapan),
7204            "virbx" => Some(GarminProduct::Virbx),
7205            "vivo_smart_apac" => Some(GarminProduct::VivoSmartApac),
7206            "etrex_touch" => Some(GarminProduct::EtrexTouch),
7207            "edge25" => Some(GarminProduct::Edge25),
7208            "fr25" => Some(GarminProduct::Fr25),
7209            "vivo_fit2" => Some(GarminProduct::VivoFit2),
7210            "fr225" => Some(GarminProduct::Fr225),
7211            "fr630" => Some(GarminProduct::Fr630),
7212            "fr230" => Some(GarminProduct::Fr230),
7213            "fr735xt" => Some(GarminProduct::Fr735xt),
7214            "vivo_active_apac" => Some(GarminProduct::VivoActiveApac),
7215            "vector_2" => Some(GarminProduct::Vector2),
7216            "vector_2s" => Some(GarminProduct::Vector2s),
7217            "virbxe" => Some(GarminProduct::Virbxe),
7218            "fr620_taiwan" => Some(GarminProduct::Fr620Taiwan),
7219            "fr220_taiwan" => Some(GarminProduct::Fr220Taiwan),
7220            "truswing" => Some(GarminProduct::Truswing),
7221            "d2airvenu" => Some(GarminProduct::D2airvenu),
7222            "fenix3_china" => Some(GarminProduct::Fenix3China),
7223            "fenix3_twn" => Some(GarminProduct::Fenix3Twn),
7224            "varia_headlight" => Some(GarminProduct::VariaHeadlight),
7225            "varia_taillight_old" => Some(GarminProduct::VariaTaillightOld),
7226            "edge_explore_1000" => Some(GarminProduct::EdgeExplore1000),
7227            "fr225_asia" => Some(GarminProduct::Fr225Asia),
7228            "varia_radar_taillight" => Some(GarminProduct::VariaRadarTaillight),
7229            "varia_radar_display" => Some(GarminProduct::VariaRadarDisplay),
7230            "edge20" => Some(GarminProduct::Edge20),
7231            "edge520_asia" => Some(GarminProduct::Edge520Asia),
7232            "edge520_japan" => Some(GarminProduct::Edge520Japan),
7233            "d2_bravo" => Some(GarminProduct::D2Bravo),
7234            "approach_s20" => Some(GarminProduct::ApproachS20),
7235            "vivo_smart2" => Some(GarminProduct::VivoSmart2),
7236            "edge1000_thai" => Some(GarminProduct::Edge1000Thai),
7237            "varia_remote" => Some(GarminProduct::VariaRemote),
7238            "edge25_asia" => Some(GarminProduct::Edge25Asia),
7239            "edge25_jpn" => Some(GarminProduct::Edge25Jpn),
7240            "edge20_asia" => Some(GarminProduct::Edge20Asia),
7241            "approach_x40" => Some(GarminProduct::ApproachX40),
7242            "fenix3_japan" => Some(GarminProduct::Fenix3Japan),
7243            "vivo_smart_emea" => Some(GarminProduct::VivoSmartEmea),
7244            "fr630_asia" => Some(GarminProduct::Fr630Asia),
7245            "fr630_jpn" => Some(GarminProduct::Fr630Jpn),
7246            "fr230_jpn" => Some(GarminProduct::Fr230Jpn),
7247            "hrm4_run" => Some(GarminProduct::Hrm4Run),
7248            "epix_japan" => Some(GarminProduct::EpixJapan),
7249            "vivo_active_hr" => Some(GarminProduct::VivoActiveHr),
7250            "vivo_smart_gps_hr" => Some(GarminProduct::VivoSmartGpsHr),
7251            "vivo_smart_hr" => Some(GarminProduct::VivoSmartHr),
7252            "vivo_smart_hr_asia" => Some(GarminProduct::VivoSmartHrAsia),
7253            "vivo_smart_gps_hr_asia" => Some(GarminProduct::VivoSmartGpsHrAsia),
7254            "vivo_move" => Some(GarminProduct::VivoMove),
7255            "varia_taillight" => Some(GarminProduct::VariaTaillight),
7256            "fr235_asia" => Some(GarminProduct::Fr235Asia),
7257            "fr235_japan" => Some(GarminProduct::Fr235Japan),
7258            "varia_vision" => Some(GarminProduct::VariaVision),
7259            "vivo_fit3" => Some(GarminProduct::VivoFit3),
7260            "fenix3_korea" => Some(GarminProduct::Fenix3Korea),
7261            "fenix3_sea" => Some(GarminProduct::Fenix3Sea),
7262            "fenix3_hr" => Some(GarminProduct::Fenix3Hr),
7263            "virb_ultra_30" => Some(GarminProduct::VirbUltra30),
7264            "index_smart_scale" => Some(GarminProduct::IndexSmartScale),
7265            "fr235" => Some(GarminProduct::Fr235),
7266            "fenix3_chronos" => Some(GarminProduct::Fenix3Chronos),
7267            "oregon7xx" => Some(GarminProduct::Oregon7xx),
7268            "rino7xx" => Some(GarminProduct::Rino7xx),
7269            "epix_korea" => Some(GarminProduct::EpixKorea),
7270            "fenix3_hr_chn" => Some(GarminProduct::Fenix3HrChn),
7271            "fenix3_hr_twn" => Some(GarminProduct::Fenix3HrTwn),
7272            "fenix3_hr_jpn" => Some(GarminProduct::Fenix3HrJpn),
7273            "fenix3_hr_sea" => Some(GarminProduct::Fenix3HrSea),
7274            "fenix3_hr_kor" => Some(GarminProduct::Fenix3HrKor),
7275            "nautix" => Some(GarminProduct::Nautix),
7276            "vivo_active_hr_apac" => Some(GarminProduct::VivoActiveHrApac),
7277            "fr35" => Some(GarminProduct::Fr35),
7278            "oregon7xx_ww" => Some(GarminProduct::Oregon7xxWw),
7279            "edge_820" => Some(GarminProduct::Edge820),
7280            "edge_explore_820" => Some(GarminProduct::EdgeExplore820),
7281            "fr735xt_apac" => Some(GarminProduct::Fr735xtApac),
7282            "fr735xt_japan" => Some(GarminProduct::Fr735xtJapan),
7283            "fenix5s" => Some(GarminProduct::Fenix5s),
7284            "d2_bravo_titanium" => Some(GarminProduct::D2BravoTitanium),
7285            "varia_ut800" => Some(GarminProduct::VariaUt800),
7286            "running_dynamics_pod" => Some(GarminProduct::RunningDynamicsPod),
7287            "edge_820_china" => Some(GarminProduct::Edge820China),
7288            "edge_820_japan" => Some(GarminProduct::Edge820Japan),
7289            "fenix5x" => Some(GarminProduct::Fenix5x),
7290            "vivo_fit_jr" => Some(GarminProduct::VivoFitJr),
7291            "vivo_smart3" => Some(GarminProduct::VivoSmart3),
7292            "vivo_sport" => Some(GarminProduct::VivoSport),
7293            "edge_820_taiwan" => Some(GarminProduct::Edge820Taiwan),
7294            "edge_820_korea" => Some(GarminProduct::Edge820Korea),
7295            "edge_820_sea" => Some(GarminProduct::Edge820Sea),
7296            "fr35_hebrew" => Some(GarminProduct::Fr35Hebrew),
7297            "approach_s60" => Some(GarminProduct::ApproachS60),
7298            "fr35_apac" => Some(GarminProduct::Fr35Apac),
7299            "fr35_japan" => Some(GarminProduct::Fr35Japan),
7300            "fenix3_chronos_asia" => Some(GarminProduct::Fenix3ChronosAsia),
7301            "virb_360" => Some(GarminProduct::Virb360),
7302            "fr935" => Some(GarminProduct::Fr935),
7303            "fenix5" => Some(GarminProduct::Fenix5),
7304            "vivoactive3" => Some(GarminProduct::Vivoactive3),
7305            "fr235_china_nfc" => Some(GarminProduct::Fr235ChinaNfc),
7306            "foretrex_601_701" => Some(GarminProduct::Foretrex601701),
7307            "vivo_move_hr" => Some(GarminProduct::VivoMoveHr),
7308            "edge_1030" => Some(GarminProduct::Edge1030),
7309            "fr35_sea" => Some(GarminProduct::Fr35Sea),
7310            "vector_3" => Some(GarminProduct::Vector3),
7311            "fenix5_asia" => Some(GarminProduct::Fenix5Asia),
7312            "fenix5s_asia" => Some(GarminProduct::Fenix5sAsia),
7313            "fenix5x_asia" => Some(GarminProduct::Fenix5xAsia),
7314            "approach_z80" => Some(GarminProduct::ApproachZ80),
7315            "fr35_korea" => Some(GarminProduct::Fr35Korea),
7316            "d2charlie" => Some(GarminProduct::D2charlie),
7317            "vivo_smart3_apac" => Some(GarminProduct::VivoSmart3Apac),
7318            "vivo_sport_apac" => Some(GarminProduct::VivoSportApac),
7319            "fr935_asia" => Some(GarminProduct::Fr935Asia),
7320            "descent" => Some(GarminProduct::Descent),
7321            "vivo_fit4" => Some(GarminProduct::VivoFit4),
7322            "fr645" => Some(GarminProduct::Fr645),
7323            "fr645m" => Some(GarminProduct::Fr645m),
7324            "fr30" => Some(GarminProduct::Fr30),
7325            "fenix5s_plus" => Some(GarminProduct::Fenix5sPlus),
7326            "Edge_130" => Some(GarminProduct::Edge130),
7327            "edge_1030_asia" => Some(GarminProduct::Edge1030Asia),
7328            "vivosmart_4" => Some(GarminProduct::Vivosmart4),
7329            "vivo_move_hr_asia" => Some(GarminProduct::VivoMoveHrAsia),
7330            "approach_x10" => Some(GarminProduct::ApproachX10),
7331            "fr30_asia" => Some(GarminProduct::Fr30Asia),
7332            "vivoactive3m_w" => Some(GarminProduct::Vivoactive3mW),
7333            "fr645_asia" => Some(GarminProduct::Fr645Asia),
7334            "fr645m_asia" => Some(GarminProduct::Fr645mAsia),
7335            "edge_explore" => Some(GarminProduct::EdgeExplore),
7336            "gpsmap66" => Some(GarminProduct::Gpsmap66),
7337            "approach_s10" => Some(GarminProduct::ApproachS10),
7338            "vivoactive3m_l" => Some(GarminProduct::Vivoactive3mL),
7339            "fr245" => Some(GarminProduct::Fr245),
7340            "fr245_music" => Some(GarminProduct::Fr245Music),
7341            "approach_g80" => Some(GarminProduct::ApproachG80),
7342            "edge_130_asia" => Some(GarminProduct::Edge130Asia),
7343            "edge_1030_bontrager" => Some(GarminProduct::Edge1030Bontrager),
7344            "fenix5_plus" => Some(GarminProduct::Fenix5Plus),
7345            "fenix5x_plus" => Some(GarminProduct::Fenix5xPlus),
7346            "edge_520_plus" => Some(GarminProduct::Edge520Plus),
7347            "fr945" => Some(GarminProduct::Fr945),
7348            "edge_530" => Some(GarminProduct::Edge530),
7349            "edge_830" => Some(GarminProduct::Edge830),
7350            "instinct_esports" => Some(GarminProduct::InstinctEsports),
7351            "fenix5s_plus_apac" => Some(GarminProduct::Fenix5sPlusApac),
7352            "fenix5x_plus_apac" => Some(GarminProduct::Fenix5xPlusApac),
7353            "edge_520_plus_apac" => Some(GarminProduct::Edge520PlusApac),
7354            "descent_t1" => Some(GarminProduct::DescentT1),
7355            "fr235l_asia" => Some(GarminProduct::Fr235lAsia),
7356            "fr245_asia" => Some(GarminProduct::Fr245Asia),
7357            "vivo_active3m_apac" => Some(GarminProduct::VivoActive3mApac),
7358            "gen3_bsm" => Some(GarminProduct::Gen3Bsm),
7359            "gen3_bcm" => Some(GarminProduct::Gen3Bcm),
7360            "vivo_smart4_asia" => Some(GarminProduct::VivoSmart4Asia),
7361            "vivoactive4_small" => Some(GarminProduct::Vivoactive4Small),
7362            "vivoactive4_large" => Some(GarminProduct::Vivoactive4Large),
7363            "venu" => Some(GarminProduct::Venu),
7364            "marq_driver" => Some(GarminProduct::MarqDriver),
7365            "marq_aviator" => Some(GarminProduct::MarqAviator),
7366            "marq_captain" => Some(GarminProduct::MarqCaptain),
7367            "marq_commander" => Some(GarminProduct::MarqCommander),
7368            "marq_expedition" => Some(GarminProduct::MarqExpedition),
7369            "marq_athlete" => Some(GarminProduct::MarqAthlete),
7370            "descent_mk2" => Some(GarminProduct::DescentMk2),
7371            "fr45" => Some(GarminProduct::Fr45),
7372            "gpsmap66i" => Some(GarminProduct::Gpsmap66i),
7373            "fenix6S_sport" => Some(GarminProduct::Fenix6SSport),
7374            "fenix6S" => Some(GarminProduct::Fenix6S),
7375            "fenix6_sport" => Some(GarminProduct::Fenix6Sport),
7376            "fenix6" => Some(GarminProduct::Fenix6),
7377            "fenix6x" => Some(GarminProduct::Fenix6x),
7378            "hrm_dual" => Some(GarminProduct::HrmDual),
7379            "hrm_pro" => Some(GarminProduct::HrmPro),
7380            "vivo_move3_premium" => Some(GarminProduct::VivoMove3Premium),
7381            "approach_s40" => Some(GarminProduct::ApproachS40),
7382            "fr245m_asia" => Some(GarminProduct::Fr245mAsia),
7383            "edge_530_apac" => Some(GarminProduct::Edge530Apac),
7384            "edge_830_apac" => Some(GarminProduct::Edge830Apac),
7385            "vivo_move3" => Some(GarminProduct::VivoMove3),
7386            "vivo_active4_small_asia" => Some(GarminProduct::VivoActive4SmallAsia),
7387            "vivo_active4_large_asia" => Some(GarminProduct::VivoActive4LargeAsia),
7388            "vivo_active4_oled_asia" => Some(GarminProduct::VivoActive4OledAsia),
7389            "swim2" => Some(GarminProduct::Swim2),
7390            "marq_driver_asia" => Some(GarminProduct::MarqDriverAsia),
7391            "marq_aviator_asia" => Some(GarminProduct::MarqAviatorAsia),
7392            "vivo_move3_asia" => Some(GarminProduct::VivoMove3Asia),
7393            "fr945_asia" => Some(GarminProduct::Fr945Asia),
7394            "vivo_active3t_chn" => Some(GarminProduct::VivoActive3tChn),
7395            "marq_captain_asia" => Some(GarminProduct::MarqCaptainAsia),
7396            "marq_commander_asia" => Some(GarminProduct::MarqCommanderAsia),
7397            "marq_expedition_asia" => Some(GarminProduct::MarqExpeditionAsia),
7398            "marq_athlete_asia" => Some(GarminProduct::MarqAthleteAsia),
7399            "index_smart_scale_2" => Some(GarminProduct::IndexSmartScale2),
7400            "instinct_solar" => Some(GarminProduct::InstinctSolar),
7401            "fr45_asia" => Some(GarminProduct::Fr45Asia),
7402            "vivoactive3_daimler" => Some(GarminProduct::Vivoactive3Daimler),
7403            "legacy_rey" => Some(GarminProduct::LegacyRey),
7404            "legacy_darth_vader" => Some(GarminProduct::LegacyDarthVader),
7405            "legacy_captain_marvel" => Some(GarminProduct::LegacyCaptainMarvel),
7406            "legacy_first_avenger" => Some(GarminProduct::LegacyFirstAvenger),
7407            "fenix6s_sport_asia" => Some(GarminProduct::Fenix6sSportAsia),
7408            "fenix6s_asia" => Some(GarminProduct::Fenix6sAsia),
7409            "fenix6_sport_asia" => Some(GarminProduct::Fenix6SportAsia),
7410            "fenix6_asia" => Some(GarminProduct::Fenix6Asia),
7411            "fenix6x_asia" => Some(GarminProduct::Fenix6xAsia),
7412            "legacy_captain_marvel_asia" => Some(GarminProduct::LegacyCaptainMarvelAsia),
7413            "legacy_first_avenger_asia" => Some(GarminProduct::LegacyFirstAvengerAsia),
7414            "legacy_rey_asia" => Some(GarminProduct::LegacyReyAsia),
7415            "legacy_darth_vader_asia" => Some(GarminProduct::LegacyDarthVaderAsia),
7416            "descent_mk2s" => Some(GarminProduct::DescentMk2s),
7417            "edge_130_plus" => Some(GarminProduct::Edge130Plus),
7418            "edge_1030_plus" => Some(GarminProduct::Edge1030Plus),
7419            "rally_200" => Some(GarminProduct::Rally200),
7420            "fr745" => Some(GarminProduct::Fr745),
7421            "venusq_music" => Some(GarminProduct::VenusqMusic),
7422            "venusq_music_v2" => Some(GarminProduct::VenusqMusicV2),
7423            "venusq" => Some(GarminProduct::Venusq),
7424            "lily" => Some(GarminProduct::Lily),
7425            "marq_adventurer" => Some(GarminProduct::MarqAdventurer),
7426            "enduro" => Some(GarminProduct::Enduro),
7427            "swim2_apac" => Some(GarminProduct::Swim2Apac),
7428            "marq_adventurer_asia" => Some(GarminProduct::MarqAdventurerAsia),
7429            "fr945_lte" => Some(GarminProduct::Fr945Lte),
7430            "descent_mk2_asia" => Some(GarminProduct::DescentMk2Asia),
7431            "venu2" => Some(GarminProduct::Venu2),
7432            "venu2s" => Some(GarminProduct::Venu2s),
7433            "venu_daimler_asia" => Some(GarminProduct::VenuDaimlerAsia),
7434            "marq_golfer" => Some(GarminProduct::MarqGolfer),
7435            "venu_daimler" => Some(GarminProduct::VenuDaimler),
7436            "fr745_asia" => Some(GarminProduct::Fr745Asia),
7437            "varia_rct715" => Some(GarminProduct::VariaRct715),
7438            "lily_asia" => Some(GarminProduct::LilyAsia),
7439            "edge_1030_plus_asia" => Some(GarminProduct::Edge1030PlusAsia),
7440            "edge_130_plus_asia" => Some(GarminProduct::Edge130PlusAsia),
7441            "approach_s12" => Some(GarminProduct::ApproachS12),
7442            "enduro_asia" => Some(GarminProduct::EnduroAsia),
7443            "venusq_asia" => Some(GarminProduct::VenusqAsia),
7444            "edge_1040" => Some(GarminProduct::Edge1040),
7445            "marq_golfer_asia" => Some(GarminProduct::MarqGolferAsia),
7446            "venu2_plus" => Some(GarminProduct::Venu2Plus),
7447            "gnss" => Some(GarminProduct::Gnss),
7448            "fr55" => Some(GarminProduct::Fr55),
7449            "instinct_2" => Some(GarminProduct::Instinct2),
7450            "instinct_2s" => Some(GarminProduct::Instinct2s),
7451            "fenix7s" => Some(GarminProduct::Fenix7s),
7452            "fenix7" => Some(GarminProduct::Fenix7),
7453            "fenix7x" => Some(GarminProduct::Fenix7x),
7454            "fenix7s_apac" => Some(GarminProduct::Fenix7sApac),
7455            "fenix7_apac" => Some(GarminProduct::Fenix7Apac),
7456            "fenix7x_apac" => Some(GarminProduct::Fenix7xApac),
7457            "approach_g12" => Some(GarminProduct::ApproachG12),
7458            "descent_mk2s_asia" => Some(GarminProduct::DescentMk2sAsia),
7459            "approach_s42" => Some(GarminProduct::ApproachS42),
7460            "epix_gen2" => Some(GarminProduct::EpixGen2),
7461            "epix_gen2_apac" => Some(GarminProduct::EpixGen2Apac),
7462            "venu2s_asia" => Some(GarminProduct::Venu2sAsia),
7463            "venu2_asia" => Some(GarminProduct::Venu2Asia),
7464            "fr945_lte_asia" => Some(GarminProduct::Fr945LteAsia),
7465            "vivo_move_sport" => Some(GarminProduct::VivoMoveSport),
7466            "vivomove_trend" => Some(GarminProduct::VivomoveTrend),
7467            "approach_S12_asia" => Some(GarminProduct::ApproachS12Asia),
7468            "fr255_music" => Some(GarminProduct::Fr255Music),
7469            "fr255_small_music" => Some(GarminProduct::Fr255SmallMusic),
7470            "fr255" => Some(GarminProduct::Fr255),
7471            "fr255_small" => Some(GarminProduct::Fr255Small),
7472            "approach_g12_asia" => Some(GarminProduct::ApproachG12Asia),
7473            "approach_s42_asia" => Some(GarminProduct::ApproachS42Asia),
7474            "descent_g1" => Some(GarminProduct::DescentG1),
7475            "venu2_plus_asia" => Some(GarminProduct::Venu2PlusAsia),
7476            "fr955" => Some(GarminProduct::Fr955),
7477            "fr55_asia" => Some(GarminProduct::Fr55Asia),
7478            "edge_540" => Some(GarminProduct::Edge540),
7479            "edge_840" => Some(GarminProduct::Edge840),
7480            "vivosmart_5" => Some(GarminProduct::Vivosmart5),
7481            "instinct_2_asia" => Some(GarminProduct::Instinct2Asia),
7482            "marq_gen2" => Some(GarminProduct::MarqGen2),
7483            "venusq2" => Some(GarminProduct::Venusq2),
7484            "venusq2music" => Some(GarminProduct::Venusq2music),
7485            "marq_gen2_aviator" => Some(GarminProduct::MarqGen2Aviator),
7486            "d2_air_x10" => Some(GarminProduct::D2AirX10),
7487            "hrm_pro_plus" => Some(GarminProduct::HrmProPlus),
7488            "descent_g1_asia" => Some(GarminProduct::DescentG1Asia),
7489            "tactix7" => Some(GarminProduct::Tactix7),
7490            "instinct_crossover" => Some(GarminProduct::InstinctCrossover),
7491            "edge_explore2" => Some(GarminProduct::EdgeExplore2),
7492            "descent_mk3" => Some(GarminProduct::DescentMk3),
7493            "descent_mk3i" => Some(GarminProduct::DescentMk3i),
7494            "approach_s70" => Some(GarminProduct::ApproachS70),
7495            "fr265_large" => Some(GarminProduct::Fr265Large),
7496            "fr265_small" => Some(GarminProduct::Fr265Small),
7497            "venu3" => Some(GarminProduct::Venu3),
7498            "venu3s" => Some(GarminProduct::Venu3s),
7499            "tacx_neo_smart" => Some(GarminProduct::TacxNeoSmart),
7500            "tacx_neo2_smart" => Some(GarminProduct::TacxNeo2Smart),
7501            "tacx_neo2_t_smart" => Some(GarminProduct::TacxNeo2TSmart),
7502            "tacx_neo_smart_bike" => Some(GarminProduct::TacxNeoSmartBike),
7503            "tacx_satori_smart" => Some(GarminProduct::TacxSatoriSmart),
7504            "tacx_flow_smart" => Some(GarminProduct::TacxFlowSmart),
7505            "tacx_vortex_smart" => Some(GarminProduct::TacxVortexSmart),
7506            "tacx_bushido_smart" => Some(GarminProduct::TacxBushidoSmart),
7507            "tacx_genius_smart" => Some(GarminProduct::TacxGeniusSmart),
7508            "tacx_flux_flux_s_smart" => Some(GarminProduct::TacxFluxFluxSSmart),
7509            "tacx_flux2_smart" => Some(GarminProduct::TacxFlux2Smart),
7510            "tacx_magnum" => Some(GarminProduct::TacxMagnum),
7511            "edge_1040_asia" => Some(GarminProduct::Edge1040Asia),
7512            "epix_gen2_pro_42" => Some(GarminProduct::EpixGen2Pro42),
7513            "epix_gen2_pro_47" => Some(GarminProduct::EpixGen2Pro47),
7514            "epix_gen2_pro_51" => Some(GarminProduct::EpixGen2Pro51),
7515            "fr965" => Some(GarminProduct::Fr965),
7516            "enduro2" => Some(GarminProduct::Enduro2),
7517            "fenix7s_pro_solar" => Some(GarminProduct::Fenix7sProSolar),
7518            "fenix7_pro_solar" => Some(GarminProduct::Fenix7ProSolar),
7519            "fenix7x_pro_solar" => Some(GarminProduct::Fenix7xProSolar),
7520            "lily2" => Some(GarminProduct::Lily2),
7521            "instinct_2x" => Some(GarminProduct::Instinct2x),
7522            "vivoactive5" => Some(GarminProduct::Vivoactive5),
7523            "fr165" => Some(GarminProduct::Fr165),
7524            "fr165_music" => Some(GarminProduct::Fr165Music),
7525            "edge_1050" => Some(GarminProduct::Edge1050),
7526            "descent_t2" => Some(GarminProduct::DescentT2),
7527            "hrm_fit" => Some(GarminProduct::HrmFit),
7528            "marq_gen2_commander" => Some(GarminProduct::MarqGen2Commander),
7529            "lily_athlete" => Some(GarminProduct::LilyAthlete),
7530            "rally_x10" => Some(GarminProduct::RallyX10),
7531            "fenix8_solar" => Some(GarminProduct::Fenix8Solar),
7532            "fenix8_solar_large" => Some(GarminProduct::Fenix8SolarLarge),
7533            "fenix8_small" => Some(GarminProduct::Fenix8Small),
7534            "fenix8" => Some(GarminProduct::Fenix8),
7535            "d2_mach1_pro" => Some(GarminProduct::D2Mach1Pro),
7536            "enduro3" => Some(GarminProduct::Enduro3),
7537            "instinctE_40mm" => Some(GarminProduct::InstinctE40mm),
7538            "instinctE_45mm" => Some(GarminProduct::InstinctE45mm),
7539            "instinct3_solar_45mm" => Some(GarminProduct::Instinct3Solar45mm),
7540            "instinct3_amoled_45mm" => Some(GarminProduct::Instinct3Amoled45mm),
7541            "instinct3_amoled_50mm" => Some(GarminProduct::Instinct3Amoled50mm),
7542            "descent_g2" => Some(GarminProduct::DescentG2),
7543            "venu_x1" => Some(GarminProduct::VenuX1),
7544            "hrm_200" => Some(GarminProduct::Hrm200),
7545            "vivoactive6" => Some(GarminProduct::Vivoactive6),
7546            "fenix8_pro" => Some(GarminProduct::Fenix8Pro),
7547            "edge_550" => Some(GarminProduct::Edge550),
7548            "edge_850" => Some(GarminProduct::Edge850),
7549            "venu4" => Some(GarminProduct::Venu4),
7550            "venu4s" => Some(GarminProduct::Venu4s),
7551            "approachS44" => Some(GarminProduct::ApproachS44),
7552            "edge_mtb" => Some(GarminProduct::EdgeMtb),
7553            "approachS50" => Some(GarminProduct::ApproachS50),
7554            "fenix_e" => Some(GarminProduct::FenixE),
7555            "bounce2" => Some(GarminProduct::Bounce2),
7556            "instinct3_solar_50mm" => Some(GarminProduct::Instinct3Solar50mm),
7557            "tactix8_amoled" => Some(GarminProduct::Tactix8Amoled),
7558            "tactix8_solar" => Some(GarminProduct::Tactix8Solar),
7559            "approach_j1" => Some(GarminProduct::ApproachJ1),
7560            "d2_mach2" => Some(GarminProduct::D2Mach2),
7561            "instinct_crossover_amoled" => Some(GarminProduct::InstinctCrossoverAmoled),
7562            "d2_air_x15" => Some(GarminProduct::D2AirX15),
7563            "sdm4" => Some(GarminProduct::Sdm4),
7564            "edge_remote" => Some(GarminProduct::EdgeRemote),
7565            "tacx_training_app_win" => Some(GarminProduct::TacxTrainingAppWin),
7566            "tacx_training_app_mac" => Some(GarminProduct::TacxTrainingAppMac),
7567            "tacx_training_app_mac_catalyst" => Some(GarminProduct::TacxTrainingAppMacCatalyst),
7568            "training_center" => Some(GarminProduct::TrainingCenter),
7569            "tacx_training_app_android" => Some(GarminProduct::TacxTrainingAppAndroid),
7570            "tacx_training_app_ios" => Some(GarminProduct::TacxTrainingAppIos),
7571            "tacx_training_app_legacy" => Some(GarminProduct::TacxTrainingAppLegacy),
7572            "connectiq_simulator" => Some(GarminProduct::ConnectiqSimulator),
7573            "android_antplus_plugin" => Some(GarminProduct::AndroidAntplusPlugin),
7574            "connect" => Some(GarminProduct::Connect),
7575            _ => None,
7576        }
7577    }
7578}
7579
7580#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
7581#[repr(u8)]
7582#[non_exhaustive]
7583pub enum AntplusDeviceType {
7584    Antfs = 1,
7585    BikePower = 11,
7586    EnvironmentSensorLegacy = 12,
7587    MultiSportSpeedDistance = 15,
7588    Control = 16,
7589    FitnessEquipment = 17,
7590    BloodPressure = 18,
7591    GeocacheNode = 19,
7592    LightElectricVehicle = 20,
7593    EnvSensor = 25,
7594    Racquet = 26,
7595    ControlHub = 27,
7596    MuscleOxygen = 31,
7597    Shifting = 34,
7598    BikeLightMain = 35,
7599    BikeLightShared = 36,
7600    Exd = 38,
7601    BikeRadar = 40,
7602    BikeAero = 46,
7603    WeightScale = 119,
7604    HeartRate = 120,
7605    BikeSpeedCadence = 121,
7606    BikeCadence = 122,
7607    BikeSpeed = 123,
7608    StrideSpeedDistance = 124,
7609}
7610
7611impl AntplusDeviceType {
7612    /// Snake-case canonical name from Profile.xlsx.
7613    pub fn as_str(&self) -> &'static str {
7614        match self {
7615            AntplusDeviceType::Antfs => "antfs",
7616            AntplusDeviceType::BikePower => "bike_power",
7617            AntplusDeviceType::EnvironmentSensorLegacy => "environment_sensor_legacy",
7618            AntplusDeviceType::MultiSportSpeedDistance => "multi_sport_speed_distance",
7619            AntplusDeviceType::Control => "control",
7620            AntplusDeviceType::FitnessEquipment => "fitness_equipment",
7621            AntplusDeviceType::BloodPressure => "blood_pressure",
7622            AntplusDeviceType::GeocacheNode => "geocache_node",
7623            AntplusDeviceType::LightElectricVehicle => "light_electric_vehicle",
7624            AntplusDeviceType::EnvSensor => "env_sensor",
7625            AntplusDeviceType::Racquet => "racquet",
7626            AntplusDeviceType::ControlHub => "control_hub",
7627            AntplusDeviceType::MuscleOxygen => "muscle_oxygen",
7628            AntplusDeviceType::Shifting => "shifting",
7629            AntplusDeviceType::BikeLightMain => "bike_light_main",
7630            AntplusDeviceType::BikeLightShared => "bike_light_shared",
7631            AntplusDeviceType::Exd => "exd",
7632            AntplusDeviceType::BikeRadar => "bike_radar",
7633            AntplusDeviceType::BikeAero => "bike_aero",
7634            AntplusDeviceType::WeightScale => "weight_scale",
7635            AntplusDeviceType::HeartRate => "heart_rate",
7636            AntplusDeviceType::BikeSpeedCadence => "bike_speed_cadence",
7637            AntplusDeviceType::BikeCadence => "bike_cadence",
7638            AntplusDeviceType::BikeSpeed => "bike_speed",
7639            AntplusDeviceType::StrideSpeedDistance => "stride_speed_distance",
7640        }
7641    }
7642
7643    /// Try to construct from the underlying numeric value.
7644    pub fn from_value(value: u8) -> Option<Self> {
7645        match value {
7646            1 => Some(AntplusDeviceType::Antfs),
7647            11 => Some(AntplusDeviceType::BikePower),
7648            12 => Some(AntplusDeviceType::EnvironmentSensorLegacy),
7649            15 => Some(AntplusDeviceType::MultiSportSpeedDistance),
7650            16 => Some(AntplusDeviceType::Control),
7651            17 => Some(AntplusDeviceType::FitnessEquipment),
7652            18 => Some(AntplusDeviceType::BloodPressure),
7653            19 => Some(AntplusDeviceType::GeocacheNode),
7654            20 => Some(AntplusDeviceType::LightElectricVehicle),
7655            25 => Some(AntplusDeviceType::EnvSensor),
7656            26 => Some(AntplusDeviceType::Racquet),
7657            27 => Some(AntplusDeviceType::ControlHub),
7658            31 => Some(AntplusDeviceType::MuscleOxygen),
7659            34 => Some(AntplusDeviceType::Shifting),
7660            35 => Some(AntplusDeviceType::BikeLightMain),
7661            36 => Some(AntplusDeviceType::BikeLightShared),
7662            38 => Some(AntplusDeviceType::Exd),
7663            40 => Some(AntplusDeviceType::BikeRadar),
7664            46 => Some(AntplusDeviceType::BikeAero),
7665            119 => Some(AntplusDeviceType::WeightScale),
7666            120 => Some(AntplusDeviceType::HeartRate),
7667            121 => Some(AntplusDeviceType::BikeSpeedCadence),
7668            122 => Some(AntplusDeviceType::BikeCadence),
7669            123 => Some(AntplusDeviceType::BikeSpeed),
7670            124 => Some(AntplusDeviceType::StrideSpeedDistance),
7671            _ => None,
7672        }
7673    }
7674
7675    /// Try to construct from the snake-case canonical name.
7676    pub fn from_str(name: &str) -> Option<Self> {
7677        match name {
7678            "antfs" => Some(AntplusDeviceType::Antfs),
7679            "bike_power" => Some(AntplusDeviceType::BikePower),
7680            "environment_sensor_legacy" => Some(AntplusDeviceType::EnvironmentSensorLegacy),
7681            "multi_sport_speed_distance" => Some(AntplusDeviceType::MultiSportSpeedDistance),
7682            "control" => Some(AntplusDeviceType::Control),
7683            "fitness_equipment" => Some(AntplusDeviceType::FitnessEquipment),
7684            "blood_pressure" => Some(AntplusDeviceType::BloodPressure),
7685            "geocache_node" => Some(AntplusDeviceType::GeocacheNode),
7686            "light_electric_vehicle" => Some(AntplusDeviceType::LightElectricVehicle),
7687            "env_sensor" => Some(AntplusDeviceType::EnvSensor),
7688            "racquet" => Some(AntplusDeviceType::Racquet),
7689            "control_hub" => Some(AntplusDeviceType::ControlHub),
7690            "muscle_oxygen" => Some(AntplusDeviceType::MuscleOxygen),
7691            "shifting" => Some(AntplusDeviceType::Shifting),
7692            "bike_light_main" => Some(AntplusDeviceType::BikeLightMain),
7693            "bike_light_shared" => Some(AntplusDeviceType::BikeLightShared),
7694            "exd" => Some(AntplusDeviceType::Exd),
7695            "bike_radar" => Some(AntplusDeviceType::BikeRadar),
7696            "bike_aero" => Some(AntplusDeviceType::BikeAero),
7697            "weight_scale" => Some(AntplusDeviceType::WeightScale),
7698            "heart_rate" => Some(AntplusDeviceType::HeartRate),
7699            "bike_speed_cadence" => Some(AntplusDeviceType::BikeSpeedCadence),
7700            "bike_cadence" => Some(AntplusDeviceType::BikeCadence),
7701            "bike_speed" => Some(AntplusDeviceType::BikeSpeed),
7702            "stride_speed_distance" => Some(AntplusDeviceType::StrideSpeedDistance),
7703            _ => None,
7704        }
7705    }
7706}
7707
7708#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
7709#[repr(u8)]
7710#[non_exhaustive]
7711pub enum AntNetwork {
7712    Public = 0,
7713    Antplus = 1,
7714    Antfs = 2,
7715    Private = 3,
7716}
7717
7718impl AntNetwork {
7719    /// Snake-case canonical name from Profile.xlsx.
7720    pub fn as_str(&self) -> &'static str {
7721        match self {
7722            AntNetwork::Public => "public",
7723            AntNetwork::Antplus => "antplus",
7724            AntNetwork::Antfs => "antfs",
7725            AntNetwork::Private => "private",
7726        }
7727    }
7728
7729    /// Try to construct from the underlying numeric value.
7730    pub fn from_value(value: u8) -> Option<Self> {
7731        match value {
7732            0 => Some(AntNetwork::Public),
7733            1 => Some(AntNetwork::Antplus),
7734            2 => Some(AntNetwork::Antfs),
7735            3 => Some(AntNetwork::Private),
7736            _ => None,
7737        }
7738    }
7739
7740    /// Try to construct from the snake-case canonical name.
7741    pub fn from_str(name: &str) -> Option<Self> {
7742        match name {
7743            "public" => Some(AntNetwork::Public),
7744            "antplus" => Some(AntNetwork::Antplus),
7745            "antfs" => Some(AntNetwork::Antfs),
7746            "private" => Some(AntNetwork::Private),
7747            _ => None,
7748        }
7749    }
7750}
7751
7752#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
7753#[repr(u32)]
7754#[non_exhaustive]
7755pub enum WorkoutCapabilities {
7756    Interval = 1,
7757    Custom = 2,
7758    FitnessEquipment = 4,
7759    Firstbeat = 8,
7760    NewLeaf = 16,
7761    Tcx = 32,
7762    Speed = 128,
7763    HeartRate = 256,
7764    Distance = 512,
7765    Cadence = 1024,
7766    Power = 2048,
7767    Grade = 4096,
7768    Resistance = 8192,
7769    Protected = 16384,
7770}
7771
7772impl WorkoutCapabilities {
7773    /// Snake-case canonical name from Profile.xlsx.
7774    pub fn as_str(&self) -> &'static str {
7775        match self {
7776            WorkoutCapabilities::Interval => "interval",
7777            WorkoutCapabilities::Custom => "custom",
7778            WorkoutCapabilities::FitnessEquipment => "fitness_equipment",
7779            WorkoutCapabilities::Firstbeat => "firstbeat",
7780            WorkoutCapabilities::NewLeaf => "new_leaf",
7781            WorkoutCapabilities::Tcx => "tcx",
7782            WorkoutCapabilities::Speed => "speed",
7783            WorkoutCapabilities::HeartRate => "heart_rate",
7784            WorkoutCapabilities::Distance => "distance",
7785            WorkoutCapabilities::Cadence => "cadence",
7786            WorkoutCapabilities::Power => "power",
7787            WorkoutCapabilities::Grade => "grade",
7788            WorkoutCapabilities::Resistance => "resistance",
7789            WorkoutCapabilities::Protected => "protected",
7790        }
7791    }
7792
7793    /// Try to construct from the underlying numeric value.
7794    pub fn from_value(value: u32) -> Option<Self> {
7795        match value {
7796            1 => Some(WorkoutCapabilities::Interval),
7797            2 => Some(WorkoutCapabilities::Custom),
7798            4 => Some(WorkoutCapabilities::FitnessEquipment),
7799            8 => Some(WorkoutCapabilities::Firstbeat),
7800            16 => Some(WorkoutCapabilities::NewLeaf),
7801            32 => Some(WorkoutCapabilities::Tcx),
7802            128 => Some(WorkoutCapabilities::Speed),
7803            256 => Some(WorkoutCapabilities::HeartRate),
7804            512 => Some(WorkoutCapabilities::Distance),
7805            1024 => Some(WorkoutCapabilities::Cadence),
7806            2048 => Some(WorkoutCapabilities::Power),
7807            4096 => Some(WorkoutCapabilities::Grade),
7808            8192 => Some(WorkoutCapabilities::Resistance),
7809            16384 => Some(WorkoutCapabilities::Protected),
7810            _ => None,
7811        }
7812    }
7813
7814    /// Try to construct from the snake-case canonical name.
7815    pub fn from_str(name: &str) -> Option<Self> {
7816        match name {
7817            "interval" => Some(WorkoutCapabilities::Interval),
7818            "custom" => Some(WorkoutCapabilities::Custom),
7819            "fitness_equipment" => Some(WorkoutCapabilities::FitnessEquipment),
7820            "firstbeat" => Some(WorkoutCapabilities::Firstbeat),
7821            "new_leaf" => Some(WorkoutCapabilities::NewLeaf),
7822            "tcx" => Some(WorkoutCapabilities::Tcx),
7823            "speed" => Some(WorkoutCapabilities::Speed),
7824            "heart_rate" => Some(WorkoutCapabilities::HeartRate),
7825            "distance" => Some(WorkoutCapabilities::Distance),
7826            "cadence" => Some(WorkoutCapabilities::Cadence),
7827            "power" => Some(WorkoutCapabilities::Power),
7828            "grade" => Some(WorkoutCapabilities::Grade),
7829            "resistance" => Some(WorkoutCapabilities::Resistance),
7830            "protected" => Some(WorkoutCapabilities::Protected),
7831            _ => None,
7832        }
7833    }
7834}
7835
7836#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
7837#[repr(u8)]
7838#[non_exhaustive]
7839pub enum BatteryStatus {
7840    New = 1,
7841    Good = 2,
7842    Ok = 3,
7843    Low = 4,
7844    Critical = 5,
7845    Charging = 6,
7846    Unknown = 7,
7847}
7848
7849impl BatteryStatus {
7850    /// Snake-case canonical name from Profile.xlsx.
7851    pub fn as_str(&self) -> &'static str {
7852        match self {
7853            BatteryStatus::New => "new",
7854            BatteryStatus::Good => "good",
7855            BatteryStatus::Ok => "ok",
7856            BatteryStatus::Low => "low",
7857            BatteryStatus::Critical => "critical",
7858            BatteryStatus::Charging => "charging",
7859            BatteryStatus::Unknown => "unknown",
7860        }
7861    }
7862
7863    /// Try to construct from the underlying numeric value.
7864    pub fn from_value(value: u8) -> Option<Self> {
7865        match value {
7866            1 => Some(BatteryStatus::New),
7867            2 => Some(BatteryStatus::Good),
7868            3 => Some(BatteryStatus::Ok),
7869            4 => Some(BatteryStatus::Low),
7870            5 => Some(BatteryStatus::Critical),
7871            6 => Some(BatteryStatus::Charging),
7872            7 => Some(BatteryStatus::Unknown),
7873            _ => None,
7874        }
7875    }
7876
7877    /// Try to construct from the snake-case canonical name.
7878    pub fn from_str(name: &str) -> Option<Self> {
7879        match name {
7880            "new" => Some(BatteryStatus::New),
7881            "good" => Some(BatteryStatus::Good),
7882            "ok" => Some(BatteryStatus::Ok),
7883            "low" => Some(BatteryStatus::Low),
7884            "critical" => Some(BatteryStatus::Critical),
7885            "charging" => Some(BatteryStatus::Charging),
7886            "unknown" => Some(BatteryStatus::Unknown),
7887            _ => None,
7888        }
7889    }
7890}
7891
7892#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
7893#[repr(u8)]
7894#[non_exhaustive]
7895pub enum HrType {
7896    Normal = 0,
7897    Irregular = 1,
7898}
7899
7900impl HrType {
7901    /// Snake-case canonical name from Profile.xlsx.
7902    pub fn as_str(&self) -> &'static str {
7903        match self {
7904            HrType::Normal => "normal",
7905            HrType::Irregular => "irregular",
7906        }
7907    }
7908
7909    /// Try to construct from the underlying numeric value.
7910    pub fn from_value(value: u8) -> Option<Self> {
7911        match value {
7912            0 => Some(HrType::Normal),
7913            1 => Some(HrType::Irregular),
7914            _ => None,
7915        }
7916    }
7917
7918    /// Try to construct from the snake-case canonical name.
7919    pub fn from_str(name: &str) -> Option<Self> {
7920        match name {
7921            "normal" => Some(HrType::Normal),
7922            "irregular" => Some(HrType::Irregular),
7923            _ => None,
7924        }
7925    }
7926}
7927
7928#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
7929#[repr(u32)]
7930#[non_exhaustive]
7931pub enum CourseCapabilities {
7932    Processed = 1,
7933    Valid = 2,
7934    Time = 4,
7935    Distance = 8,
7936    Position = 16,
7937    HeartRate = 32,
7938    Power = 64,
7939    Cadence = 128,
7940    Training = 256,
7941    Navigation = 512,
7942    Bikeway = 1024,
7943    Aviation = 4096,
7944}
7945
7946impl CourseCapabilities {
7947    /// Snake-case canonical name from Profile.xlsx.
7948    pub fn as_str(&self) -> &'static str {
7949        match self {
7950            CourseCapabilities::Processed => "processed",
7951            CourseCapabilities::Valid => "valid",
7952            CourseCapabilities::Time => "time",
7953            CourseCapabilities::Distance => "distance",
7954            CourseCapabilities::Position => "position",
7955            CourseCapabilities::HeartRate => "heart_rate",
7956            CourseCapabilities::Power => "power",
7957            CourseCapabilities::Cadence => "cadence",
7958            CourseCapabilities::Training => "training",
7959            CourseCapabilities::Navigation => "navigation",
7960            CourseCapabilities::Bikeway => "bikeway",
7961            CourseCapabilities::Aviation => "aviation",
7962        }
7963    }
7964
7965    /// Try to construct from the underlying numeric value.
7966    pub fn from_value(value: u32) -> Option<Self> {
7967        match value {
7968            1 => Some(CourseCapabilities::Processed),
7969            2 => Some(CourseCapabilities::Valid),
7970            4 => Some(CourseCapabilities::Time),
7971            8 => Some(CourseCapabilities::Distance),
7972            16 => Some(CourseCapabilities::Position),
7973            32 => Some(CourseCapabilities::HeartRate),
7974            64 => Some(CourseCapabilities::Power),
7975            128 => Some(CourseCapabilities::Cadence),
7976            256 => Some(CourseCapabilities::Training),
7977            512 => Some(CourseCapabilities::Navigation),
7978            1024 => Some(CourseCapabilities::Bikeway),
7979            4096 => Some(CourseCapabilities::Aviation),
7980            _ => None,
7981        }
7982    }
7983
7984    /// Try to construct from the snake-case canonical name.
7985    pub fn from_str(name: &str) -> Option<Self> {
7986        match name {
7987            "processed" => Some(CourseCapabilities::Processed),
7988            "valid" => Some(CourseCapabilities::Valid),
7989            "time" => Some(CourseCapabilities::Time),
7990            "distance" => Some(CourseCapabilities::Distance),
7991            "position" => Some(CourseCapabilities::Position),
7992            "heart_rate" => Some(CourseCapabilities::HeartRate),
7993            "power" => Some(CourseCapabilities::Power),
7994            "cadence" => Some(CourseCapabilities::Cadence),
7995            "training" => Some(CourseCapabilities::Training),
7996            "navigation" => Some(CourseCapabilities::Navigation),
7997            "bikeway" => Some(CourseCapabilities::Bikeway),
7998            "aviation" => Some(CourseCapabilities::Aviation),
7999            _ => None,
8000        }
8001    }
8002}
8003
8004#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8005#[repr(u16)]
8006#[non_exhaustive]
8007pub enum Weight {
8008    Calculating = 65534,
8009}
8010
8011impl Weight {
8012    /// Snake-case canonical name from Profile.xlsx.
8013    pub fn as_str(&self) -> &'static str {
8014        match self {
8015            Weight::Calculating => "calculating",
8016        }
8017    }
8018
8019    /// Try to construct from the underlying numeric value.
8020    pub fn from_value(value: u16) -> Option<Self> {
8021        match value {
8022            65534 => Some(Weight::Calculating),
8023            _ => None,
8024        }
8025    }
8026
8027    /// Try to construct from the snake-case canonical name.
8028    pub fn from_str(name: &str) -> Option<Self> {
8029        match name {
8030            "calculating" => Some(Weight::Calculating),
8031            _ => None,
8032        }
8033    }
8034}
8035
8036#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8037#[repr(u32)]
8038#[non_exhaustive]
8039pub enum WorkoutHr {
8040    BpmOffset = 100,
8041}
8042
8043impl WorkoutHr {
8044    /// Snake-case canonical name from Profile.xlsx.
8045    pub fn as_str(&self) -> &'static str {
8046        match self {
8047            WorkoutHr::BpmOffset => "bpm_offset",
8048        }
8049    }
8050
8051    /// Try to construct from the underlying numeric value.
8052    pub fn from_value(value: u32) -> Option<Self> {
8053        match value {
8054            100 => Some(WorkoutHr::BpmOffset),
8055            _ => None,
8056        }
8057    }
8058
8059    /// Try to construct from the snake-case canonical name.
8060    pub fn from_str(name: &str) -> Option<Self> {
8061        match name {
8062            "bpm_offset" => Some(WorkoutHr::BpmOffset),
8063            _ => None,
8064        }
8065    }
8066}
8067
8068#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8069#[repr(u32)]
8070#[non_exhaustive]
8071pub enum WorkoutPower {
8072    WattsOffset = 1000,
8073}
8074
8075impl WorkoutPower {
8076    /// Snake-case canonical name from Profile.xlsx.
8077    pub fn as_str(&self) -> &'static str {
8078        match self {
8079            WorkoutPower::WattsOffset => "watts_offset",
8080        }
8081    }
8082
8083    /// Try to construct from the underlying numeric value.
8084    pub fn from_value(value: u32) -> Option<Self> {
8085        match value {
8086            1000 => Some(WorkoutPower::WattsOffset),
8087            _ => None,
8088        }
8089    }
8090
8091    /// Try to construct from the snake-case canonical name.
8092    pub fn from_str(name: &str) -> Option<Self> {
8093        match name {
8094            "watts_offset" => Some(WorkoutPower::WattsOffset),
8095            _ => None,
8096        }
8097    }
8098}
8099
8100#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8101#[repr(u8)]
8102#[non_exhaustive]
8103pub enum BpStatus {
8104    NoError = 0,
8105    ErrorIncompleteData = 1,
8106    ErrorNoMeasurement = 2,
8107    ErrorDataOutOfRange = 3,
8108    ErrorIrregularHeartRate = 4,
8109}
8110
8111impl BpStatus {
8112    /// Snake-case canonical name from Profile.xlsx.
8113    pub fn as_str(&self) -> &'static str {
8114        match self {
8115            BpStatus::NoError => "no_error",
8116            BpStatus::ErrorIncompleteData => "error_incomplete_data",
8117            BpStatus::ErrorNoMeasurement => "error_no_measurement",
8118            BpStatus::ErrorDataOutOfRange => "error_data_out_of_range",
8119            BpStatus::ErrorIrregularHeartRate => "error_irregular_heart_rate",
8120        }
8121    }
8122
8123    /// Try to construct from the underlying numeric value.
8124    pub fn from_value(value: u8) -> Option<Self> {
8125        match value {
8126            0 => Some(BpStatus::NoError),
8127            1 => Some(BpStatus::ErrorIncompleteData),
8128            2 => Some(BpStatus::ErrorNoMeasurement),
8129            3 => Some(BpStatus::ErrorDataOutOfRange),
8130            4 => Some(BpStatus::ErrorIrregularHeartRate),
8131            _ => None,
8132        }
8133    }
8134
8135    /// Try to construct from the snake-case canonical name.
8136    pub fn from_str(name: &str) -> Option<Self> {
8137        match name {
8138            "no_error" => Some(BpStatus::NoError),
8139            "error_incomplete_data" => Some(BpStatus::ErrorIncompleteData),
8140            "error_no_measurement" => Some(BpStatus::ErrorNoMeasurement),
8141            "error_data_out_of_range" => Some(BpStatus::ErrorDataOutOfRange),
8142            "error_irregular_heart_rate" => Some(BpStatus::ErrorIrregularHeartRate),
8143            _ => None,
8144        }
8145    }
8146}
8147
8148#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8149#[repr(u16)]
8150#[non_exhaustive]
8151pub enum UserLocalId {
8152    LocalMin = 0,
8153    LocalMax = 15,
8154    StationaryMin = 16,
8155    StationaryMax = 255,
8156    PortableMin = 256,
8157    PortableMax = 65534,
8158}
8159
8160impl UserLocalId {
8161    /// Snake-case canonical name from Profile.xlsx.
8162    pub fn as_str(&self) -> &'static str {
8163        match self {
8164            UserLocalId::LocalMin => "local_min",
8165            UserLocalId::LocalMax => "local_max",
8166            UserLocalId::StationaryMin => "stationary_min",
8167            UserLocalId::StationaryMax => "stationary_max",
8168            UserLocalId::PortableMin => "portable_min",
8169            UserLocalId::PortableMax => "portable_max",
8170        }
8171    }
8172
8173    /// Try to construct from the underlying numeric value.
8174    pub fn from_value(value: u16) -> Option<Self> {
8175        match value {
8176            0 => Some(UserLocalId::LocalMin),
8177            15 => Some(UserLocalId::LocalMax),
8178            16 => Some(UserLocalId::StationaryMin),
8179            255 => Some(UserLocalId::StationaryMax),
8180            256 => Some(UserLocalId::PortableMin),
8181            65534 => Some(UserLocalId::PortableMax),
8182            _ => None,
8183        }
8184    }
8185
8186    /// Try to construct from the snake-case canonical name.
8187    pub fn from_str(name: &str) -> Option<Self> {
8188        match name {
8189            "local_min" => Some(UserLocalId::LocalMin),
8190            "local_max" => Some(UserLocalId::LocalMax),
8191            "stationary_min" => Some(UserLocalId::StationaryMin),
8192            "stationary_max" => Some(UserLocalId::StationaryMax),
8193            "portable_min" => Some(UserLocalId::PortableMin),
8194            "portable_max" => Some(UserLocalId::PortableMax),
8195            _ => None,
8196        }
8197    }
8198}
8199
8200#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8201#[repr(u8)]
8202#[non_exhaustive]
8203pub enum SwimStroke {
8204    Freestyle = 0,
8205    Backstroke = 1,
8206    Breaststroke = 2,
8207    Butterfly = 3,
8208    Drill = 4,
8209    Mixed = 5,
8210    Im = 6,
8211    ImByRound = 7,
8212    Rimo = 8,
8213}
8214
8215impl SwimStroke {
8216    /// Snake-case canonical name from Profile.xlsx.
8217    pub fn as_str(&self) -> &'static str {
8218        match self {
8219            SwimStroke::Freestyle => "freestyle",
8220            SwimStroke::Backstroke => "backstroke",
8221            SwimStroke::Breaststroke => "breaststroke",
8222            SwimStroke::Butterfly => "butterfly",
8223            SwimStroke::Drill => "drill",
8224            SwimStroke::Mixed => "mixed",
8225            SwimStroke::Im => "im",
8226            SwimStroke::ImByRound => "im_by_round",
8227            SwimStroke::Rimo => "rimo",
8228        }
8229    }
8230
8231    /// Try to construct from the underlying numeric value.
8232    pub fn from_value(value: u8) -> Option<Self> {
8233        match value {
8234            0 => Some(SwimStroke::Freestyle),
8235            1 => Some(SwimStroke::Backstroke),
8236            2 => Some(SwimStroke::Breaststroke),
8237            3 => Some(SwimStroke::Butterfly),
8238            4 => Some(SwimStroke::Drill),
8239            5 => Some(SwimStroke::Mixed),
8240            6 => Some(SwimStroke::Im),
8241            7 => Some(SwimStroke::ImByRound),
8242            8 => Some(SwimStroke::Rimo),
8243            _ => None,
8244        }
8245    }
8246
8247    /// Try to construct from the snake-case canonical name.
8248    pub fn from_str(name: &str) -> Option<Self> {
8249        match name {
8250            "freestyle" => Some(SwimStroke::Freestyle),
8251            "backstroke" => Some(SwimStroke::Backstroke),
8252            "breaststroke" => Some(SwimStroke::Breaststroke),
8253            "butterfly" => Some(SwimStroke::Butterfly),
8254            "drill" => Some(SwimStroke::Drill),
8255            "mixed" => Some(SwimStroke::Mixed),
8256            "im" => Some(SwimStroke::Im),
8257            "im_by_round" => Some(SwimStroke::ImByRound),
8258            "rimo" => Some(SwimStroke::Rimo),
8259            _ => None,
8260        }
8261    }
8262}
8263
8264#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8265#[repr(u8)]
8266#[non_exhaustive]
8267pub enum ActivityType {
8268    Generic = 0,
8269    Running = 1,
8270    Cycling = 2,
8271    Transition = 3,
8272    FitnessEquipment = 4,
8273    Swimming = 5,
8274    Walking = 6,
8275    Sedentary = 8,
8276    All = 254,
8277}
8278
8279impl ActivityType {
8280    /// Snake-case canonical name from Profile.xlsx.
8281    pub fn as_str(&self) -> &'static str {
8282        match self {
8283            ActivityType::Generic => "generic",
8284            ActivityType::Running => "running",
8285            ActivityType::Cycling => "cycling",
8286            ActivityType::Transition => "transition",
8287            ActivityType::FitnessEquipment => "fitness_equipment",
8288            ActivityType::Swimming => "swimming",
8289            ActivityType::Walking => "walking",
8290            ActivityType::Sedentary => "sedentary",
8291            ActivityType::All => "all",
8292        }
8293    }
8294
8295    /// Try to construct from the underlying numeric value.
8296    pub fn from_value(value: u8) -> Option<Self> {
8297        match value {
8298            0 => Some(ActivityType::Generic),
8299            1 => Some(ActivityType::Running),
8300            2 => Some(ActivityType::Cycling),
8301            3 => Some(ActivityType::Transition),
8302            4 => Some(ActivityType::FitnessEquipment),
8303            5 => Some(ActivityType::Swimming),
8304            6 => Some(ActivityType::Walking),
8305            8 => Some(ActivityType::Sedentary),
8306            254 => Some(ActivityType::All),
8307            _ => None,
8308        }
8309    }
8310
8311    /// Try to construct from the snake-case canonical name.
8312    pub fn from_str(name: &str) -> Option<Self> {
8313        match name {
8314            "generic" => Some(ActivityType::Generic),
8315            "running" => Some(ActivityType::Running),
8316            "cycling" => Some(ActivityType::Cycling),
8317            "transition" => Some(ActivityType::Transition),
8318            "fitness_equipment" => Some(ActivityType::FitnessEquipment),
8319            "swimming" => Some(ActivityType::Swimming),
8320            "walking" => Some(ActivityType::Walking),
8321            "sedentary" => Some(ActivityType::Sedentary),
8322            "all" => Some(ActivityType::All),
8323            _ => None,
8324        }
8325    }
8326}
8327
8328#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8329#[repr(u8)]
8330#[non_exhaustive]
8331pub enum ActivitySubtype {
8332    Generic = 0,
8333    Treadmill = 1,
8334    Street = 2,
8335    Trail = 3,
8336    Track = 4,
8337    Spin = 5,
8338    IndoorCycling = 6,
8339    Road = 7,
8340    Mountain = 8,
8341    Downhill = 9,
8342    Recumbent = 10,
8343    Cyclocross = 11,
8344    HandCycling = 12,
8345    TrackCycling = 13,
8346    IndoorRowing = 14,
8347    Elliptical = 15,
8348    StairClimbing = 16,
8349    LapSwimming = 17,
8350    OpenWater = 18,
8351    All = 254,
8352}
8353
8354impl ActivitySubtype {
8355    /// Snake-case canonical name from Profile.xlsx.
8356    pub fn as_str(&self) -> &'static str {
8357        match self {
8358            ActivitySubtype::Generic => "generic",
8359            ActivitySubtype::Treadmill => "treadmill",
8360            ActivitySubtype::Street => "street",
8361            ActivitySubtype::Trail => "trail",
8362            ActivitySubtype::Track => "track",
8363            ActivitySubtype::Spin => "spin",
8364            ActivitySubtype::IndoorCycling => "indoor_cycling",
8365            ActivitySubtype::Road => "road",
8366            ActivitySubtype::Mountain => "mountain",
8367            ActivitySubtype::Downhill => "downhill",
8368            ActivitySubtype::Recumbent => "recumbent",
8369            ActivitySubtype::Cyclocross => "cyclocross",
8370            ActivitySubtype::HandCycling => "hand_cycling",
8371            ActivitySubtype::TrackCycling => "track_cycling",
8372            ActivitySubtype::IndoorRowing => "indoor_rowing",
8373            ActivitySubtype::Elliptical => "elliptical",
8374            ActivitySubtype::StairClimbing => "stair_climbing",
8375            ActivitySubtype::LapSwimming => "lap_swimming",
8376            ActivitySubtype::OpenWater => "open_water",
8377            ActivitySubtype::All => "all",
8378        }
8379    }
8380
8381    /// Try to construct from the underlying numeric value.
8382    pub fn from_value(value: u8) -> Option<Self> {
8383        match value {
8384            0 => Some(ActivitySubtype::Generic),
8385            1 => Some(ActivitySubtype::Treadmill),
8386            2 => Some(ActivitySubtype::Street),
8387            3 => Some(ActivitySubtype::Trail),
8388            4 => Some(ActivitySubtype::Track),
8389            5 => Some(ActivitySubtype::Spin),
8390            6 => Some(ActivitySubtype::IndoorCycling),
8391            7 => Some(ActivitySubtype::Road),
8392            8 => Some(ActivitySubtype::Mountain),
8393            9 => Some(ActivitySubtype::Downhill),
8394            10 => Some(ActivitySubtype::Recumbent),
8395            11 => Some(ActivitySubtype::Cyclocross),
8396            12 => Some(ActivitySubtype::HandCycling),
8397            13 => Some(ActivitySubtype::TrackCycling),
8398            14 => Some(ActivitySubtype::IndoorRowing),
8399            15 => Some(ActivitySubtype::Elliptical),
8400            16 => Some(ActivitySubtype::StairClimbing),
8401            17 => Some(ActivitySubtype::LapSwimming),
8402            18 => Some(ActivitySubtype::OpenWater),
8403            254 => Some(ActivitySubtype::All),
8404            _ => None,
8405        }
8406    }
8407
8408    /// Try to construct from the snake-case canonical name.
8409    pub fn from_str(name: &str) -> Option<Self> {
8410        match name {
8411            "generic" => Some(ActivitySubtype::Generic),
8412            "treadmill" => Some(ActivitySubtype::Treadmill),
8413            "street" => Some(ActivitySubtype::Street),
8414            "trail" => Some(ActivitySubtype::Trail),
8415            "track" => Some(ActivitySubtype::Track),
8416            "spin" => Some(ActivitySubtype::Spin),
8417            "indoor_cycling" => Some(ActivitySubtype::IndoorCycling),
8418            "road" => Some(ActivitySubtype::Road),
8419            "mountain" => Some(ActivitySubtype::Mountain),
8420            "downhill" => Some(ActivitySubtype::Downhill),
8421            "recumbent" => Some(ActivitySubtype::Recumbent),
8422            "cyclocross" => Some(ActivitySubtype::Cyclocross),
8423            "hand_cycling" => Some(ActivitySubtype::HandCycling),
8424            "track_cycling" => Some(ActivitySubtype::TrackCycling),
8425            "indoor_rowing" => Some(ActivitySubtype::IndoorRowing),
8426            "elliptical" => Some(ActivitySubtype::Elliptical),
8427            "stair_climbing" => Some(ActivitySubtype::StairClimbing),
8428            "lap_swimming" => Some(ActivitySubtype::LapSwimming),
8429            "open_water" => Some(ActivitySubtype::OpenWater),
8430            "all" => Some(ActivitySubtype::All),
8431            _ => None,
8432        }
8433    }
8434}
8435
8436#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8437#[repr(u8)]
8438#[non_exhaustive]
8439pub enum ActivityLevel {
8440    Low = 0,
8441    Medium = 1,
8442    High = 2,
8443}
8444
8445impl ActivityLevel {
8446    /// Snake-case canonical name from Profile.xlsx.
8447    pub fn as_str(&self) -> &'static str {
8448        match self {
8449            ActivityLevel::Low => "low",
8450            ActivityLevel::Medium => "medium",
8451            ActivityLevel::High => "high",
8452        }
8453    }
8454
8455    /// Try to construct from the underlying numeric value.
8456    pub fn from_value(value: u8) -> Option<Self> {
8457        match value {
8458            0 => Some(ActivityLevel::Low),
8459            1 => Some(ActivityLevel::Medium),
8460            2 => Some(ActivityLevel::High),
8461            _ => None,
8462        }
8463    }
8464
8465    /// Try to construct from the snake-case canonical name.
8466    pub fn from_str(name: &str) -> Option<Self> {
8467        match name {
8468            "low" => Some(ActivityLevel::Low),
8469            "medium" => Some(ActivityLevel::Medium),
8470            "high" => Some(ActivityLevel::High),
8471            _ => None,
8472        }
8473    }
8474}
8475
8476#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8477#[repr(u8)]
8478#[non_exhaustive]
8479pub enum Side {
8480    Right = 0,
8481    Left = 1,
8482}
8483
8484impl Side {
8485    /// Snake-case canonical name from Profile.xlsx.
8486    pub fn as_str(&self) -> &'static str {
8487        match self {
8488            Side::Right => "right",
8489            Side::Left => "left",
8490        }
8491    }
8492
8493    /// Try to construct from the underlying numeric value.
8494    pub fn from_value(value: u8) -> Option<Self> {
8495        match value {
8496            0 => Some(Side::Right),
8497            1 => Some(Side::Left),
8498            _ => None,
8499        }
8500    }
8501
8502    /// Try to construct from the snake-case canonical name.
8503    pub fn from_str(name: &str) -> Option<Self> {
8504        match name {
8505            "right" => Some(Side::Right),
8506            "left" => Some(Side::Left),
8507            _ => None,
8508        }
8509    }
8510}
8511
8512#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8513#[repr(u8)]
8514#[non_exhaustive]
8515pub enum LeftRightBalance {
8516    Mask = 127,
8517    Right = 128,
8518}
8519
8520impl LeftRightBalance {
8521    /// Snake-case canonical name from Profile.xlsx.
8522    pub fn as_str(&self) -> &'static str {
8523        match self {
8524            LeftRightBalance::Mask => "mask",
8525            LeftRightBalance::Right => "right",
8526        }
8527    }
8528
8529    /// Try to construct from the underlying numeric value.
8530    pub fn from_value(value: u8) -> Option<Self> {
8531        match value {
8532            127 => Some(LeftRightBalance::Mask),
8533            128 => Some(LeftRightBalance::Right),
8534            _ => None,
8535        }
8536    }
8537
8538    /// Try to construct from the snake-case canonical name.
8539    pub fn from_str(name: &str) -> Option<Self> {
8540        match name {
8541            "mask" => Some(LeftRightBalance::Mask),
8542            "right" => Some(LeftRightBalance::Right),
8543            _ => None,
8544        }
8545    }
8546}
8547
8548#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8549#[repr(u16)]
8550#[non_exhaustive]
8551pub enum LeftRightBalance100 {
8552    Mask = 16383,
8553    Right = 32768,
8554}
8555
8556impl LeftRightBalance100 {
8557    /// Snake-case canonical name from Profile.xlsx.
8558    pub fn as_str(&self) -> &'static str {
8559        match self {
8560            LeftRightBalance100::Mask => "mask",
8561            LeftRightBalance100::Right => "right",
8562        }
8563    }
8564
8565    /// Try to construct from the underlying numeric value.
8566    pub fn from_value(value: u16) -> Option<Self> {
8567        match value {
8568            16383 => Some(LeftRightBalance100::Mask),
8569            32768 => Some(LeftRightBalance100::Right),
8570            _ => None,
8571        }
8572    }
8573
8574    /// Try to construct from the snake-case canonical name.
8575    pub fn from_str(name: &str) -> Option<Self> {
8576        match name {
8577            "mask" => Some(LeftRightBalance100::Mask),
8578            "right" => Some(LeftRightBalance100::Right),
8579            _ => None,
8580        }
8581    }
8582}
8583
8584#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8585#[repr(u8)]
8586#[non_exhaustive]
8587pub enum LengthType {
8588    Idle = 0,
8589    Active = 1,
8590}
8591
8592impl LengthType {
8593    /// Snake-case canonical name from Profile.xlsx.
8594    pub fn as_str(&self) -> &'static str {
8595        match self {
8596            LengthType::Idle => "idle",
8597            LengthType::Active => "active",
8598        }
8599    }
8600
8601    /// Try to construct from the underlying numeric value.
8602    pub fn from_value(value: u8) -> Option<Self> {
8603        match value {
8604            0 => Some(LengthType::Idle),
8605            1 => Some(LengthType::Active),
8606            _ => None,
8607        }
8608    }
8609
8610    /// Try to construct from the snake-case canonical name.
8611    pub fn from_str(name: &str) -> Option<Self> {
8612        match name {
8613            "idle" => Some(LengthType::Idle),
8614            "active" => Some(LengthType::Active),
8615            _ => None,
8616        }
8617    }
8618}
8619
8620#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8621#[repr(u8)]
8622#[non_exhaustive]
8623pub enum DayOfWeek {
8624    Sunday = 0,
8625    Monday = 1,
8626    Tuesday = 2,
8627    Wednesday = 3,
8628    Thursday = 4,
8629    Friday = 5,
8630    Saturday = 6,
8631}
8632
8633impl DayOfWeek {
8634    /// Snake-case canonical name from Profile.xlsx.
8635    pub fn as_str(&self) -> &'static str {
8636        match self {
8637            DayOfWeek::Sunday => "sunday",
8638            DayOfWeek::Monday => "monday",
8639            DayOfWeek::Tuesday => "tuesday",
8640            DayOfWeek::Wednesday => "wednesday",
8641            DayOfWeek::Thursday => "thursday",
8642            DayOfWeek::Friday => "friday",
8643            DayOfWeek::Saturday => "saturday",
8644        }
8645    }
8646
8647    /// Try to construct from the underlying numeric value.
8648    pub fn from_value(value: u8) -> Option<Self> {
8649        match value {
8650            0 => Some(DayOfWeek::Sunday),
8651            1 => Some(DayOfWeek::Monday),
8652            2 => Some(DayOfWeek::Tuesday),
8653            3 => Some(DayOfWeek::Wednesday),
8654            4 => Some(DayOfWeek::Thursday),
8655            5 => Some(DayOfWeek::Friday),
8656            6 => Some(DayOfWeek::Saturday),
8657            _ => None,
8658        }
8659    }
8660
8661    /// Try to construct from the snake-case canonical name.
8662    pub fn from_str(name: &str) -> Option<Self> {
8663        match name {
8664            "sunday" => Some(DayOfWeek::Sunday),
8665            "monday" => Some(DayOfWeek::Monday),
8666            "tuesday" => Some(DayOfWeek::Tuesday),
8667            "wednesday" => Some(DayOfWeek::Wednesday),
8668            "thursday" => Some(DayOfWeek::Thursday),
8669            "friday" => Some(DayOfWeek::Friday),
8670            "saturday" => Some(DayOfWeek::Saturday),
8671            _ => None,
8672        }
8673    }
8674}
8675
8676#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8677#[repr(u32)]
8678#[non_exhaustive]
8679pub enum ConnectivityCapabilities {
8680    Bluetooth = 1,
8681    BluetoothLe = 2,
8682    Ant = 4,
8683    ActivityUpload = 8,
8684    CourseDownload = 16,
8685    WorkoutDownload = 32,
8686    LiveTrack = 64,
8687    WeatherConditions = 128,
8688    WeatherAlerts = 256,
8689    GpsEphemerisDownload = 512,
8690    ExplicitArchive = 1024,
8691    SetupIncomplete = 2048,
8692    ContinueSyncAfterSoftwareUpdate = 4096,
8693    ConnectIqAppDownload = 8192,
8694    GolfCourseDownload = 16384,
8695    DeviceInitiatesSync = 32768,
8696    ConnectIqWatchAppDownload = 65536,
8697    ConnectIqWidgetDownload = 131072,
8698    ConnectIqWatchFaceDownload = 262144,
8699    ConnectIqDataFieldDownload = 524288,
8700    ConnectIqAppManagment = 1048576,
8701    SwingSensor = 2097152,
8702    SwingSensorRemote = 4194304,
8703    IncidentDetection = 8388608,
8704    AudioPrompts = 16777216,
8705    WifiVerification = 33554432,
8706    TrueUp = 67108864,
8707    FindMyWatch = 134217728,
8708    RemoteManualSync = 268435456,
8709    LiveTrackAutoStart = 536870912,
8710    LiveTrackMessaging = 1073741824,
8711    InstantInput = 2147483648,
8712}
8713
8714impl ConnectivityCapabilities {
8715    /// Snake-case canonical name from Profile.xlsx.
8716    pub fn as_str(&self) -> &'static str {
8717        match self {
8718            ConnectivityCapabilities::Bluetooth => "bluetooth",
8719            ConnectivityCapabilities::BluetoothLe => "bluetooth_le",
8720            ConnectivityCapabilities::Ant => "ant",
8721            ConnectivityCapabilities::ActivityUpload => "activity_upload",
8722            ConnectivityCapabilities::CourseDownload => "course_download",
8723            ConnectivityCapabilities::WorkoutDownload => "workout_download",
8724            ConnectivityCapabilities::LiveTrack => "live_track",
8725            ConnectivityCapabilities::WeatherConditions => "weather_conditions",
8726            ConnectivityCapabilities::WeatherAlerts => "weather_alerts",
8727            ConnectivityCapabilities::GpsEphemerisDownload => "gps_ephemeris_download",
8728            ConnectivityCapabilities::ExplicitArchive => "explicit_archive",
8729            ConnectivityCapabilities::SetupIncomplete => "setup_incomplete",
8730            ConnectivityCapabilities::ContinueSyncAfterSoftwareUpdate => {
8731                "continue_sync_after_software_update"
8732            }
8733            ConnectivityCapabilities::ConnectIqAppDownload => "connect_iq_app_download",
8734            ConnectivityCapabilities::GolfCourseDownload => "golf_course_download",
8735            ConnectivityCapabilities::DeviceInitiatesSync => "device_initiates_sync",
8736            ConnectivityCapabilities::ConnectIqWatchAppDownload => "connect_iq_watch_app_download",
8737            ConnectivityCapabilities::ConnectIqWidgetDownload => "connect_iq_widget_download",
8738            ConnectivityCapabilities::ConnectIqWatchFaceDownload => {
8739                "connect_iq_watch_face_download"
8740            }
8741            ConnectivityCapabilities::ConnectIqDataFieldDownload => {
8742                "connect_iq_data_field_download"
8743            }
8744            ConnectivityCapabilities::ConnectIqAppManagment => "connect_iq_app_managment",
8745            ConnectivityCapabilities::SwingSensor => "swing_sensor",
8746            ConnectivityCapabilities::SwingSensorRemote => "swing_sensor_remote",
8747            ConnectivityCapabilities::IncidentDetection => "incident_detection",
8748            ConnectivityCapabilities::AudioPrompts => "audio_prompts",
8749            ConnectivityCapabilities::WifiVerification => "wifi_verification",
8750            ConnectivityCapabilities::TrueUp => "true_up",
8751            ConnectivityCapabilities::FindMyWatch => "find_my_watch",
8752            ConnectivityCapabilities::RemoteManualSync => "remote_manual_sync",
8753            ConnectivityCapabilities::LiveTrackAutoStart => "live_track_auto_start",
8754            ConnectivityCapabilities::LiveTrackMessaging => "live_track_messaging",
8755            ConnectivityCapabilities::InstantInput => "instant_input",
8756        }
8757    }
8758
8759    /// Try to construct from the underlying numeric value.
8760    pub fn from_value(value: u32) -> Option<Self> {
8761        match value {
8762            1 => Some(ConnectivityCapabilities::Bluetooth),
8763            2 => Some(ConnectivityCapabilities::BluetoothLe),
8764            4 => Some(ConnectivityCapabilities::Ant),
8765            8 => Some(ConnectivityCapabilities::ActivityUpload),
8766            16 => Some(ConnectivityCapabilities::CourseDownload),
8767            32 => Some(ConnectivityCapabilities::WorkoutDownload),
8768            64 => Some(ConnectivityCapabilities::LiveTrack),
8769            128 => Some(ConnectivityCapabilities::WeatherConditions),
8770            256 => Some(ConnectivityCapabilities::WeatherAlerts),
8771            512 => Some(ConnectivityCapabilities::GpsEphemerisDownload),
8772            1024 => Some(ConnectivityCapabilities::ExplicitArchive),
8773            2048 => Some(ConnectivityCapabilities::SetupIncomplete),
8774            4096 => Some(ConnectivityCapabilities::ContinueSyncAfterSoftwareUpdate),
8775            8192 => Some(ConnectivityCapabilities::ConnectIqAppDownload),
8776            16384 => Some(ConnectivityCapabilities::GolfCourseDownload),
8777            32768 => Some(ConnectivityCapabilities::DeviceInitiatesSync),
8778            65536 => Some(ConnectivityCapabilities::ConnectIqWatchAppDownload),
8779            131072 => Some(ConnectivityCapabilities::ConnectIqWidgetDownload),
8780            262144 => Some(ConnectivityCapabilities::ConnectIqWatchFaceDownload),
8781            524288 => Some(ConnectivityCapabilities::ConnectIqDataFieldDownload),
8782            1048576 => Some(ConnectivityCapabilities::ConnectIqAppManagment),
8783            2097152 => Some(ConnectivityCapabilities::SwingSensor),
8784            4194304 => Some(ConnectivityCapabilities::SwingSensorRemote),
8785            8388608 => Some(ConnectivityCapabilities::IncidentDetection),
8786            16777216 => Some(ConnectivityCapabilities::AudioPrompts),
8787            33554432 => Some(ConnectivityCapabilities::WifiVerification),
8788            67108864 => Some(ConnectivityCapabilities::TrueUp),
8789            134217728 => Some(ConnectivityCapabilities::FindMyWatch),
8790            268435456 => Some(ConnectivityCapabilities::RemoteManualSync),
8791            536870912 => Some(ConnectivityCapabilities::LiveTrackAutoStart),
8792            1073741824 => Some(ConnectivityCapabilities::LiveTrackMessaging),
8793            2147483648 => Some(ConnectivityCapabilities::InstantInput),
8794            _ => None,
8795        }
8796    }
8797
8798    /// Try to construct from the snake-case canonical name.
8799    pub fn from_str(name: &str) -> Option<Self> {
8800        match name {
8801            "bluetooth" => Some(ConnectivityCapabilities::Bluetooth),
8802            "bluetooth_le" => Some(ConnectivityCapabilities::BluetoothLe),
8803            "ant" => Some(ConnectivityCapabilities::Ant),
8804            "activity_upload" => Some(ConnectivityCapabilities::ActivityUpload),
8805            "course_download" => Some(ConnectivityCapabilities::CourseDownload),
8806            "workout_download" => Some(ConnectivityCapabilities::WorkoutDownload),
8807            "live_track" => Some(ConnectivityCapabilities::LiveTrack),
8808            "weather_conditions" => Some(ConnectivityCapabilities::WeatherConditions),
8809            "weather_alerts" => Some(ConnectivityCapabilities::WeatherAlerts),
8810            "gps_ephemeris_download" => Some(ConnectivityCapabilities::GpsEphemerisDownload),
8811            "explicit_archive" => Some(ConnectivityCapabilities::ExplicitArchive),
8812            "setup_incomplete" => Some(ConnectivityCapabilities::SetupIncomplete),
8813            "continue_sync_after_software_update" => {
8814                Some(ConnectivityCapabilities::ContinueSyncAfterSoftwareUpdate)
8815            }
8816            "connect_iq_app_download" => Some(ConnectivityCapabilities::ConnectIqAppDownload),
8817            "golf_course_download" => Some(ConnectivityCapabilities::GolfCourseDownload),
8818            "device_initiates_sync" => Some(ConnectivityCapabilities::DeviceInitiatesSync),
8819            "connect_iq_watch_app_download" => {
8820                Some(ConnectivityCapabilities::ConnectIqWatchAppDownload)
8821            }
8822            "connect_iq_widget_download" => Some(ConnectivityCapabilities::ConnectIqWidgetDownload),
8823            "connect_iq_watch_face_download" => {
8824                Some(ConnectivityCapabilities::ConnectIqWatchFaceDownload)
8825            }
8826            "connect_iq_data_field_download" => {
8827                Some(ConnectivityCapabilities::ConnectIqDataFieldDownload)
8828            }
8829            "connect_iq_app_managment" => Some(ConnectivityCapabilities::ConnectIqAppManagment),
8830            "swing_sensor" => Some(ConnectivityCapabilities::SwingSensor),
8831            "swing_sensor_remote" => Some(ConnectivityCapabilities::SwingSensorRemote),
8832            "incident_detection" => Some(ConnectivityCapabilities::IncidentDetection),
8833            "audio_prompts" => Some(ConnectivityCapabilities::AudioPrompts),
8834            "wifi_verification" => Some(ConnectivityCapabilities::WifiVerification),
8835            "true_up" => Some(ConnectivityCapabilities::TrueUp),
8836            "find_my_watch" => Some(ConnectivityCapabilities::FindMyWatch),
8837            "remote_manual_sync" => Some(ConnectivityCapabilities::RemoteManualSync),
8838            "live_track_auto_start" => Some(ConnectivityCapabilities::LiveTrackAutoStart),
8839            "live_track_messaging" => Some(ConnectivityCapabilities::LiveTrackMessaging),
8840            "instant_input" => Some(ConnectivityCapabilities::InstantInput),
8841            _ => None,
8842        }
8843    }
8844}
8845
8846#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8847#[repr(u8)]
8848#[non_exhaustive]
8849pub enum WeatherReport {
8850    Current = 0,
8851    Forecast = 1,
8852    DailyForecast = 2,
8853}
8854
8855impl WeatherReport {
8856    /// Snake-case canonical name from Profile.xlsx.
8857    pub fn as_str(&self) -> &'static str {
8858        match self {
8859            WeatherReport::Current => "current",
8860            WeatherReport::Forecast => "hourly_forecast",
8861            WeatherReport::DailyForecast => "daily_forecast",
8862        }
8863    }
8864
8865    /// Try to construct from the underlying numeric value.
8866    pub fn from_value(value: u8) -> Option<Self> {
8867        match value {
8868            0 => Some(WeatherReport::Current),
8869            1 => Some(WeatherReport::Forecast),
8870            2 => Some(WeatherReport::DailyForecast),
8871            _ => None,
8872        }
8873    }
8874
8875    /// Try to construct from the snake-case canonical name.
8876    pub fn from_str(name: &str) -> Option<Self> {
8877        match name {
8878            "current" => Some(WeatherReport::Current),
8879            "hourly_forecast" => Some(WeatherReport::Forecast),
8880            "daily_forecast" => Some(WeatherReport::DailyForecast),
8881            _ => None,
8882        }
8883    }
8884}
8885
8886#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8887#[repr(u8)]
8888#[non_exhaustive]
8889pub enum WeatherStatus {
8890    Clear = 0,
8891    PartlyCloudy = 1,
8892    MostlyCloudy = 2,
8893    Rain = 3,
8894    Snow = 4,
8895    Windy = 5,
8896    Thunderstorms = 6,
8897    WintryMix = 7,
8898    Fog = 8,
8899    Hazy = 11,
8900    Hail = 12,
8901    ScatteredShowers = 13,
8902    ScatteredThunderstorms = 14,
8903    UnknownPrecipitation = 15,
8904    LightRain = 16,
8905    HeavyRain = 17,
8906    LightSnow = 18,
8907    HeavySnow = 19,
8908    LightRainSnow = 20,
8909    HeavyRainSnow = 21,
8910    Cloudy = 22,
8911}
8912
8913impl WeatherStatus {
8914    /// Snake-case canonical name from Profile.xlsx.
8915    pub fn as_str(&self) -> &'static str {
8916        match self {
8917            WeatherStatus::Clear => "clear",
8918            WeatherStatus::PartlyCloudy => "partly_cloudy",
8919            WeatherStatus::MostlyCloudy => "mostly_cloudy",
8920            WeatherStatus::Rain => "rain",
8921            WeatherStatus::Snow => "snow",
8922            WeatherStatus::Windy => "windy",
8923            WeatherStatus::Thunderstorms => "thunderstorms",
8924            WeatherStatus::WintryMix => "wintry_mix",
8925            WeatherStatus::Fog => "fog",
8926            WeatherStatus::Hazy => "hazy",
8927            WeatherStatus::Hail => "hail",
8928            WeatherStatus::ScatteredShowers => "scattered_showers",
8929            WeatherStatus::ScatteredThunderstorms => "scattered_thunderstorms",
8930            WeatherStatus::UnknownPrecipitation => "unknown_precipitation",
8931            WeatherStatus::LightRain => "light_rain",
8932            WeatherStatus::HeavyRain => "heavy_rain",
8933            WeatherStatus::LightSnow => "light_snow",
8934            WeatherStatus::HeavySnow => "heavy_snow",
8935            WeatherStatus::LightRainSnow => "light_rain_snow",
8936            WeatherStatus::HeavyRainSnow => "heavy_rain_snow",
8937            WeatherStatus::Cloudy => "cloudy",
8938        }
8939    }
8940
8941    /// Try to construct from the underlying numeric value.
8942    pub fn from_value(value: u8) -> Option<Self> {
8943        match value {
8944            0 => Some(WeatherStatus::Clear),
8945            1 => Some(WeatherStatus::PartlyCloudy),
8946            2 => Some(WeatherStatus::MostlyCloudy),
8947            3 => Some(WeatherStatus::Rain),
8948            4 => Some(WeatherStatus::Snow),
8949            5 => Some(WeatherStatus::Windy),
8950            6 => Some(WeatherStatus::Thunderstorms),
8951            7 => Some(WeatherStatus::WintryMix),
8952            8 => Some(WeatherStatus::Fog),
8953            11 => Some(WeatherStatus::Hazy),
8954            12 => Some(WeatherStatus::Hail),
8955            13 => Some(WeatherStatus::ScatteredShowers),
8956            14 => Some(WeatherStatus::ScatteredThunderstorms),
8957            15 => Some(WeatherStatus::UnknownPrecipitation),
8958            16 => Some(WeatherStatus::LightRain),
8959            17 => Some(WeatherStatus::HeavyRain),
8960            18 => Some(WeatherStatus::LightSnow),
8961            19 => Some(WeatherStatus::HeavySnow),
8962            20 => Some(WeatherStatus::LightRainSnow),
8963            21 => Some(WeatherStatus::HeavyRainSnow),
8964            22 => Some(WeatherStatus::Cloudy),
8965            _ => None,
8966        }
8967    }
8968
8969    /// Try to construct from the snake-case canonical name.
8970    pub fn from_str(name: &str) -> Option<Self> {
8971        match name {
8972            "clear" => Some(WeatherStatus::Clear),
8973            "partly_cloudy" => Some(WeatherStatus::PartlyCloudy),
8974            "mostly_cloudy" => Some(WeatherStatus::MostlyCloudy),
8975            "rain" => Some(WeatherStatus::Rain),
8976            "snow" => Some(WeatherStatus::Snow),
8977            "windy" => Some(WeatherStatus::Windy),
8978            "thunderstorms" => Some(WeatherStatus::Thunderstorms),
8979            "wintry_mix" => Some(WeatherStatus::WintryMix),
8980            "fog" => Some(WeatherStatus::Fog),
8981            "hazy" => Some(WeatherStatus::Hazy),
8982            "hail" => Some(WeatherStatus::Hail),
8983            "scattered_showers" => Some(WeatherStatus::ScatteredShowers),
8984            "scattered_thunderstorms" => Some(WeatherStatus::ScatteredThunderstorms),
8985            "unknown_precipitation" => Some(WeatherStatus::UnknownPrecipitation),
8986            "light_rain" => Some(WeatherStatus::LightRain),
8987            "heavy_rain" => Some(WeatherStatus::HeavyRain),
8988            "light_snow" => Some(WeatherStatus::LightSnow),
8989            "heavy_snow" => Some(WeatherStatus::HeavySnow),
8990            "light_rain_snow" => Some(WeatherStatus::LightRainSnow),
8991            "heavy_rain_snow" => Some(WeatherStatus::HeavyRainSnow),
8992            "cloudy" => Some(WeatherStatus::Cloudy),
8993            _ => None,
8994        }
8995    }
8996}
8997
8998#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8999#[repr(u8)]
9000#[non_exhaustive]
9001pub enum WeatherSeverity {
9002    Unknown = 0,
9003    Warning = 1,
9004    Watch = 2,
9005    Advisory = 3,
9006    Statement = 4,
9007}
9008
9009impl WeatherSeverity {
9010    /// Snake-case canonical name from Profile.xlsx.
9011    pub fn as_str(&self) -> &'static str {
9012        match self {
9013            WeatherSeverity::Unknown => "unknown",
9014            WeatherSeverity::Warning => "warning",
9015            WeatherSeverity::Watch => "watch",
9016            WeatherSeverity::Advisory => "advisory",
9017            WeatherSeverity::Statement => "statement",
9018        }
9019    }
9020
9021    /// Try to construct from the underlying numeric value.
9022    pub fn from_value(value: u8) -> Option<Self> {
9023        match value {
9024            0 => Some(WeatherSeverity::Unknown),
9025            1 => Some(WeatherSeverity::Warning),
9026            2 => Some(WeatherSeverity::Watch),
9027            3 => Some(WeatherSeverity::Advisory),
9028            4 => Some(WeatherSeverity::Statement),
9029            _ => None,
9030        }
9031    }
9032
9033    /// Try to construct from the snake-case canonical name.
9034    pub fn from_str(name: &str) -> Option<Self> {
9035        match name {
9036            "unknown" => Some(WeatherSeverity::Unknown),
9037            "warning" => Some(WeatherSeverity::Warning),
9038            "watch" => Some(WeatherSeverity::Watch),
9039            "advisory" => Some(WeatherSeverity::Advisory),
9040            "statement" => Some(WeatherSeverity::Statement),
9041            _ => None,
9042        }
9043    }
9044}
9045
9046#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
9047#[repr(u8)]
9048#[non_exhaustive]
9049pub enum WeatherSevereType {
9050    Unspecified = 0,
9051    Tornado = 1,
9052    Tsunami = 2,
9053    Hurricane = 3,
9054    ExtremeWind = 4,
9055    Typhoon = 5,
9056    InlandHurricane = 6,
9057    HurricaneForceWind = 7,
9058    Waterspout = 8,
9059    SevereThunderstorm = 9,
9060    WreckhouseWinds = 10,
9061    LesSuetesWind = 11,
9062    Avalanche = 12,
9063    FlashFlood = 13,
9064    TropicalStorm = 14,
9065    InlandTropicalStorm = 15,
9066    Blizzard = 16,
9067    IceStorm = 17,
9068    FreezingRain = 18,
9069    DebrisFlow = 19,
9070    FlashFreeze = 20,
9071    DustStorm = 21,
9072    HighWind = 22,
9073    WinterStorm = 23,
9074    HeavyFreezingSpray = 24,
9075    ExtremeCold = 25,
9076    WindChill = 26,
9077    ColdWave = 27,
9078    HeavySnowAlert = 28,
9079    LakeEffectBlowingSnow = 29,
9080    SnowSquall = 30,
9081    LakeEffectSnow = 31,
9082    WinterWeather = 32,
9083    Sleet = 33,
9084    Snowfall = 34,
9085    SnowAndBlowingSnow = 35,
9086    BlowingSnow = 36,
9087    SnowAlert = 37,
9088    ArcticOutflow = 38,
9089    FreezingDrizzle = 39,
9090    Storm = 40,
9091    StormSurge = 41,
9092    Rainfall = 42,
9093    ArealFlood = 43,
9094    CoastalFlood = 44,
9095    LakeshoreFlood = 45,
9096    ExcessiveHeat = 46,
9097    Heat = 47,
9098    Weather = 48,
9099    HighHeatAndHumidity = 49,
9100    HumidexAndHealth = 50,
9101    Humidex = 51,
9102    Gale = 52,
9103    FreezingSpray = 53,
9104    SpecialMarine = 54,
9105    Squall = 55,
9106    StrongWind = 56,
9107    LakeWind = 57,
9108    MarineWeather = 58,
9109    Wind = 59,
9110    SmallCraftHazardousSeas = 60,
9111    HazardousSeas = 61,
9112    SmallCraft = 62,
9113    SmallCraftWinds = 63,
9114    SmallCraftRoughBar = 64,
9115    HighWaterLevel = 65,
9116    Ashfall = 66,
9117    FreezingFog = 67,
9118    DenseFog = 68,
9119    DenseSmoke = 69,
9120    BlowingDust = 70,
9121    HardFreeze = 71,
9122    Freeze = 72,
9123    Frost = 73,
9124    FireWeather = 74,
9125    Flood = 75,
9126    RipTide = 76,
9127    HighSurf = 77,
9128    Smog = 78,
9129    AirQuality = 79,
9130    BriskWind = 80,
9131    AirStagnation = 81,
9132    LowWater = 82,
9133    Hydrological = 83,
9134    SpecialWeather = 84,
9135}
9136
9137impl WeatherSevereType {
9138    /// Snake-case canonical name from Profile.xlsx.
9139    pub fn as_str(&self) -> &'static str {
9140        match self {
9141            WeatherSevereType::Unspecified => "unspecified",
9142            WeatherSevereType::Tornado => "tornado",
9143            WeatherSevereType::Tsunami => "tsunami",
9144            WeatherSevereType::Hurricane => "hurricane",
9145            WeatherSevereType::ExtremeWind => "extreme_wind",
9146            WeatherSevereType::Typhoon => "typhoon",
9147            WeatherSevereType::InlandHurricane => "inland_hurricane",
9148            WeatherSevereType::HurricaneForceWind => "hurricane_force_wind",
9149            WeatherSevereType::Waterspout => "waterspout",
9150            WeatherSevereType::SevereThunderstorm => "severe_thunderstorm",
9151            WeatherSevereType::WreckhouseWinds => "wreckhouse_winds",
9152            WeatherSevereType::LesSuetesWind => "les_suetes_wind",
9153            WeatherSevereType::Avalanche => "avalanche",
9154            WeatherSevereType::FlashFlood => "flash_flood",
9155            WeatherSevereType::TropicalStorm => "tropical_storm",
9156            WeatherSevereType::InlandTropicalStorm => "inland_tropical_storm",
9157            WeatherSevereType::Blizzard => "blizzard",
9158            WeatherSevereType::IceStorm => "ice_storm",
9159            WeatherSevereType::FreezingRain => "freezing_rain",
9160            WeatherSevereType::DebrisFlow => "debris_flow",
9161            WeatherSevereType::FlashFreeze => "flash_freeze",
9162            WeatherSevereType::DustStorm => "dust_storm",
9163            WeatherSevereType::HighWind => "high_wind",
9164            WeatherSevereType::WinterStorm => "winter_storm",
9165            WeatherSevereType::HeavyFreezingSpray => "heavy_freezing_spray",
9166            WeatherSevereType::ExtremeCold => "extreme_cold",
9167            WeatherSevereType::WindChill => "wind_chill",
9168            WeatherSevereType::ColdWave => "cold_wave",
9169            WeatherSevereType::HeavySnowAlert => "heavy_snow_alert",
9170            WeatherSevereType::LakeEffectBlowingSnow => "lake_effect_blowing_snow",
9171            WeatherSevereType::SnowSquall => "snow_squall",
9172            WeatherSevereType::LakeEffectSnow => "lake_effect_snow",
9173            WeatherSevereType::WinterWeather => "winter_weather",
9174            WeatherSevereType::Sleet => "sleet",
9175            WeatherSevereType::Snowfall => "snowfall",
9176            WeatherSevereType::SnowAndBlowingSnow => "snow_and_blowing_snow",
9177            WeatherSevereType::BlowingSnow => "blowing_snow",
9178            WeatherSevereType::SnowAlert => "snow_alert",
9179            WeatherSevereType::ArcticOutflow => "arctic_outflow",
9180            WeatherSevereType::FreezingDrizzle => "freezing_drizzle",
9181            WeatherSevereType::Storm => "storm",
9182            WeatherSevereType::StormSurge => "storm_surge",
9183            WeatherSevereType::Rainfall => "rainfall",
9184            WeatherSevereType::ArealFlood => "areal_flood",
9185            WeatherSevereType::CoastalFlood => "coastal_flood",
9186            WeatherSevereType::LakeshoreFlood => "lakeshore_flood",
9187            WeatherSevereType::ExcessiveHeat => "excessive_heat",
9188            WeatherSevereType::Heat => "heat",
9189            WeatherSevereType::Weather => "weather",
9190            WeatherSevereType::HighHeatAndHumidity => "high_heat_and_humidity",
9191            WeatherSevereType::HumidexAndHealth => "humidex_and_health",
9192            WeatherSevereType::Humidex => "humidex",
9193            WeatherSevereType::Gale => "gale",
9194            WeatherSevereType::FreezingSpray => "freezing_spray",
9195            WeatherSevereType::SpecialMarine => "special_marine",
9196            WeatherSevereType::Squall => "squall",
9197            WeatherSevereType::StrongWind => "strong_wind",
9198            WeatherSevereType::LakeWind => "lake_wind",
9199            WeatherSevereType::MarineWeather => "marine_weather",
9200            WeatherSevereType::Wind => "wind",
9201            WeatherSevereType::SmallCraftHazardousSeas => "small_craft_hazardous_seas",
9202            WeatherSevereType::HazardousSeas => "hazardous_seas",
9203            WeatherSevereType::SmallCraft => "small_craft",
9204            WeatherSevereType::SmallCraftWinds => "small_craft_winds",
9205            WeatherSevereType::SmallCraftRoughBar => "small_craft_rough_bar",
9206            WeatherSevereType::HighWaterLevel => "high_water_level",
9207            WeatherSevereType::Ashfall => "ashfall",
9208            WeatherSevereType::FreezingFog => "freezing_fog",
9209            WeatherSevereType::DenseFog => "dense_fog",
9210            WeatherSevereType::DenseSmoke => "dense_smoke",
9211            WeatherSevereType::BlowingDust => "blowing_dust",
9212            WeatherSevereType::HardFreeze => "hard_freeze",
9213            WeatherSevereType::Freeze => "freeze",
9214            WeatherSevereType::Frost => "frost",
9215            WeatherSevereType::FireWeather => "fire_weather",
9216            WeatherSevereType::Flood => "flood",
9217            WeatherSevereType::RipTide => "rip_tide",
9218            WeatherSevereType::HighSurf => "high_surf",
9219            WeatherSevereType::Smog => "smog",
9220            WeatherSevereType::AirQuality => "air_quality",
9221            WeatherSevereType::BriskWind => "brisk_wind",
9222            WeatherSevereType::AirStagnation => "air_stagnation",
9223            WeatherSevereType::LowWater => "low_water",
9224            WeatherSevereType::Hydrological => "hydrological",
9225            WeatherSevereType::SpecialWeather => "special_weather",
9226        }
9227    }
9228
9229    /// Try to construct from the underlying numeric value.
9230    pub fn from_value(value: u8) -> Option<Self> {
9231        match value {
9232            0 => Some(WeatherSevereType::Unspecified),
9233            1 => Some(WeatherSevereType::Tornado),
9234            2 => Some(WeatherSevereType::Tsunami),
9235            3 => Some(WeatherSevereType::Hurricane),
9236            4 => Some(WeatherSevereType::ExtremeWind),
9237            5 => Some(WeatherSevereType::Typhoon),
9238            6 => Some(WeatherSevereType::InlandHurricane),
9239            7 => Some(WeatherSevereType::HurricaneForceWind),
9240            8 => Some(WeatherSevereType::Waterspout),
9241            9 => Some(WeatherSevereType::SevereThunderstorm),
9242            10 => Some(WeatherSevereType::WreckhouseWinds),
9243            11 => Some(WeatherSevereType::LesSuetesWind),
9244            12 => Some(WeatherSevereType::Avalanche),
9245            13 => Some(WeatherSevereType::FlashFlood),
9246            14 => Some(WeatherSevereType::TropicalStorm),
9247            15 => Some(WeatherSevereType::InlandTropicalStorm),
9248            16 => Some(WeatherSevereType::Blizzard),
9249            17 => Some(WeatherSevereType::IceStorm),
9250            18 => Some(WeatherSevereType::FreezingRain),
9251            19 => Some(WeatherSevereType::DebrisFlow),
9252            20 => Some(WeatherSevereType::FlashFreeze),
9253            21 => Some(WeatherSevereType::DustStorm),
9254            22 => Some(WeatherSevereType::HighWind),
9255            23 => Some(WeatherSevereType::WinterStorm),
9256            24 => Some(WeatherSevereType::HeavyFreezingSpray),
9257            25 => Some(WeatherSevereType::ExtremeCold),
9258            26 => Some(WeatherSevereType::WindChill),
9259            27 => Some(WeatherSevereType::ColdWave),
9260            28 => Some(WeatherSevereType::HeavySnowAlert),
9261            29 => Some(WeatherSevereType::LakeEffectBlowingSnow),
9262            30 => Some(WeatherSevereType::SnowSquall),
9263            31 => Some(WeatherSevereType::LakeEffectSnow),
9264            32 => Some(WeatherSevereType::WinterWeather),
9265            33 => Some(WeatherSevereType::Sleet),
9266            34 => Some(WeatherSevereType::Snowfall),
9267            35 => Some(WeatherSevereType::SnowAndBlowingSnow),
9268            36 => Some(WeatherSevereType::BlowingSnow),
9269            37 => Some(WeatherSevereType::SnowAlert),
9270            38 => Some(WeatherSevereType::ArcticOutflow),
9271            39 => Some(WeatherSevereType::FreezingDrizzle),
9272            40 => Some(WeatherSevereType::Storm),
9273            41 => Some(WeatherSevereType::StormSurge),
9274            42 => Some(WeatherSevereType::Rainfall),
9275            43 => Some(WeatherSevereType::ArealFlood),
9276            44 => Some(WeatherSevereType::CoastalFlood),
9277            45 => Some(WeatherSevereType::LakeshoreFlood),
9278            46 => Some(WeatherSevereType::ExcessiveHeat),
9279            47 => Some(WeatherSevereType::Heat),
9280            48 => Some(WeatherSevereType::Weather),
9281            49 => Some(WeatherSevereType::HighHeatAndHumidity),
9282            50 => Some(WeatherSevereType::HumidexAndHealth),
9283            51 => Some(WeatherSevereType::Humidex),
9284            52 => Some(WeatherSevereType::Gale),
9285            53 => Some(WeatherSevereType::FreezingSpray),
9286            54 => Some(WeatherSevereType::SpecialMarine),
9287            55 => Some(WeatherSevereType::Squall),
9288            56 => Some(WeatherSevereType::StrongWind),
9289            57 => Some(WeatherSevereType::LakeWind),
9290            58 => Some(WeatherSevereType::MarineWeather),
9291            59 => Some(WeatherSevereType::Wind),
9292            60 => Some(WeatherSevereType::SmallCraftHazardousSeas),
9293            61 => Some(WeatherSevereType::HazardousSeas),
9294            62 => Some(WeatherSevereType::SmallCraft),
9295            63 => Some(WeatherSevereType::SmallCraftWinds),
9296            64 => Some(WeatherSevereType::SmallCraftRoughBar),
9297            65 => Some(WeatherSevereType::HighWaterLevel),
9298            66 => Some(WeatherSevereType::Ashfall),
9299            67 => Some(WeatherSevereType::FreezingFog),
9300            68 => Some(WeatherSevereType::DenseFog),
9301            69 => Some(WeatherSevereType::DenseSmoke),
9302            70 => Some(WeatherSevereType::BlowingDust),
9303            71 => Some(WeatherSevereType::HardFreeze),
9304            72 => Some(WeatherSevereType::Freeze),
9305            73 => Some(WeatherSevereType::Frost),
9306            74 => Some(WeatherSevereType::FireWeather),
9307            75 => Some(WeatherSevereType::Flood),
9308            76 => Some(WeatherSevereType::RipTide),
9309            77 => Some(WeatherSevereType::HighSurf),
9310            78 => Some(WeatherSevereType::Smog),
9311            79 => Some(WeatherSevereType::AirQuality),
9312            80 => Some(WeatherSevereType::BriskWind),
9313            81 => Some(WeatherSevereType::AirStagnation),
9314            82 => Some(WeatherSevereType::LowWater),
9315            83 => Some(WeatherSevereType::Hydrological),
9316            84 => Some(WeatherSevereType::SpecialWeather),
9317            _ => None,
9318        }
9319    }
9320
9321    /// Try to construct from the snake-case canonical name.
9322    pub fn from_str(name: &str) -> Option<Self> {
9323        match name {
9324            "unspecified" => Some(WeatherSevereType::Unspecified),
9325            "tornado" => Some(WeatherSevereType::Tornado),
9326            "tsunami" => Some(WeatherSevereType::Tsunami),
9327            "hurricane" => Some(WeatherSevereType::Hurricane),
9328            "extreme_wind" => Some(WeatherSevereType::ExtremeWind),
9329            "typhoon" => Some(WeatherSevereType::Typhoon),
9330            "inland_hurricane" => Some(WeatherSevereType::InlandHurricane),
9331            "hurricane_force_wind" => Some(WeatherSevereType::HurricaneForceWind),
9332            "waterspout" => Some(WeatherSevereType::Waterspout),
9333            "severe_thunderstorm" => Some(WeatherSevereType::SevereThunderstorm),
9334            "wreckhouse_winds" => Some(WeatherSevereType::WreckhouseWinds),
9335            "les_suetes_wind" => Some(WeatherSevereType::LesSuetesWind),
9336            "avalanche" => Some(WeatherSevereType::Avalanche),
9337            "flash_flood" => Some(WeatherSevereType::FlashFlood),
9338            "tropical_storm" => Some(WeatherSevereType::TropicalStorm),
9339            "inland_tropical_storm" => Some(WeatherSevereType::InlandTropicalStorm),
9340            "blizzard" => Some(WeatherSevereType::Blizzard),
9341            "ice_storm" => Some(WeatherSevereType::IceStorm),
9342            "freezing_rain" => Some(WeatherSevereType::FreezingRain),
9343            "debris_flow" => Some(WeatherSevereType::DebrisFlow),
9344            "flash_freeze" => Some(WeatherSevereType::FlashFreeze),
9345            "dust_storm" => Some(WeatherSevereType::DustStorm),
9346            "high_wind" => Some(WeatherSevereType::HighWind),
9347            "winter_storm" => Some(WeatherSevereType::WinterStorm),
9348            "heavy_freezing_spray" => Some(WeatherSevereType::HeavyFreezingSpray),
9349            "extreme_cold" => Some(WeatherSevereType::ExtremeCold),
9350            "wind_chill" => Some(WeatherSevereType::WindChill),
9351            "cold_wave" => Some(WeatherSevereType::ColdWave),
9352            "heavy_snow_alert" => Some(WeatherSevereType::HeavySnowAlert),
9353            "lake_effect_blowing_snow" => Some(WeatherSevereType::LakeEffectBlowingSnow),
9354            "snow_squall" => Some(WeatherSevereType::SnowSquall),
9355            "lake_effect_snow" => Some(WeatherSevereType::LakeEffectSnow),
9356            "winter_weather" => Some(WeatherSevereType::WinterWeather),
9357            "sleet" => Some(WeatherSevereType::Sleet),
9358            "snowfall" => Some(WeatherSevereType::Snowfall),
9359            "snow_and_blowing_snow" => Some(WeatherSevereType::SnowAndBlowingSnow),
9360            "blowing_snow" => Some(WeatherSevereType::BlowingSnow),
9361            "snow_alert" => Some(WeatherSevereType::SnowAlert),
9362            "arctic_outflow" => Some(WeatherSevereType::ArcticOutflow),
9363            "freezing_drizzle" => Some(WeatherSevereType::FreezingDrizzle),
9364            "storm" => Some(WeatherSevereType::Storm),
9365            "storm_surge" => Some(WeatherSevereType::StormSurge),
9366            "rainfall" => Some(WeatherSevereType::Rainfall),
9367            "areal_flood" => Some(WeatherSevereType::ArealFlood),
9368            "coastal_flood" => Some(WeatherSevereType::CoastalFlood),
9369            "lakeshore_flood" => Some(WeatherSevereType::LakeshoreFlood),
9370            "excessive_heat" => Some(WeatherSevereType::ExcessiveHeat),
9371            "heat" => Some(WeatherSevereType::Heat),
9372            "weather" => Some(WeatherSevereType::Weather),
9373            "high_heat_and_humidity" => Some(WeatherSevereType::HighHeatAndHumidity),
9374            "humidex_and_health" => Some(WeatherSevereType::HumidexAndHealth),
9375            "humidex" => Some(WeatherSevereType::Humidex),
9376            "gale" => Some(WeatherSevereType::Gale),
9377            "freezing_spray" => Some(WeatherSevereType::FreezingSpray),
9378            "special_marine" => Some(WeatherSevereType::SpecialMarine),
9379            "squall" => Some(WeatherSevereType::Squall),
9380            "strong_wind" => Some(WeatherSevereType::StrongWind),
9381            "lake_wind" => Some(WeatherSevereType::LakeWind),
9382            "marine_weather" => Some(WeatherSevereType::MarineWeather),
9383            "wind" => Some(WeatherSevereType::Wind),
9384            "small_craft_hazardous_seas" => Some(WeatherSevereType::SmallCraftHazardousSeas),
9385            "hazardous_seas" => Some(WeatherSevereType::HazardousSeas),
9386            "small_craft" => Some(WeatherSevereType::SmallCraft),
9387            "small_craft_winds" => Some(WeatherSevereType::SmallCraftWinds),
9388            "small_craft_rough_bar" => Some(WeatherSevereType::SmallCraftRoughBar),
9389            "high_water_level" => Some(WeatherSevereType::HighWaterLevel),
9390            "ashfall" => Some(WeatherSevereType::Ashfall),
9391            "freezing_fog" => Some(WeatherSevereType::FreezingFog),
9392            "dense_fog" => Some(WeatherSevereType::DenseFog),
9393            "dense_smoke" => Some(WeatherSevereType::DenseSmoke),
9394            "blowing_dust" => Some(WeatherSevereType::BlowingDust),
9395            "hard_freeze" => Some(WeatherSevereType::HardFreeze),
9396            "freeze" => Some(WeatherSevereType::Freeze),
9397            "frost" => Some(WeatherSevereType::Frost),
9398            "fire_weather" => Some(WeatherSevereType::FireWeather),
9399            "flood" => Some(WeatherSevereType::Flood),
9400            "rip_tide" => Some(WeatherSevereType::RipTide),
9401            "high_surf" => Some(WeatherSevereType::HighSurf),
9402            "smog" => Some(WeatherSevereType::Smog),
9403            "air_quality" => Some(WeatherSevereType::AirQuality),
9404            "brisk_wind" => Some(WeatherSevereType::BriskWind),
9405            "air_stagnation" => Some(WeatherSevereType::AirStagnation),
9406            "low_water" => Some(WeatherSevereType::LowWater),
9407            "hydrological" => Some(WeatherSevereType::Hydrological),
9408            "special_weather" => Some(WeatherSevereType::SpecialWeather),
9409            _ => None,
9410        }
9411    }
9412}
9413
9414#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
9415#[repr(u8)]
9416#[non_exhaustive]
9417pub enum StrokeType {
9418    NoEvent = 0,
9419    Other = 1,
9420    Serve = 2,
9421    Forehand = 3,
9422    Backhand = 4,
9423    Smash = 5,
9424}
9425
9426impl StrokeType {
9427    /// Snake-case canonical name from Profile.xlsx.
9428    pub fn as_str(&self) -> &'static str {
9429        match self {
9430            StrokeType::NoEvent => "no_event",
9431            StrokeType::Other => "other",
9432            StrokeType::Serve => "serve",
9433            StrokeType::Forehand => "forehand",
9434            StrokeType::Backhand => "backhand",
9435            StrokeType::Smash => "smash",
9436        }
9437    }
9438
9439    /// Try to construct from the underlying numeric value.
9440    pub fn from_value(value: u8) -> Option<Self> {
9441        match value {
9442            0 => Some(StrokeType::NoEvent),
9443            1 => Some(StrokeType::Other),
9444            2 => Some(StrokeType::Serve),
9445            3 => Some(StrokeType::Forehand),
9446            4 => Some(StrokeType::Backhand),
9447            5 => Some(StrokeType::Smash),
9448            _ => None,
9449        }
9450    }
9451
9452    /// Try to construct from the snake-case canonical name.
9453    pub fn from_str(name: &str) -> Option<Self> {
9454        match name {
9455            "no_event" => Some(StrokeType::NoEvent),
9456            "other" => Some(StrokeType::Other),
9457            "serve" => Some(StrokeType::Serve),
9458            "forehand" => Some(StrokeType::Forehand),
9459            "backhand" => Some(StrokeType::Backhand),
9460            "smash" => Some(StrokeType::Smash),
9461            _ => None,
9462        }
9463    }
9464}
9465
9466#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
9467#[repr(u8)]
9468#[non_exhaustive]
9469pub enum BodyLocation {
9470    LeftLeg = 0,
9471    LeftCalf = 1,
9472    LeftShin = 2,
9473    LeftHamstring = 3,
9474    LeftQuad = 4,
9475    LeftGlute = 5,
9476    RightLeg = 6,
9477    RightCalf = 7,
9478    RightShin = 8,
9479    RightHamstring = 9,
9480    RightQuad = 10,
9481    RightGlute = 11,
9482    TorsoBack = 12,
9483    LeftLowerBack = 13,
9484    LeftUpperBack = 14,
9485    RightLowerBack = 15,
9486    RightUpperBack = 16,
9487    TorsoFront = 17,
9488    LeftAbdomen = 18,
9489    LeftChest = 19,
9490    RightAbdomen = 20,
9491    RightChest = 21,
9492    LeftArm = 22,
9493    LeftShoulder = 23,
9494    LeftBicep = 24,
9495    LeftTricep = 25,
9496    LeftBrachioradialis = 26,
9497    LeftForearmExtensors = 27,
9498    RightArm = 28,
9499    RightShoulder = 29,
9500    RightBicep = 30,
9501    RightTricep = 31,
9502    RightBrachioradialis = 32,
9503    RightForearmExtensors = 33,
9504    Neck = 34,
9505    Throat = 35,
9506    WaistMidBack = 36,
9507    WaistFront = 37,
9508    WaistLeft = 38,
9509    WaistRight = 39,
9510}
9511
9512impl BodyLocation {
9513    /// Snake-case canonical name from Profile.xlsx.
9514    pub fn as_str(&self) -> &'static str {
9515        match self {
9516            BodyLocation::LeftLeg => "left_leg",
9517            BodyLocation::LeftCalf => "left_calf",
9518            BodyLocation::LeftShin => "left_shin",
9519            BodyLocation::LeftHamstring => "left_hamstring",
9520            BodyLocation::LeftQuad => "left_quad",
9521            BodyLocation::LeftGlute => "left_glute",
9522            BodyLocation::RightLeg => "right_leg",
9523            BodyLocation::RightCalf => "right_calf",
9524            BodyLocation::RightShin => "right_shin",
9525            BodyLocation::RightHamstring => "right_hamstring",
9526            BodyLocation::RightQuad => "right_quad",
9527            BodyLocation::RightGlute => "right_glute",
9528            BodyLocation::TorsoBack => "torso_back",
9529            BodyLocation::LeftLowerBack => "left_lower_back",
9530            BodyLocation::LeftUpperBack => "left_upper_back",
9531            BodyLocation::RightLowerBack => "right_lower_back",
9532            BodyLocation::RightUpperBack => "right_upper_back",
9533            BodyLocation::TorsoFront => "torso_front",
9534            BodyLocation::LeftAbdomen => "left_abdomen",
9535            BodyLocation::LeftChest => "left_chest",
9536            BodyLocation::RightAbdomen => "right_abdomen",
9537            BodyLocation::RightChest => "right_chest",
9538            BodyLocation::LeftArm => "left_arm",
9539            BodyLocation::LeftShoulder => "left_shoulder",
9540            BodyLocation::LeftBicep => "left_bicep",
9541            BodyLocation::LeftTricep => "left_tricep",
9542            BodyLocation::LeftBrachioradialis => "left_brachioradialis",
9543            BodyLocation::LeftForearmExtensors => "left_forearm_extensors",
9544            BodyLocation::RightArm => "right_arm",
9545            BodyLocation::RightShoulder => "right_shoulder",
9546            BodyLocation::RightBicep => "right_bicep",
9547            BodyLocation::RightTricep => "right_tricep",
9548            BodyLocation::RightBrachioradialis => "right_brachioradialis",
9549            BodyLocation::RightForearmExtensors => "right_forearm_extensors",
9550            BodyLocation::Neck => "neck",
9551            BodyLocation::Throat => "throat",
9552            BodyLocation::WaistMidBack => "waist_mid_back",
9553            BodyLocation::WaistFront => "waist_front",
9554            BodyLocation::WaistLeft => "waist_left",
9555            BodyLocation::WaistRight => "waist_right",
9556        }
9557    }
9558
9559    /// Try to construct from the underlying numeric value.
9560    pub fn from_value(value: u8) -> Option<Self> {
9561        match value {
9562            0 => Some(BodyLocation::LeftLeg),
9563            1 => Some(BodyLocation::LeftCalf),
9564            2 => Some(BodyLocation::LeftShin),
9565            3 => Some(BodyLocation::LeftHamstring),
9566            4 => Some(BodyLocation::LeftQuad),
9567            5 => Some(BodyLocation::LeftGlute),
9568            6 => Some(BodyLocation::RightLeg),
9569            7 => Some(BodyLocation::RightCalf),
9570            8 => Some(BodyLocation::RightShin),
9571            9 => Some(BodyLocation::RightHamstring),
9572            10 => Some(BodyLocation::RightQuad),
9573            11 => Some(BodyLocation::RightGlute),
9574            12 => Some(BodyLocation::TorsoBack),
9575            13 => Some(BodyLocation::LeftLowerBack),
9576            14 => Some(BodyLocation::LeftUpperBack),
9577            15 => Some(BodyLocation::RightLowerBack),
9578            16 => Some(BodyLocation::RightUpperBack),
9579            17 => Some(BodyLocation::TorsoFront),
9580            18 => Some(BodyLocation::LeftAbdomen),
9581            19 => Some(BodyLocation::LeftChest),
9582            20 => Some(BodyLocation::RightAbdomen),
9583            21 => Some(BodyLocation::RightChest),
9584            22 => Some(BodyLocation::LeftArm),
9585            23 => Some(BodyLocation::LeftShoulder),
9586            24 => Some(BodyLocation::LeftBicep),
9587            25 => Some(BodyLocation::LeftTricep),
9588            26 => Some(BodyLocation::LeftBrachioradialis),
9589            27 => Some(BodyLocation::LeftForearmExtensors),
9590            28 => Some(BodyLocation::RightArm),
9591            29 => Some(BodyLocation::RightShoulder),
9592            30 => Some(BodyLocation::RightBicep),
9593            31 => Some(BodyLocation::RightTricep),
9594            32 => Some(BodyLocation::RightBrachioradialis),
9595            33 => Some(BodyLocation::RightForearmExtensors),
9596            34 => Some(BodyLocation::Neck),
9597            35 => Some(BodyLocation::Throat),
9598            36 => Some(BodyLocation::WaistMidBack),
9599            37 => Some(BodyLocation::WaistFront),
9600            38 => Some(BodyLocation::WaistLeft),
9601            39 => Some(BodyLocation::WaistRight),
9602            _ => None,
9603        }
9604    }
9605
9606    /// Try to construct from the snake-case canonical name.
9607    pub fn from_str(name: &str) -> Option<Self> {
9608        match name {
9609            "left_leg" => Some(BodyLocation::LeftLeg),
9610            "left_calf" => Some(BodyLocation::LeftCalf),
9611            "left_shin" => Some(BodyLocation::LeftShin),
9612            "left_hamstring" => Some(BodyLocation::LeftHamstring),
9613            "left_quad" => Some(BodyLocation::LeftQuad),
9614            "left_glute" => Some(BodyLocation::LeftGlute),
9615            "right_leg" => Some(BodyLocation::RightLeg),
9616            "right_calf" => Some(BodyLocation::RightCalf),
9617            "right_shin" => Some(BodyLocation::RightShin),
9618            "right_hamstring" => Some(BodyLocation::RightHamstring),
9619            "right_quad" => Some(BodyLocation::RightQuad),
9620            "right_glute" => Some(BodyLocation::RightGlute),
9621            "torso_back" => Some(BodyLocation::TorsoBack),
9622            "left_lower_back" => Some(BodyLocation::LeftLowerBack),
9623            "left_upper_back" => Some(BodyLocation::LeftUpperBack),
9624            "right_lower_back" => Some(BodyLocation::RightLowerBack),
9625            "right_upper_back" => Some(BodyLocation::RightUpperBack),
9626            "torso_front" => Some(BodyLocation::TorsoFront),
9627            "left_abdomen" => Some(BodyLocation::LeftAbdomen),
9628            "left_chest" => Some(BodyLocation::LeftChest),
9629            "right_abdomen" => Some(BodyLocation::RightAbdomen),
9630            "right_chest" => Some(BodyLocation::RightChest),
9631            "left_arm" => Some(BodyLocation::LeftArm),
9632            "left_shoulder" => Some(BodyLocation::LeftShoulder),
9633            "left_bicep" => Some(BodyLocation::LeftBicep),
9634            "left_tricep" => Some(BodyLocation::LeftTricep),
9635            "left_brachioradialis" => Some(BodyLocation::LeftBrachioradialis),
9636            "left_forearm_extensors" => Some(BodyLocation::LeftForearmExtensors),
9637            "right_arm" => Some(BodyLocation::RightArm),
9638            "right_shoulder" => Some(BodyLocation::RightShoulder),
9639            "right_bicep" => Some(BodyLocation::RightBicep),
9640            "right_tricep" => Some(BodyLocation::RightTricep),
9641            "right_brachioradialis" => Some(BodyLocation::RightBrachioradialis),
9642            "right_forearm_extensors" => Some(BodyLocation::RightForearmExtensors),
9643            "neck" => Some(BodyLocation::Neck),
9644            "throat" => Some(BodyLocation::Throat),
9645            "waist_mid_back" => Some(BodyLocation::WaistMidBack),
9646            "waist_front" => Some(BodyLocation::WaistFront),
9647            "waist_left" => Some(BodyLocation::WaistLeft),
9648            "waist_right" => Some(BodyLocation::WaistRight),
9649            _ => None,
9650        }
9651    }
9652}
9653
9654#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
9655#[repr(u8)]
9656#[non_exhaustive]
9657pub enum SegmentLapStatus {
9658    End = 0,
9659    Fail = 1,
9660}
9661
9662impl SegmentLapStatus {
9663    /// Snake-case canonical name from Profile.xlsx.
9664    pub fn as_str(&self) -> &'static str {
9665        match self {
9666            SegmentLapStatus::End => "end",
9667            SegmentLapStatus::Fail => "fail",
9668        }
9669    }
9670
9671    /// Try to construct from the underlying numeric value.
9672    pub fn from_value(value: u8) -> Option<Self> {
9673        match value {
9674            0 => Some(SegmentLapStatus::End),
9675            1 => Some(SegmentLapStatus::Fail),
9676            _ => None,
9677        }
9678    }
9679
9680    /// Try to construct from the snake-case canonical name.
9681    pub fn from_str(name: &str) -> Option<Self> {
9682        match name {
9683            "end" => Some(SegmentLapStatus::End),
9684            "fail" => Some(SegmentLapStatus::Fail),
9685            _ => None,
9686        }
9687    }
9688}
9689
9690#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
9691#[repr(u8)]
9692#[non_exhaustive]
9693pub enum SegmentLeaderboardType {
9694    Overall = 0,
9695    PersonalBest = 1,
9696    Connections = 2,
9697    Group = 3,
9698    Challenger = 4,
9699    Kom = 5,
9700    Qom = 6,
9701    Pr = 7,
9702    Goal = 8,
9703    Carrot = 9,
9704    ClubLeader = 10,
9705    Rival = 11,
9706    Last = 12,
9707    RecentBest = 13,
9708    CourseRecord = 14,
9709}
9710
9711impl SegmentLeaderboardType {
9712    /// Snake-case canonical name from Profile.xlsx.
9713    pub fn as_str(&self) -> &'static str {
9714        match self {
9715            SegmentLeaderboardType::Overall => "overall",
9716            SegmentLeaderboardType::PersonalBest => "personal_best",
9717            SegmentLeaderboardType::Connections => "connections",
9718            SegmentLeaderboardType::Group => "group",
9719            SegmentLeaderboardType::Challenger => "challenger",
9720            SegmentLeaderboardType::Kom => "kom",
9721            SegmentLeaderboardType::Qom => "qom",
9722            SegmentLeaderboardType::Pr => "pr",
9723            SegmentLeaderboardType::Goal => "goal",
9724            SegmentLeaderboardType::Carrot => "carrot",
9725            SegmentLeaderboardType::ClubLeader => "club_leader",
9726            SegmentLeaderboardType::Rival => "rival",
9727            SegmentLeaderboardType::Last => "last",
9728            SegmentLeaderboardType::RecentBest => "recent_best",
9729            SegmentLeaderboardType::CourseRecord => "course_record",
9730        }
9731    }
9732
9733    /// Try to construct from the underlying numeric value.
9734    pub fn from_value(value: u8) -> Option<Self> {
9735        match value {
9736            0 => Some(SegmentLeaderboardType::Overall),
9737            1 => Some(SegmentLeaderboardType::PersonalBest),
9738            2 => Some(SegmentLeaderboardType::Connections),
9739            3 => Some(SegmentLeaderboardType::Group),
9740            4 => Some(SegmentLeaderboardType::Challenger),
9741            5 => Some(SegmentLeaderboardType::Kom),
9742            6 => Some(SegmentLeaderboardType::Qom),
9743            7 => Some(SegmentLeaderboardType::Pr),
9744            8 => Some(SegmentLeaderboardType::Goal),
9745            9 => Some(SegmentLeaderboardType::Carrot),
9746            10 => Some(SegmentLeaderboardType::ClubLeader),
9747            11 => Some(SegmentLeaderboardType::Rival),
9748            12 => Some(SegmentLeaderboardType::Last),
9749            13 => Some(SegmentLeaderboardType::RecentBest),
9750            14 => Some(SegmentLeaderboardType::CourseRecord),
9751            _ => None,
9752        }
9753    }
9754
9755    /// Try to construct from the snake-case canonical name.
9756    pub fn from_str(name: &str) -> Option<Self> {
9757        match name {
9758            "overall" => Some(SegmentLeaderboardType::Overall),
9759            "personal_best" => Some(SegmentLeaderboardType::PersonalBest),
9760            "connections" => Some(SegmentLeaderboardType::Connections),
9761            "group" => Some(SegmentLeaderboardType::Group),
9762            "challenger" => Some(SegmentLeaderboardType::Challenger),
9763            "kom" => Some(SegmentLeaderboardType::Kom),
9764            "qom" => Some(SegmentLeaderboardType::Qom),
9765            "pr" => Some(SegmentLeaderboardType::Pr),
9766            "goal" => Some(SegmentLeaderboardType::Goal),
9767            "carrot" => Some(SegmentLeaderboardType::Carrot),
9768            "club_leader" => Some(SegmentLeaderboardType::ClubLeader),
9769            "rival" => Some(SegmentLeaderboardType::Rival),
9770            "last" => Some(SegmentLeaderboardType::Last),
9771            "recent_best" => Some(SegmentLeaderboardType::RecentBest),
9772            "course_record" => Some(SegmentLeaderboardType::CourseRecord),
9773            _ => None,
9774        }
9775    }
9776}
9777
9778#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
9779#[repr(u8)]
9780#[non_exhaustive]
9781pub enum SegmentDeleteStatus {
9782    DoNotDelete = 0,
9783    DeleteOne = 1,
9784    DeleteAll = 2,
9785}
9786
9787impl SegmentDeleteStatus {
9788    /// Snake-case canonical name from Profile.xlsx.
9789    pub fn as_str(&self) -> &'static str {
9790        match self {
9791            SegmentDeleteStatus::DoNotDelete => "do_not_delete",
9792            SegmentDeleteStatus::DeleteOne => "delete_one",
9793            SegmentDeleteStatus::DeleteAll => "delete_all",
9794        }
9795    }
9796
9797    /// Try to construct from the underlying numeric value.
9798    pub fn from_value(value: u8) -> Option<Self> {
9799        match value {
9800            0 => Some(SegmentDeleteStatus::DoNotDelete),
9801            1 => Some(SegmentDeleteStatus::DeleteOne),
9802            2 => Some(SegmentDeleteStatus::DeleteAll),
9803            _ => None,
9804        }
9805    }
9806
9807    /// Try to construct from the snake-case canonical name.
9808    pub fn from_str(name: &str) -> Option<Self> {
9809        match name {
9810            "do_not_delete" => Some(SegmentDeleteStatus::DoNotDelete),
9811            "delete_one" => Some(SegmentDeleteStatus::DeleteOne),
9812            "delete_all" => Some(SegmentDeleteStatus::DeleteAll),
9813            _ => None,
9814        }
9815    }
9816}
9817
9818#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
9819#[repr(u8)]
9820#[non_exhaustive]
9821pub enum SegmentSelectionType {
9822    Starred = 0,
9823    Suggested = 1,
9824}
9825
9826impl SegmentSelectionType {
9827    /// Snake-case canonical name from Profile.xlsx.
9828    pub fn as_str(&self) -> &'static str {
9829        match self {
9830            SegmentSelectionType::Starred => "starred",
9831            SegmentSelectionType::Suggested => "suggested",
9832        }
9833    }
9834
9835    /// Try to construct from the underlying numeric value.
9836    pub fn from_value(value: u8) -> Option<Self> {
9837        match value {
9838            0 => Some(SegmentSelectionType::Starred),
9839            1 => Some(SegmentSelectionType::Suggested),
9840            _ => None,
9841        }
9842    }
9843
9844    /// Try to construct from the snake-case canonical name.
9845    pub fn from_str(name: &str) -> Option<Self> {
9846        match name {
9847            "starred" => Some(SegmentSelectionType::Starred),
9848            "suggested" => Some(SegmentSelectionType::Suggested),
9849            _ => None,
9850        }
9851    }
9852}
9853
9854#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
9855#[repr(u8)]
9856#[non_exhaustive]
9857pub enum SourceType {
9858    Ant = 0,
9859    Antplus = 1,
9860    Bluetooth = 2,
9861    BluetoothLowEnergy = 3,
9862    Wifi = 4,
9863    Local = 5,
9864}
9865
9866impl SourceType {
9867    /// Snake-case canonical name from Profile.xlsx.
9868    pub fn as_str(&self) -> &'static str {
9869        match self {
9870            SourceType::Ant => "ant",
9871            SourceType::Antplus => "antplus",
9872            SourceType::Bluetooth => "bluetooth",
9873            SourceType::BluetoothLowEnergy => "bluetooth_low_energy",
9874            SourceType::Wifi => "wifi",
9875            SourceType::Local => "local",
9876        }
9877    }
9878
9879    /// Try to construct from the underlying numeric value.
9880    pub fn from_value(value: u8) -> Option<Self> {
9881        match value {
9882            0 => Some(SourceType::Ant),
9883            1 => Some(SourceType::Antplus),
9884            2 => Some(SourceType::Bluetooth),
9885            3 => Some(SourceType::BluetoothLowEnergy),
9886            4 => Some(SourceType::Wifi),
9887            5 => Some(SourceType::Local),
9888            _ => None,
9889        }
9890    }
9891
9892    /// Try to construct from the snake-case canonical name.
9893    pub fn from_str(name: &str) -> Option<Self> {
9894        match name {
9895            "ant" => Some(SourceType::Ant),
9896            "antplus" => Some(SourceType::Antplus),
9897            "bluetooth" => Some(SourceType::Bluetooth),
9898            "bluetooth_low_energy" => Some(SourceType::BluetoothLowEnergy),
9899            "wifi" => Some(SourceType::Wifi),
9900            "local" => Some(SourceType::Local),
9901            _ => None,
9902        }
9903    }
9904}
9905
9906#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
9907#[repr(u8)]
9908#[non_exhaustive]
9909pub enum LocalDeviceType {
9910    Gps = 0,
9911    Glonass = 1,
9912    GpsGlonass = 2,
9913    Accelerometer = 3,
9914    Barometer = 4,
9915    Temperature = 5,
9916    Whr = 10,
9917    SensorHub = 12,
9918}
9919
9920impl LocalDeviceType {
9921    /// Snake-case canonical name from Profile.xlsx.
9922    pub fn as_str(&self) -> &'static str {
9923        match self {
9924            LocalDeviceType::Gps => "gps",
9925            LocalDeviceType::Glonass => "glonass",
9926            LocalDeviceType::GpsGlonass => "gps_glonass",
9927            LocalDeviceType::Accelerometer => "accelerometer",
9928            LocalDeviceType::Barometer => "barometer",
9929            LocalDeviceType::Temperature => "temperature",
9930            LocalDeviceType::Whr => "whr",
9931            LocalDeviceType::SensorHub => "sensor_hub",
9932        }
9933    }
9934
9935    /// Try to construct from the underlying numeric value.
9936    pub fn from_value(value: u8) -> Option<Self> {
9937        match value {
9938            0 => Some(LocalDeviceType::Gps),
9939            1 => Some(LocalDeviceType::Glonass),
9940            2 => Some(LocalDeviceType::GpsGlonass),
9941            3 => Some(LocalDeviceType::Accelerometer),
9942            4 => Some(LocalDeviceType::Barometer),
9943            5 => Some(LocalDeviceType::Temperature),
9944            10 => Some(LocalDeviceType::Whr),
9945            12 => Some(LocalDeviceType::SensorHub),
9946            _ => None,
9947        }
9948    }
9949
9950    /// Try to construct from the snake-case canonical name.
9951    pub fn from_str(name: &str) -> Option<Self> {
9952        match name {
9953            "gps" => Some(LocalDeviceType::Gps),
9954            "glonass" => Some(LocalDeviceType::Glonass),
9955            "gps_glonass" => Some(LocalDeviceType::GpsGlonass),
9956            "accelerometer" => Some(LocalDeviceType::Accelerometer),
9957            "barometer" => Some(LocalDeviceType::Barometer),
9958            "temperature" => Some(LocalDeviceType::Temperature),
9959            "whr" => Some(LocalDeviceType::Whr),
9960            "sensor_hub" => Some(LocalDeviceType::SensorHub),
9961            _ => None,
9962        }
9963    }
9964}
9965
9966#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
9967#[repr(u8)]
9968#[non_exhaustive]
9969pub enum BleDeviceType {
9970    ConnectedGps = 0,
9971    HeartRate = 1,
9972    BikePower = 2,
9973    BikeSpeedCadence = 3,
9974    BikeSpeed = 4,
9975    BikeCadence = 5,
9976    Footpod = 6,
9977    BikeTrainer = 7,
9978}
9979
9980impl BleDeviceType {
9981    /// Snake-case canonical name from Profile.xlsx.
9982    pub fn as_str(&self) -> &'static str {
9983        match self {
9984            BleDeviceType::ConnectedGps => "connected_gps",
9985            BleDeviceType::HeartRate => "heart_rate",
9986            BleDeviceType::BikePower => "bike_power",
9987            BleDeviceType::BikeSpeedCadence => "bike_speed_cadence",
9988            BleDeviceType::BikeSpeed => "bike_speed",
9989            BleDeviceType::BikeCadence => "bike_cadence",
9990            BleDeviceType::Footpod => "footpod",
9991            BleDeviceType::BikeTrainer => "bike_trainer",
9992        }
9993    }
9994
9995    /// Try to construct from the underlying numeric value.
9996    pub fn from_value(value: u8) -> Option<Self> {
9997        match value {
9998            0 => Some(BleDeviceType::ConnectedGps),
9999            1 => Some(BleDeviceType::HeartRate),
10000            2 => Some(BleDeviceType::BikePower),
10001            3 => Some(BleDeviceType::BikeSpeedCadence),
10002            4 => Some(BleDeviceType::BikeSpeed),
10003            5 => Some(BleDeviceType::BikeCadence),
10004            6 => Some(BleDeviceType::Footpod),
10005            7 => Some(BleDeviceType::BikeTrainer),
10006            _ => None,
10007        }
10008    }
10009
10010    /// Try to construct from the snake-case canonical name.
10011    pub fn from_str(name: &str) -> Option<Self> {
10012        match name {
10013            "connected_gps" => Some(BleDeviceType::ConnectedGps),
10014            "heart_rate" => Some(BleDeviceType::HeartRate),
10015            "bike_power" => Some(BleDeviceType::BikePower),
10016            "bike_speed_cadence" => Some(BleDeviceType::BikeSpeedCadence),
10017            "bike_speed" => Some(BleDeviceType::BikeSpeed),
10018            "bike_cadence" => Some(BleDeviceType::BikeCadence),
10019            "footpod" => Some(BleDeviceType::Footpod),
10020            "bike_trainer" => Some(BleDeviceType::BikeTrainer),
10021            _ => None,
10022        }
10023    }
10024}
10025
10026#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
10027#[repr(u32)]
10028#[non_exhaustive]
10029pub enum AntChannelId {
10030    AntExtendedDeviceNumberUpperNibble = 4026531840,
10031    AntTransmissionTypeLowerNibble = 251658240,
10032    AntDeviceType = 16711680,
10033    AntDeviceNumber = 65535,
10034}
10035
10036impl AntChannelId {
10037    /// Snake-case canonical name from Profile.xlsx.
10038    pub fn as_str(&self) -> &'static str {
10039        match self {
10040            AntChannelId::AntExtendedDeviceNumberUpperNibble => {
10041                "ant_extended_device_number_upper_nibble"
10042            }
10043            AntChannelId::AntTransmissionTypeLowerNibble => "ant_transmission_type_lower_nibble",
10044            AntChannelId::AntDeviceType => "ant_device_type",
10045            AntChannelId::AntDeviceNumber => "ant_device_number",
10046        }
10047    }
10048
10049    /// Try to construct from the underlying numeric value.
10050    pub fn from_value(value: u32) -> Option<Self> {
10051        match value {
10052            4026531840 => Some(AntChannelId::AntExtendedDeviceNumberUpperNibble),
10053            251658240 => Some(AntChannelId::AntTransmissionTypeLowerNibble),
10054            16711680 => Some(AntChannelId::AntDeviceType),
10055            65535 => Some(AntChannelId::AntDeviceNumber),
10056            _ => None,
10057        }
10058    }
10059
10060    /// Try to construct from the snake-case canonical name.
10061    pub fn from_str(name: &str) -> Option<Self> {
10062        match name {
10063            "ant_extended_device_number_upper_nibble" => {
10064                Some(AntChannelId::AntExtendedDeviceNumberUpperNibble)
10065            }
10066            "ant_transmission_type_lower_nibble" => {
10067                Some(AntChannelId::AntTransmissionTypeLowerNibble)
10068            }
10069            "ant_device_type" => Some(AntChannelId::AntDeviceType),
10070            "ant_device_number" => Some(AntChannelId::AntDeviceNumber),
10071            _ => None,
10072        }
10073    }
10074}
10075
10076#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
10077#[repr(u8)]
10078#[non_exhaustive]
10079pub enum DisplayOrientation {
10080    Auto = 0,
10081    Portrait = 1,
10082    Landscape = 2,
10083    PortraitFlipped = 3,
10084    LandscapeFlipped = 4,
10085}
10086
10087impl DisplayOrientation {
10088    /// Snake-case canonical name from Profile.xlsx.
10089    pub fn as_str(&self) -> &'static str {
10090        match self {
10091            DisplayOrientation::Auto => "auto",
10092            DisplayOrientation::Portrait => "portrait",
10093            DisplayOrientation::Landscape => "landscape",
10094            DisplayOrientation::PortraitFlipped => "portrait_flipped",
10095            DisplayOrientation::LandscapeFlipped => "landscape_flipped",
10096        }
10097    }
10098
10099    /// Try to construct from the underlying numeric value.
10100    pub fn from_value(value: u8) -> Option<Self> {
10101        match value {
10102            0 => Some(DisplayOrientation::Auto),
10103            1 => Some(DisplayOrientation::Portrait),
10104            2 => Some(DisplayOrientation::Landscape),
10105            3 => Some(DisplayOrientation::PortraitFlipped),
10106            4 => Some(DisplayOrientation::LandscapeFlipped),
10107            _ => None,
10108        }
10109    }
10110
10111    /// Try to construct from the snake-case canonical name.
10112    pub fn from_str(name: &str) -> Option<Self> {
10113        match name {
10114            "auto" => Some(DisplayOrientation::Auto),
10115            "portrait" => Some(DisplayOrientation::Portrait),
10116            "landscape" => Some(DisplayOrientation::Landscape),
10117            "portrait_flipped" => Some(DisplayOrientation::PortraitFlipped),
10118            "landscape_flipped" => Some(DisplayOrientation::LandscapeFlipped),
10119            _ => None,
10120        }
10121    }
10122}
10123
10124#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
10125#[repr(u8)]
10126#[non_exhaustive]
10127pub enum WorkoutEquipment {
10128    None = 0,
10129    SwimFins = 1,
10130    SwimKickboard = 2,
10131    SwimPaddles = 3,
10132    SwimPullBuoy = 4,
10133    SwimSnorkel = 5,
10134}
10135
10136impl WorkoutEquipment {
10137    /// Snake-case canonical name from Profile.xlsx.
10138    pub fn as_str(&self) -> &'static str {
10139        match self {
10140            WorkoutEquipment::None => "none",
10141            WorkoutEquipment::SwimFins => "swim_fins",
10142            WorkoutEquipment::SwimKickboard => "swim_kickboard",
10143            WorkoutEquipment::SwimPaddles => "swim_paddles",
10144            WorkoutEquipment::SwimPullBuoy => "swim_pull_buoy",
10145            WorkoutEquipment::SwimSnorkel => "swim_snorkel",
10146        }
10147    }
10148
10149    /// Try to construct from the underlying numeric value.
10150    pub fn from_value(value: u8) -> Option<Self> {
10151        match value {
10152            0 => Some(WorkoutEquipment::None),
10153            1 => Some(WorkoutEquipment::SwimFins),
10154            2 => Some(WorkoutEquipment::SwimKickboard),
10155            3 => Some(WorkoutEquipment::SwimPaddles),
10156            4 => Some(WorkoutEquipment::SwimPullBuoy),
10157            5 => Some(WorkoutEquipment::SwimSnorkel),
10158            _ => None,
10159        }
10160    }
10161
10162    /// Try to construct from the snake-case canonical name.
10163    pub fn from_str(name: &str) -> Option<Self> {
10164        match name {
10165            "none" => Some(WorkoutEquipment::None),
10166            "swim_fins" => Some(WorkoutEquipment::SwimFins),
10167            "swim_kickboard" => Some(WorkoutEquipment::SwimKickboard),
10168            "swim_paddles" => Some(WorkoutEquipment::SwimPaddles),
10169            "swim_pull_buoy" => Some(WorkoutEquipment::SwimPullBuoy),
10170            "swim_snorkel" => Some(WorkoutEquipment::SwimSnorkel),
10171            _ => None,
10172        }
10173    }
10174}
10175
10176#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
10177#[repr(u8)]
10178#[non_exhaustive]
10179pub enum WatchfaceMode {
10180    Digital = 0,
10181    Analog = 1,
10182    ConnectIq = 2,
10183    Disabled = 3,
10184}
10185
10186impl WatchfaceMode {
10187    /// Snake-case canonical name from Profile.xlsx.
10188    pub fn as_str(&self) -> &'static str {
10189        match self {
10190            WatchfaceMode::Digital => "digital",
10191            WatchfaceMode::Analog => "analog",
10192            WatchfaceMode::ConnectIq => "connect_iq",
10193            WatchfaceMode::Disabled => "disabled",
10194        }
10195    }
10196
10197    /// Try to construct from the underlying numeric value.
10198    pub fn from_value(value: u8) -> Option<Self> {
10199        match value {
10200            0 => Some(WatchfaceMode::Digital),
10201            1 => Some(WatchfaceMode::Analog),
10202            2 => Some(WatchfaceMode::ConnectIq),
10203            3 => Some(WatchfaceMode::Disabled),
10204            _ => None,
10205        }
10206    }
10207
10208    /// Try to construct from the snake-case canonical name.
10209    pub fn from_str(name: &str) -> Option<Self> {
10210        match name {
10211            "digital" => Some(WatchfaceMode::Digital),
10212            "analog" => Some(WatchfaceMode::Analog),
10213            "connect_iq" => Some(WatchfaceMode::ConnectIq),
10214            "disabled" => Some(WatchfaceMode::Disabled),
10215            _ => None,
10216        }
10217    }
10218}
10219
10220#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
10221#[repr(u8)]
10222#[non_exhaustive]
10223pub enum DigitalWatchfaceLayout {
10224    Traditional = 0,
10225    Modern = 1,
10226    Bold = 2,
10227}
10228
10229impl DigitalWatchfaceLayout {
10230    /// Snake-case canonical name from Profile.xlsx.
10231    pub fn as_str(&self) -> &'static str {
10232        match self {
10233            DigitalWatchfaceLayout::Traditional => "traditional",
10234            DigitalWatchfaceLayout::Modern => "modern",
10235            DigitalWatchfaceLayout::Bold => "bold",
10236        }
10237    }
10238
10239    /// Try to construct from the underlying numeric value.
10240    pub fn from_value(value: u8) -> Option<Self> {
10241        match value {
10242            0 => Some(DigitalWatchfaceLayout::Traditional),
10243            1 => Some(DigitalWatchfaceLayout::Modern),
10244            2 => Some(DigitalWatchfaceLayout::Bold),
10245            _ => None,
10246        }
10247    }
10248
10249    /// Try to construct from the snake-case canonical name.
10250    pub fn from_str(name: &str) -> Option<Self> {
10251        match name {
10252            "traditional" => Some(DigitalWatchfaceLayout::Traditional),
10253            "modern" => Some(DigitalWatchfaceLayout::Modern),
10254            "bold" => Some(DigitalWatchfaceLayout::Bold),
10255            _ => None,
10256        }
10257    }
10258}
10259
10260#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
10261#[repr(u8)]
10262#[non_exhaustive]
10263pub enum AnalogWatchfaceLayout {
10264    Minimal = 0,
10265    Traditional = 1,
10266    Modern = 2,
10267}
10268
10269impl AnalogWatchfaceLayout {
10270    /// Snake-case canonical name from Profile.xlsx.
10271    pub fn as_str(&self) -> &'static str {
10272        match self {
10273            AnalogWatchfaceLayout::Minimal => "minimal",
10274            AnalogWatchfaceLayout::Traditional => "traditional",
10275            AnalogWatchfaceLayout::Modern => "modern",
10276        }
10277    }
10278
10279    /// Try to construct from the underlying numeric value.
10280    pub fn from_value(value: u8) -> Option<Self> {
10281        match value {
10282            0 => Some(AnalogWatchfaceLayout::Minimal),
10283            1 => Some(AnalogWatchfaceLayout::Traditional),
10284            2 => Some(AnalogWatchfaceLayout::Modern),
10285            _ => None,
10286        }
10287    }
10288
10289    /// Try to construct from the snake-case canonical name.
10290    pub fn from_str(name: &str) -> Option<Self> {
10291        match name {
10292            "minimal" => Some(AnalogWatchfaceLayout::Minimal),
10293            "traditional" => Some(AnalogWatchfaceLayout::Traditional),
10294            "modern" => Some(AnalogWatchfaceLayout::Modern),
10295            _ => None,
10296        }
10297    }
10298}
10299
10300#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
10301#[repr(u8)]
10302#[non_exhaustive]
10303pub enum RiderPositionType {
10304    Seated = 0,
10305    Standing = 1,
10306    TransitionToSeated = 2,
10307    TransitionToStanding = 3,
10308}
10309
10310impl RiderPositionType {
10311    /// Snake-case canonical name from Profile.xlsx.
10312    pub fn as_str(&self) -> &'static str {
10313        match self {
10314            RiderPositionType::Seated => "seated",
10315            RiderPositionType::Standing => "standing",
10316            RiderPositionType::TransitionToSeated => "transition_to_seated",
10317            RiderPositionType::TransitionToStanding => "transition_to_standing",
10318        }
10319    }
10320
10321    /// Try to construct from the underlying numeric value.
10322    pub fn from_value(value: u8) -> Option<Self> {
10323        match value {
10324            0 => Some(RiderPositionType::Seated),
10325            1 => Some(RiderPositionType::Standing),
10326            2 => Some(RiderPositionType::TransitionToSeated),
10327            3 => Some(RiderPositionType::TransitionToStanding),
10328            _ => None,
10329        }
10330    }
10331
10332    /// Try to construct from the snake-case canonical name.
10333    pub fn from_str(name: &str) -> Option<Self> {
10334        match name {
10335            "seated" => Some(RiderPositionType::Seated),
10336            "standing" => Some(RiderPositionType::Standing),
10337            "transition_to_seated" => Some(RiderPositionType::TransitionToSeated),
10338            "transition_to_standing" => Some(RiderPositionType::TransitionToStanding),
10339            _ => None,
10340        }
10341    }
10342}
10343
10344#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
10345#[repr(u8)]
10346#[non_exhaustive]
10347pub enum PowerPhaseType {
10348    PowerPhaseStartAngle = 0,
10349    PowerPhaseEndAngle = 1,
10350    PowerPhaseArcLength = 2,
10351    PowerPhaseCenter = 3,
10352}
10353
10354impl PowerPhaseType {
10355    /// Snake-case canonical name from Profile.xlsx.
10356    pub fn as_str(&self) -> &'static str {
10357        match self {
10358            PowerPhaseType::PowerPhaseStartAngle => "power_phase_start_angle",
10359            PowerPhaseType::PowerPhaseEndAngle => "power_phase_end_angle",
10360            PowerPhaseType::PowerPhaseArcLength => "power_phase_arc_length",
10361            PowerPhaseType::PowerPhaseCenter => "power_phase_center",
10362        }
10363    }
10364
10365    /// Try to construct from the underlying numeric value.
10366    pub fn from_value(value: u8) -> Option<Self> {
10367        match value {
10368            0 => Some(PowerPhaseType::PowerPhaseStartAngle),
10369            1 => Some(PowerPhaseType::PowerPhaseEndAngle),
10370            2 => Some(PowerPhaseType::PowerPhaseArcLength),
10371            3 => Some(PowerPhaseType::PowerPhaseCenter),
10372            _ => None,
10373        }
10374    }
10375
10376    /// Try to construct from the snake-case canonical name.
10377    pub fn from_str(name: &str) -> Option<Self> {
10378        match name {
10379            "power_phase_start_angle" => Some(PowerPhaseType::PowerPhaseStartAngle),
10380            "power_phase_end_angle" => Some(PowerPhaseType::PowerPhaseEndAngle),
10381            "power_phase_arc_length" => Some(PowerPhaseType::PowerPhaseArcLength),
10382            "power_phase_center" => Some(PowerPhaseType::PowerPhaseCenter),
10383            _ => None,
10384        }
10385    }
10386}
10387
10388#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
10389#[repr(u8)]
10390#[non_exhaustive]
10391pub enum CameraEventType {
10392    VideoStart = 0,
10393    VideoSplit = 1,
10394    VideoEnd = 2,
10395    PhotoTaken = 3,
10396    VideoSecondStreamStart = 4,
10397    VideoSecondStreamSplit = 5,
10398    VideoSecondStreamEnd = 6,
10399    VideoSplitStart = 7,
10400    VideoSecondStreamSplitStart = 8,
10401    VideoPause = 11,
10402    VideoSecondStreamPause = 12,
10403    VideoResume = 13,
10404    VideoSecondStreamResume = 14,
10405}
10406
10407impl CameraEventType {
10408    /// Snake-case canonical name from Profile.xlsx.
10409    pub fn as_str(&self) -> &'static str {
10410        match self {
10411            CameraEventType::VideoStart => "video_start",
10412            CameraEventType::VideoSplit => "video_split",
10413            CameraEventType::VideoEnd => "video_end",
10414            CameraEventType::PhotoTaken => "photo_taken",
10415            CameraEventType::VideoSecondStreamStart => "video_second_stream_start",
10416            CameraEventType::VideoSecondStreamSplit => "video_second_stream_split",
10417            CameraEventType::VideoSecondStreamEnd => "video_second_stream_end",
10418            CameraEventType::VideoSplitStart => "video_split_start",
10419            CameraEventType::VideoSecondStreamSplitStart => "video_second_stream_split_start",
10420            CameraEventType::VideoPause => "video_pause",
10421            CameraEventType::VideoSecondStreamPause => "video_second_stream_pause",
10422            CameraEventType::VideoResume => "video_resume",
10423            CameraEventType::VideoSecondStreamResume => "video_second_stream_resume",
10424        }
10425    }
10426
10427    /// Try to construct from the underlying numeric value.
10428    pub fn from_value(value: u8) -> Option<Self> {
10429        match value {
10430            0 => Some(CameraEventType::VideoStart),
10431            1 => Some(CameraEventType::VideoSplit),
10432            2 => Some(CameraEventType::VideoEnd),
10433            3 => Some(CameraEventType::PhotoTaken),
10434            4 => Some(CameraEventType::VideoSecondStreamStart),
10435            5 => Some(CameraEventType::VideoSecondStreamSplit),
10436            6 => Some(CameraEventType::VideoSecondStreamEnd),
10437            7 => Some(CameraEventType::VideoSplitStart),
10438            8 => Some(CameraEventType::VideoSecondStreamSplitStart),
10439            11 => Some(CameraEventType::VideoPause),
10440            12 => Some(CameraEventType::VideoSecondStreamPause),
10441            13 => Some(CameraEventType::VideoResume),
10442            14 => Some(CameraEventType::VideoSecondStreamResume),
10443            _ => None,
10444        }
10445    }
10446
10447    /// Try to construct from the snake-case canonical name.
10448    pub fn from_str(name: &str) -> Option<Self> {
10449        match name {
10450            "video_start" => Some(CameraEventType::VideoStart),
10451            "video_split" => Some(CameraEventType::VideoSplit),
10452            "video_end" => Some(CameraEventType::VideoEnd),
10453            "photo_taken" => Some(CameraEventType::PhotoTaken),
10454            "video_second_stream_start" => Some(CameraEventType::VideoSecondStreamStart),
10455            "video_second_stream_split" => Some(CameraEventType::VideoSecondStreamSplit),
10456            "video_second_stream_end" => Some(CameraEventType::VideoSecondStreamEnd),
10457            "video_split_start" => Some(CameraEventType::VideoSplitStart),
10458            "video_second_stream_split_start" => Some(CameraEventType::VideoSecondStreamSplitStart),
10459            "video_pause" => Some(CameraEventType::VideoPause),
10460            "video_second_stream_pause" => Some(CameraEventType::VideoSecondStreamPause),
10461            "video_resume" => Some(CameraEventType::VideoResume),
10462            "video_second_stream_resume" => Some(CameraEventType::VideoSecondStreamResume),
10463            _ => None,
10464        }
10465    }
10466}
10467
10468#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
10469#[repr(u8)]
10470#[non_exhaustive]
10471pub enum SensorType {
10472    Accelerometer = 0,
10473    Gyroscope = 1,
10474    Compass = 2,
10475    Barometer = 3,
10476}
10477
10478impl SensorType {
10479    /// Snake-case canonical name from Profile.xlsx.
10480    pub fn as_str(&self) -> &'static str {
10481        match self {
10482            SensorType::Accelerometer => "accelerometer",
10483            SensorType::Gyroscope => "gyroscope",
10484            SensorType::Compass => "compass",
10485            SensorType::Barometer => "barometer",
10486        }
10487    }
10488
10489    /// Try to construct from the underlying numeric value.
10490    pub fn from_value(value: u8) -> Option<Self> {
10491        match value {
10492            0 => Some(SensorType::Accelerometer),
10493            1 => Some(SensorType::Gyroscope),
10494            2 => Some(SensorType::Compass),
10495            3 => Some(SensorType::Barometer),
10496            _ => None,
10497        }
10498    }
10499
10500    /// Try to construct from the snake-case canonical name.
10501    pub fn from_str(name: &str) -> Option<Self> {
10502        match name {
10503            "accelerometer" => Some(SensorType::Accelerometer),
10504            "gyroscope" => Some(SensorType::Gyroscope),
10505            "compass" => Some(SensorType::Compass),
10506            "barometer" => Some(SensorType::Barometer),
10507            _ => None,
10508        }
10509    }
10510}
10511
10512#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
10513#[repr(u8)]
10514#[non_exhaustive]
10515pub enum BikeLightNetworkConfigType {
10516    Auto = 0,
10517    Individual = 4,
10518    HighVisibility = 5,
10519    Trail = 6,
10520}
10521
10522impl BikeLightNetworkConfigType {
10523    /// Snake-case canonical name from Profile.xlsx.
10524    pub fn as_str(&self) -> &'static str {
10525        match self {
10526            BikeLightNetworkConfigType::Auto => "auto",
10527            BikeLightNetworkConfigType::Individual => "individual",
10528            BikeLightNetworkConfigType::HighVisibility => "high_visibility",
10529            BikeLightNetworkConfigType::Trail => "trail",
10530        }
10531    }
10532
10533    /// Try to construct from the underlying numeric value.
10534    pub fn from_value(value: u8) -> Option<Self> {
10535        match value {
10536            0 => Some(BikeLightNetworkConfigType::Auto),
10537            4 => Some(BikeLightNetworkConfigType::Individual),
10538            5 => Some(BikeLightNetworkConfigType::HighVisibility),
10539            6 => Some(BikeLightNetworkConfigType::Trail),
10540            _ => None,
10541        }
10542    }
10543
10544    /// Try to construct from the snake-case canonical name.
10545    pub fn from_str(name: &str) -> Option<Self> {
10546        match name {
10547            "auto" => Some(BikeLightNetworkConfigType::Auto),
10548            "individual" => Some(BikeLightNetworkConfigType::Individual),
10549            "high_visibility" => Some(BikeLightNetworkConfigType::HighVisibility),
10550            "trail" => Some(BikeLightNetworkConfigType::Trail),
10551            _ => None,
10552        }
10553    }
10554}
10555
10556#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
10557#[repr(u16)]
10558#[non_exhaustive]
10559pub enum CommTimeoutType {
10560    WildcardPairingTimeout = 0,
10561    PairingTimeout = 1,
10562    ConnectionLost = 2,
10563    ConnectionTimeout = 3,
10564}
10565
10566impl CommTimeoutType {
10567    /// Snake-case canonical name from Profile.xlsx.
10568    pub fn as_str(&self) -> &'static str {
10569        match self {
10570            CommTimeoutType::WildcardPairingTimeout => "wildcard_pairing_timeout",
10571            CommTimeoutType::PairingTimeout => "pairing_timeout",
10572            CommTimeoutType::ConnectionLost => "connection_lost",
10573            CommTimeoutType::ConnectionTimeout => "connection_timeout",
10574        }
10575    }
10576
10577    /// Try to construct from the underlying numeric value.
10578    pub fn from_value(value: u16) -> Option<Self> {
10579        match value {
10580            0 => Some(CommTimeoutType::WildcardPairingTimeout),
10581            1 => Some(CommTimeoutType::PairingTimeout),
10582            2 => Some(CommTimeoutType::ConnectionLost),
10583            3 => Some(CommTimeoutType::ConnectionTimeout),
10584            _ => None,
10585        }
10586    }
10587
10588    /// Try to construct from the snake-case canonical name.
10589    pub fn from_str(name: &str) -> Option<Self> {
10590        match name {
10591            "wildcard_pairing_timeout" => Some(CommTimeoutType::WildcardPairingTimeout),
10592            "pairing_timeout" => Some(CommTimeoutType::PairingTimeout),
10593            "connection_lost" => Some(CommTimeoutType::ConnectionLost),
10594            "connection_timeout" => Some(CommTimeoutType::ConnectionTimeout),
10595            _ => None,
10596        }
10597    }
10598}
10599
10600#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
10601#[repr(u8)]
10602#[non_exhaustive]
10603pub enum CameraOrientationType {
10604    CameraOrientation0 = 0,
10605    CameraOrientation90 = 1,
10606    CameraOrientation180 = 2,
10607    CameraOrientation270 = 3,
10608}
10609
10610impl CameraOrientationType {
10611    /// Snake-case canonical name from Profile.xlsx.
10612    pub fn as_str(&self) -> &'static str {
10613        match self {
10614            CameraOrientationType::CameraOrientation0 => "camera_orientation_0",
10615            CameraOrientationType::CameraOrientation90 => "camera_orientation_90",
10616            CameraOrientationType::CameraOrientation180 => "camera_orientation_180",
10617            CameraOrientationType::CameraOrientation270 => "camera_orientation_270",
10618        }
10619    }
10620
10621    /// Try to construct from the underlying numeric value.
10622    pub fn from_value(value: u8) -> Option<Self> {
10623        match value {
10624            0 => Some(CameraOrientationType::CameraOrientation0),
10625            1 => Some(CameraOrientationType::CameraOrientation90),
10626            2 => Some(CameraOrientationType::CameraOrientation180),
10627            3 => Some(CameraOrientationType::CameraOrientation270),
10628            _ => None,
10629        }
10630    }
10631
10632    /// Try to construct from the snake-case canonical name.
10633    pub fn from_str(name: &str) -> Option<Self> {
10634        match name {
10635            "camera_orientation_0" => Some(CameraOrientationType::CameraOrientation0),
10636            "camera_orientation_90" => Some(CameraOrientationType::CameraOrientation90),
10637            "camera_orientation_180" => Some(CameraOrientationType::CameraOrientation180),
10638            "camera_orientation_270" => Some(CameraOrientationType::CameraOrientation270),
10639            _ => None,
10640        }
10641    }
10642}
10643
10644#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
10645#[repr(u8)]
10646#[non_exhaustive]
10647pub enum AttitudeStage {
10648    Failed = 0,
10649    Aligning = 1,
10650    Degraded = 2,
10651    Valid = 3,
10652}
10653
10654impl AttitudeStage {
10655    /// Snake-case canonical name from Profile.xlsx.
10656    pub fn as_str(&self) -> &'static str {
10657        match self {
10658            AttitudeStage::Failed => "failed",
10659            AttitudeStage::Aligning => "aligning",
10660            AttitudeStage::Degraded => "degraded",
10661            AttitudeStage::Valid => "valid",
10662        }
10663    }
10664
10665    /// Try to construct from the underlying numeric value.
10666    pub fn from_value(value: u8) -> Option<Self> {
10667        match value {
10668            0 => Some(AttitudeStage::Failed),
10669            1 => Some(AttitudeStage::Aligning),
10670            2 => Some(AttitudeStage::Degraded),
10671            3 => Some(AttitudeStage::Valid),
10672            _ => None,
10673        }
10674    }
10675
10676    /// Try to construct from the snake-case canonical name.
10677    pub fn from_str(name: &str) -> Option<Self> {
10678        match name {
10679            "failed" => Some(AttitudeStage::Failed),
10680            "aligning" => Some(AttitudeStage::Aligning),
10681            "degraded" => Some(AttitudeStage::Degraded),
10682            "valid" => Some(AttitudeStage::Valid),
10683            _ => None,
10684        }
10685    }
10686}
10687
10688#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
10689#[repr(u16)]
10690#[non_exhaustive]
10691pub enum AttitudeValidity {
10692    TrackAngleHeadingValid = 1,
10693    PitchValid = 2,
10694    RollValid = 4,
10695    LateralBodyAccelValid = 8,
10696    NormalBodyAccelValid = 16,
10697    TurnRateValid = 32,
10698    HwFail = 64,
10699    MagInvalid = 128,
10700    NoGps = 256,
10701    GpsInvalid = 512,
10702    SolutionCoasting = 1024,
10703    TrueTrackAngle = 2048,
10704    MagneticHeading = 4096,
10705}
10706
10707impl AttitudeValidity {
10708    /// Snake-case canonical name from Profile.xlsx.
10709    pub fn as_str(&self) -> &'static str {
10710        match self {
10711            AttitudeValidity::TrackAngleHeadingValid => "track_angle_heading_valid",
10712            AttitudeValidity::PitchValid => "pitch_valid",
10713            AttitudeValidity::RollValid => "roll_valid",
10714            AttitudeValidity::LateralBodyAccelValid => "lateral_body_accel_valid",
10715            AttitudeValidity::NormalBodyAccelValid => "normal_body_accel_valid",
10716            AttitudeValidity::TurnRateValid => "turn_rate_valid",
10717            AttitudeValidity::HwFail => "hw_fail",
10718            AttitudeValidity::MagInvalid => "mag_invalid",
10719            AttitudeValidity::NoGps => "no_gps",
10720            AttitudeValidity::GpsInvalid => "gps_invalid",
10721            AttitudeValidity::SolutionCoasting => "solution_coasting",
10722            AttitudeValidity::TrueTrackAngle => "true_track_angle",
10723            AttitudeValidity::MagneticHeading => "magnetic_heading",
10724        }
10725    }
10726
10727    /// Try to construct from the underlying numeric value.
10728    pub fn from_value(value: u16) -> Option<Self> {
10729        match value {
10730            1 => Some(AttitudeValidity::TrackAngleHeadingValid),
10731            2 => Some(AttitudeValidity::PitchValid),
10732            4 => Some(AttitudeValidity::RollValid),
10733            8 => Some(AttitudeValidity::LateralBodyAccelValid),
10734            16 => Some(AttitudeValidity::NormalBodyAccelValid),
10735            32 => Some(AttitudeValidity::TurnRateValid),
10736            64 => Some(AttitudeValidity::HwFail),
10737            128 => Some(AttitudeValidity::MagInvalid),
10738            256 => Some(AttitudeValidity::NoGps),
10739            512 => Some(AttitudeValidity::GpsInvalid),
10740            1024 => Some(AttitudeValidity::SolutionCoasting),
10741            2048 => Some(AttitudeValidity::TrueTrackAngle),
10742            4096 => Some(AttitudeValidity::MagneticHeading),
10743            _ => None,
10744        }
10745    }
10746
10747    /// Try to construct from the snake-case canonical name.
10748    pub fn from_str(name: &str) -> Option<Self> {
10749        match name {
10750            "track_angle_heading_valid" => Some(AttitudeValidity::TrackAngleHeadingValid),
10751            "pitch_valid" => Some(AttitudeValidity::PitchValid),
10752            "roll_valid" => Some(AttitudeValidity::RollValid),
10753            "lateral_body_accel_valid" => Some(AttitudeValidity::LateralBodyAccelValid),
10754            "normal_body_accel_valid" => Some(AttitudeValidity::NormalBodyAccelValid),
10755            "turn_rate_valid" => Some(AttitudeValidity::TurnRateValid),
10756            "hw_fail" => Some(AttitudeValidity::HwFail),
10757            "mag_invalid" => Some(AttitudeValidity::MagInvalid),
10758            "no_gps" => Some(AttitudeValidity::NoGps),
10759            "gps_invalid" => Some(AttitudeValidity::GpsInvalid),
10760            "solution_coasting" => Some(AttitudeValidity::SolutionCoasting),
10761            "true_track_angle" => Some(AttitudeValidity::TrueTrackAngle),
10762            "magnetic_heading" => Some(AttitudeValidity::MagneticHeading),
10763            _ => None,
10764        }
10765    }
10766}
10767
10768#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
10769#[repr(u8)]
10770#[non_exhaustive]
10771pub enum AutoSyncFrequency {
10772    Never = 0,
10773    Occasionally = 1,
10774    Frequent = 2,
10775    OnceADay = 3,
10776    Remote = 4,
10777}
10778
10779impl AutoSyncFrequency {
10780    /// Snake-case canonical name from Profile.xlsx.
10781    pub fn as_str(&self) -> &'static str {
10782        match self {
10783            AutoSyncFrequency::Never => "never",
10784            AutoSyncFrequency::Occasionally => "occasionally",
10785            AutoSyncFrequency::Frequent => "frequent",
10786            AutoSyncFrequency::OnceADay => "once_a_day",
10787            AutoSyncFrequency::Remote => "remote",
10788        }
10789    }
10790
10791    /// Try to construct from the underlying numeric value.
10792    pub fn from_value(value: u8) -> Option<Self> {
10793        match value {
10794            0 => Some(AutoSyncFrequency::Never),
10795            1 => Some(AutoSyncFrequency::Occasionally),
10796            2 => Some(AutoSyncFrequency::Frequent),
10797            3 => Some(AutoSyncFrequency::OnceADay),
10798            4 => Some(AutoSyncFrequency::Remote),
10799            _ => None,
10800        }
10801    }
10802
10803    /// Try to construct from the snake-case canonical name.
10804    pub fn from_str(name: &str) -> Option<Self> {
10805        match name {
10806            "never" => Some(AutoSyncFrequency::Never),
10807            "occasionally" => Some(AutoSyncFrequency::Occasionally),
10808            "frequent" => Some(AutoSyncFrequency::Frequent),
10809            "once_a_day" => Some(AutoSyncFrequency::OnceADay),
10810            "remote" => Some(AutoSyncFrequency::Remote),
10811            _ => None,
10812        }
10813    }
10814}
10815
10816#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
10817#[repr(u8)]
10818#[non_exhaustive]
10819pub enum ExdLayout {
10820    FullScreen = 0,
10821    HalfVertical = 1,
10822    HalfHorizontal = 2,
10823    HalfVerticalRightSplit = 3,
10824    HalfHorizontalBottomSplit = 4,
10825    FullQuarterSplit = 5,
10826    HalfVerticalLeftSplit = 6,
10827    HalfHorizontalTopSplit = 7,
10828    Dynamic = 8,
10829}
10830
10831impl ExdLayout {
10832    /// Snake-case canonical name from Profile.xlsx.
10833    pub fn as_str(&self) -> &'static str {
10834        match self {
10835            ExdLayout::FullScreen => "full_screen",
10836            ExdLayout::HalfVertical => "half_vertical",
10837            ExdLayout::HalfHorizontal => "half_horizontal",
10838            ExdLayout::HalfVerticalRightSplit => "half_vertical_right_split",
10839            ExdLayout::HalfHorizontalBottomSplit => "half_horizontal_bottom_split",
10840            ExdLayout::FullQuarterSplit => "full_quarter_split",
10841            ExdLayout::HalfVerticalLeftSplit => "half_vertical_left_split",
10842            ExdLayout::HalfHorizontalTopSplit => "half_horizontal_top_split",
10843            ExdLayout::Dynamic => "dynamic",
10844        }
10845    }
10846
10847    /// Try to construct from the underlying numeric value.
10848    pub fn from_value(value: u8) -> Option<Self> {
10849        match value {
10850            0 => Some(ExdLayout::FullScreen),
10851            1 => Some(ExdLayout::HalfVertical),
10852            2 => Some(ExdLayout::HalfHorizontal),
10853            3 => Some(ExdLayout::HalfVerticalRightSplit),
10854            4 => Some(ExdLayout::HalfHorizontalBottomSplit),
10855            5 => Some(ExdLayout::FullQuarterSplit),
10856            6 => Some(ExdLayout::HalfVerticalLeftSplit),
10857            7 => Some(ExdLayout::HalfHorizontalTopSplit),
10858            8 => Some(ExdLayout::Dynamic),
10859            _ => None,
10860        }
10861    }
10862
10863    /// Try to construct from the snake-case canonical name.
10864    pub fn from_str(name: &str) -> Option<Self> {
10865        match name {
10866            "full_screen" => Some(ExdLayout::FullScreen),
10867            "half_vertical" => Some(ExdLayout::HalfVertical),
10868            "half_horizontal" => Some(ExdLayout::HalfHorizontal),
10869            "half_vertical_right_split" => Some(ExdLayout::HalfVerticalRightSplit),
10870            "half_horizontal_bottom_split" => Some(ExdLayout::HalfHorizontalBottomSplit),
10871            "full_quarter_split" => Some(ExdLayout::FullQuarterSplit),
10872            "half_vertical_left_split" => Some(ExdLayout::HalfVerticalLeftSplit),
10873            "half_horizontal_top_split" => Some(ExdLayout::HalfHorizontalTopSplit),
10874            "dynamic" => Some(ExdLayout::Dynamic),
10875            _ => None,
10876        }
10877    }
10878}
10879
10880#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
10881#[repr(u8)]
10882#[non_exhaustive]
10883pub enum ExdDisplayType {
10884    Numerical = 0,
10885    Simple = 1,
10886    Graph = 2,
10887    Bar = 3,
10888    CircleGraph = 4,
10889    VirtualPartner = 5,
10890    Balance = 6,
10891    StringList = 7,
10892    String = 8,
10893    SimpleDynamicIcon = 9,
10894    Gauge = 10,
10895}
10896
10897impl ExdDisplayType {
10898    /// Snake-case canonical name from Profile.xlsx.
10899    pub fn as_str(&self) -> &'static str {
10900        match self {
10901            ExdDisplayType::Numerical => "numerical",
10902            ExdDisplayType::Simple => "simple",
10903            ExdDisplayType::Graph => "graph",
10904            ExdDisplayType::Bar => "bar",
10905            ExdDisplayType::CircleGraph => "circle_graph",
10906            ExdDisplayType::VirtualPartner => "virtual_partner",
10907            ExdDisplayType::Balance => "balance",
10908            ExdDisplayType::StringList => "string_list",
10909            ExdDisplayType::String => "string",
10910            ExdDisplayType::SimpleDynamicIcon => "simple_dynamic_icon",
10911            ExdDisplayType::Gauge => "gauge",
10912        }
10913    }
10914
10915    /// Try to construct from the underlying numeric value.
10916    pub fn from_value(value: u8) -> Option<Self> {
10917        match value {
10918            0 => Some(ExdDisplayType::Numerical),
10919            1 => Some(ExdDisplayType::Simple),
10920            2 => Some(ExdDisplayType::Graph),
10921            3 => Some(ExdDisplayType::Bar),
10922            4 => Some(ExdDisplayType::CircleGraph),
10923            5 => Some(ExdDisplayType::VirtualPartner),
10924            6 => Some(ExdDisplayType::Balance),
10925            7 => Some(ExdDisplayType::StringList),
10926            8 => Some(ExdDisplayType::String),
10927            9 => Some(ExdDisplayType::SimpleDynamicIcon),
10928            10 => Some(ExdDisplayType::Gauge),
10929            _ => None,
10930        }
10931    }
10932
10933    /// Try to construct from the snake-case canonical name.
10934    pub fn from_str(name: &str) -> Option<Self> {
10935        match name {
10936            "numerical" => Some(ExdDisplayType::Numerical),
10937            "simple" => Some(ExdDisplayType::Simple),
10938            "graph" => Some(ExdDisplayType::Graph),
10939            "bar" => Some(ExdDisplayType::Bar),
10940            "circle_graph" => Some(ExdDisplayType::CircleGraph),
10941            "virtual_partner" => Some(ExdDisplayType::VirtualPartner),
10942            "balance" => Some(ExdDisplayType::Balance),
10943            "string_list" => Some(ExdDisplayType::StringList),
10944            "string" => Some(ExdDisplayType::String),
10945            "simple_dynamic_icon" => Some(ExdDisplayType::SimpleDynamicIcon),
10946            "gauge" => Some(ExdDisplayType::Gauge),
10947            _ => None,
10948        }
10949    }
10950}
10951
10952#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
10953#[repr(u8)]
10954#[non_exhaustive]
10955pub enum ExdDataUnits {
10956    NoUnits = 0,
10957    Laps = 1,
10958    MilesPerHour = 2,
10959    KilometersPerHour = 3,
10960    FeetPerHour = 4,
10961    MetersPerHour = 5,
10962    DegreesCelsius = 6,
10963    DegreesFarenheit = 7,
10964    Zone = 8,
10965    Gear = 9,
10966    Rpm = 10,
10967    Bpm = 11,
10968    Degrees = 12,
10969    Millimeters = 13,
10970    Meters = 14,
10971    Kilometers = 15,
10972    Feet = 16,
10973    Yards = 17,
10974    Kilofeet = 18,
10975    Miles = 19,
10976    Time = 20,
10977    EnumTurnType = 21,
10978    Percent = 22,
10979    Watts = 23,
10980    WattsPerKilogram = 24,
10981    EnumBatteryStatus = 25,
10982    EnumBikeLightBeamAngleMode = 26,
10983    EnumBikeLightBatteryStatus = 27,
10984    EnumBikeLightNetworkConfigType = 28,
10985    Lights = 29,
10986    Seconds = 30,
10987    Minutes = 31,
10988    Hours = 32,
10989    Calories = 33,
10990    Kilojoules = 34,
10991    Milliseconds = 35,
10992    SecondPerMile = 36,
10993    SecondPerKilometer = 37,
10994    Centimeter = 38,
10995    EnumCoursePoint = 39,
10996    Bradians = 40,
10997    EnumSport = 41,
10998    InchesHg = 42,
10999    MmHg = 43,
11000    Mbars = 44,
11001    HectoPascals = 45,
11002    FeetPerMin = 46,
11003    MetersPerMin = 47,
11004    MetersPerSec = 48,
11005    EightCardinal = 49,
11006}
11007
11008impl ExdDataUnits {
11009    /// Snake-case canonical name from Profile.xlsx.
11010    pub fn as_str(&self) -> &'static str {
11011        match self {
11012            ExdDataUnits::NoUnits => "no_units",
11013            ExdDataUnits::Laps => "laps",
11014            ExdDataUnits::MilesPerHour => "miles_per_hour",
11015            ExdDataUnits::KilometersPerHour => "kilometers_per_hour",
11016            ExdDataUnits::FeetPerHour => "feet_per_hour",
11017            ExdDataUnits::MetersPerHour => "meters_per_hour",
11018            ExdDataUnits::DegreesCelsius => "degrees_celsius",
11019            ExdDataUnits::DegreesFarenheit => "degrees_farenheit",
11020            ExdDataUnits::Zone => "zone",
11021            ExdDataUnits::Gear => "gear",
11022            ExdDataUnits::Rpm => "rpm",
11023            ExdDataUnits::Bpm => "bpm",
11024            ExdDataUnits::Degrees => "degrees",
11025            ExdDataUnits::Millimeters => "millimeters",
11026            ExdDataUnits::Meters => "meters",
11027            ExdDataUnits::Kilometers => "kilometers",
11028            ExdDataUnits::Feet => "feet",
11029            ExdDataUnits::Yards => "yards",
11030            ExdDataUnits::Kilofeet => "kilofeet",
11031            ExdDataUnits::Miles => "miles",
11032            ExdDataUnits::Time => "time",
11033            ExdDataUnits::EnumTurnType => "enum_turn_type",
11034            ExdDataUnits::Percent => "percent",
11035            ExdDataUnits::Watts => "watts",
11036            ExdDataUnits::WattsPerKilogram => "watts_per_kilogram",
11037            ExdDataUnits::EnumBatteryStatus => "enum_battery_status",
11038            ExdDataUnits::EnumBikeLightBeamAngleMode => "enum_bike_light_beam_angle_mode",
11039            ExdDataUnits::EnumBikeLightBatteryStatus => "enum_bike_light_battery_status",
11040            ExdDataUnits::EnumBikeLightNetworkConfigType => "enum_bike_light_network_config_type",
11041            ExdDataUnits::Lights => "lights",
11042            ExdDataUnits::Seconds => "seconds",
11043            ExdDataUnits::Minutes => "minutes",
11044            ExdDataUnits::Hours => "hours",
11045            ExdDataUnits::Calories => "calories",
11046            ExdDataUnits::Kilojoules => "kilojoules",
11047            ExdDataUnits::Milliseconds => "milliseconds",
11048            ExdDataUnits::SecondPerMile => "second_per_mile",
11049            ExdDataUnits::SecondPerKilometer => "second_per_kilometer",
11050            ExdDataUnits::Centimeter => "centimeter",
11051            ExdDataUnits::EnumCoursePoint => "enum_course_point",
11052            ExdDataUnits::Bradians => "bradians",
11053            ExdDataUnits::EnumSport => "enum_sport",
11054            ExdDataUnits::InchesHg => "inches_hg",
11055            ExdDataUnits::MmHg => "mm_hg",
11056            ExdDataUnits::Mbars => "mbars",
11057            ExdDataUnits::HectoPascals => "hecto_pascals",
11058            ExdDataUnits::FeetPerMin => "feet_per_min",
11059            ExdDataUnits::MetersPerMin => "meters_per_min",
11060            ExdDataUnits::MetersPerSec => "meters_per_sec",
11061            ExdDataUnits::EightCardinal => "eight_cardinal",
11062        }
11063    }
11064
11065    /// Try to construct from the underlying numeric value.
11066    pub fn from_value(value: u8) -> Option<Self> {
11067        match value {
11068            0 => Some(ExdDataUnits::NoUnits),
11069            1 => Some(ExdDataUnits::Laps),
11070            2 => Some(ExdDataUnits::MilesPerHour),
11071            3 => Some(ExdDataUnits::KilometersPerHour),
11072            4 => Some(ExdDataUnits::FeetPerHour),
11073            5 => Some(ExdDataUnits::MetersPerHour),
11074            6 => Some(ExdDataUnits::DegreesCelsius),
11075            7 => Some(ExdDataUnits::DegreesFarenheit),
11076            8 => Some(ExdDataUnits::Zone),
11077            9 => Some(ExdDataUnits::Gear),
11078            10 => Some(ExdDataUnits::Rpm),
11079            11 => Some(ExdDataUnits::Bpm),
11080            12 => Some(ExdDataUnits::Degrees),
11081            13 => Some(ExdDataUnits::Millimeters),
11082            14 => Some(ExdDataUnits::Meters),
11083            15 => Some(ExdDataUnits::Kilometers),
11084            16 => Some(ExdDataUnits::Feet),
11085            17 => Some(ExdDataUnits::Yards),
11086            18 => Some(ExdDataUnits::Kilofeet),
11087            19 => Some(ExdDataUnits::Miles),
11088            20 => Some(ExdDataUnits::Time),
11089            21 => Some(ExdDataUnits::EnumTurnType),
11090            22 => Some(ExdDataUnits::Percent),
11091            23 => Some(ExdDataUnits::Watts),
11092            24 => Some(ExdDataUnits::WattsPerKilogram),
11093            25 => Some(ExdDataUnits::EnumBatteryStatus),
11094            26 => Some(ExdDataUnits::EnumBikeLightBeamAngleMode),
11095            27 => Some(ExdDataUnits::EnumBikeLightBatteryStatus),
11096            28 => Some(ExdDataUnits::EnumBikeLightNetworkConfigType),
11097            29 => Some(ExdDataUnits::Lights),
11098            30 => Some(ExdDataUnits::Seconds),
11099            31 => Some(ExdDataUnits::Minutes),
11100            32 => Some(ExdDataUnits::Hours),
11101            33 => Some(ExdDataUnits::Calories),
11102            34 => Some(ExdDataUnits::Kilojoules),
11103            35 => Some(ExdDataUnits::Milliseconds),
11104            36 => Some(ExdDataUnits::SecondPerMile),
11105            37 => Some(ExdDataUnits::SecondPerKilometer),
11106            38 => Some(ExdDataUnits::Centimeter),
11107            39 => Some(ExdDataUnits::EnumCoursePoint),
11108            40 => Some(ExdDataUnits::Bradians),
11109            41 => Some(ExdDataUnits::EnumSport),
11110            42 => Some(ExdDataUnits::InchesHg),
11111            43 => Some(ExdDataUnits::MmHg),
11112            44 => Some(ExdDataUnits::Mbars),
11113            45 => Some(ExdDataUnits::HectoPascals),
11114            46 => Some(ExdDataUnits::FeetPerMin),
11115            47 => Some(ExdDataUnits::MetersPerMin),
11116            48 => Some(ExdDataUnits::MetersPerSec),
11117            49 => Some(ExdDataUnits::EightCardinal),
11118            _ => None,
11119        }
11120    }
11121
11122    /// Try to construct from the snake-case canonical name.
11123    pub fn from_str(name: &str) -> Option<Self> {
11124        match name {
11125            "no_units" => Some(ExdDataUnits::NoUnits),
11126            "laps" => Some(ExdDataUnits::Laps),
11127            "miles_per_hour" => Some(ExdDataUnits::MilesPerHour),
11128            "kilometers_per_hour" => Some(ExdDataUnits::KilometersPerHour),
11129            "feet_per_hour" => Some(ExdDataUnits::FeetPerHour),
11130            "meters_per_hour" => Some(ExdDataUnits::MetersPerHour),
11131            "degrees_celsius" => Some(ExdDataUnits::DegreesCelsius),
11132            "degrees_farenheit" => Some(ExdDataUnits::DegreesFarenheit),
11133            "zone" => Some(ExdDataUnits::Zone),
11134            "gear" => Some(ExdDataUnits::Gear),
11135            "rpm" => Some(ExdDataUnits::Rpm),
11136            "bpm" => Some(ExdDataUnits::Bpm),
11137            "degrees" => Some(ExdDataUnits::Degrees),
11138            "millimeters" => Some(ExdDataUnits::Millimeters),
11139            "meters" => Some(ExdDataUnits::Meters),
11140            "kilometers" => Some(ExdDataUnits::Kilometers),
11141            "feet" => Some(ExdDataUnits::Feet),
11142            "yards" => Some(ExdDataUnits::Yards),
11143            "kilofeet" => Some(ExdDataUnits::Kilofeet),
11144            "miles" => Some(ExdDataUnits::Miles),
11145            "time" => Some(ExdDataUnits::Time),
11146            "enum_turn_type" => Some(ExdDataUnits::EnumTurnType),
11147            "percent" => Some(ExdDataUnits::Percent),
11148            "watts" => Some(ExdDataUnits::Watts),
11149            "watts_per_kilogram" => Some(ExdDataUnits::WattsPerKilogram),
11150            "enum_battery_status" => Some(ExdDataUnits::EnumBatteryStatus),
11151            "enum_bike_light_beam_angle_mode" => Some(ExdDataUnits::EnumBikeLightBeamAngleMode),
11152            "enum_bike_light_battery_status" => Some(ExdDataUnits::EnumBikeLightBatteryStatus),
11153            "enum_bike_light_network_config_type" => {
11154                Some(ExdDataUnits::EnumBikeLightNetworkConfigType)
11155            }
11156            "lights" => Some(ExdDataUnits::Lights),
11157            "seconds" => Some(ExdDataUnits::Seconds),
11158            "minutes" => Some(ExdDataUnits::Minutes),
11159            "hours" => Some(ExdDataUnits::Hours),
11160            "calories" => Some(ExdDataUnits::Calories),
11161            "kilojoules" => Some(ExdDataUnits::Kilojoules),
11162            "milliseconds" => Some(ExdDataUnits::Milliseconds),
11163            "second_per_mile" => Some(ExdDataUnits::SecondPerMile),
11164            "second_per_kilometer" => Some(ExdDataUnits::SecondPerKilometer),
11165            "centimeter" => Some(ExdDataUnits::Centimeter),
11166            "enum_course_point" => Some(ExdDataUnits::EnumCoursePoint),
11167            "bradians" => Some(ExdDataUnits::Bradians),
11168            "enum_sport" => Some(ExdDataUnits::EnumSport),
11169            "inches_hg" => Some(ExdDataUnits::InchesHg),
11170            "mm_hg" => Some(ExdDataUnits::MmHg),
11171            "mbars" => Some(ExdDataUnits::Mbars),
11172            "hecto_pascals" => Some(ExdDataUnits::HectoPascals),
11173            "feet_per_min" => Some(ExdDataUnits::FeetPerMin),
11174            "meters_per_min" => Some(ExdDataUnits::MetersPerMin),
11175            "meters_per_sec" => Some(ExdDataUnits::MetersPerSec),
11176            "eight_cardinal" => Some(ExdDataUnits::EightCardinal),
11177            _ => None,
11178        }
11179    }
11180}
11181
11182#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
11183#[repr(u8)]
11184#[non_exhaustive]
11185pub enum ExdQualifiers {
11186    NoQualifier = 0,
11187    Instantaneous = 1,
11188    Average = 2,
11189    Lap = 3,
11190    Maximum = 4,
11191    MaximumAverage = 5,
11192    MaximumLap = 6,
11193    LastLap = 7,
11194    AverageLap = 8,
11195    ToDestination = 9,
11196    ToGo = 10,
11197    ToNext = 11,
11198    NextCoursePoint = 12,
11199    Total = 13,
11200    ThreeSecondAverage = 14,
11201    TenSecondAverage = 15,
11202    ThirtySecondAverage = 16,
11203    PercentMaximum = 17,
11204    PercentMaximumAverage = 18,
11205    LapPercentMaximum = 19,
11206    Elapsed = 20,
11207    Sunrise = 21,
11208    Sunset = 22,
11209    ComparedToVirtualPartner = 23,
11210    Maximum24h = 24,
11211    Minimum24h = 25,
11212    Minimum = 26,
11213    First = 27,
11214    Second = 28,
11215    Third = 29,
11216    Shifter = 30,
11217    LastSport = 31,
11218    Moving = 32,
11219    Stopped = 33,
11220    EstimatedTotal = 34,
11221    Zone9 = 242,
11222    Zone8 = 243,
11223    Zone7 = 244,
11224    Zone6 = 245,
11225    Zone5 = 246,
11226    Zone4 = 247,
11227    Zone3 = 248,
11228    Zone2 = 249,
11229    Zone1 = 250,
11230}
11231
11232impl ExdQualifiers {
11233    /// Snake-case canonical name from Profile.xlsx.
11234    pub fn as_str(&self) -> &'static str {
11235        match self {
11236            ExdQualifiers::NoQualifier => "no_qualifier",
11237            ExdQualifiers::Instantaneous => "instantaneous",
11238            ExdQualifiers::Average => "average",
11239            ExdQualifiers::Lap => "lap",
11240            ExdQualifiers::Maximum => "maximum",
11241            ExdQualifiers::MaximumAverage => "maximum_average",
11242            ExdQualifiers::MaximumLap => "maximum_lap",
11243            ExdQualifiers::LastLap => "last_lap",
11244            ExdQualifiers::AverageLap => "average_lap",
11245            ExdQualifiers::ToDestination => "to_destination",
11246            ExdQualifiers::ToGo => "to_go",
11247            ExdQualifiers::ToNext => "to_next",
11248            ExdQualifiers::NextCoursePoint => "next_course_point",
11249            ExdQualifiers::Total => "total",
11250            ExdQualifiers::ThreeSecondAverage => "three_second_average",
11251            ExdQualifiers::TenSecondAverage => "ten_second_average",
11252            ExdQualifiers::ThirtySecondAverage => "thirty_second_average",
11253            ExdQualifiers::PercentMaximum => "percent_maximum",
11254            ExdQualifiers::PercentMaximumAverage => "percent_maximum_average",
11255            ExdQualifiers::LapPercentMaximum => "lap_percent_maximum",
11256            ExdQualifiers::Elapsed => "elapsed",
11257            ExdQualifiers::Sunrise => "sunrise",
11258            ExdQualifiers::Sunset => "sunset",
11259            ExdQualifiers::ComparedToVirtualPartner => "compared_to_virtual_partner",
11260            ExdQualifiers::Maximum24h => "maximum_24h",
11261            ExdQualifiers::Minimum24h => "minimum_24h",
11262            ExdQualifiers::Minimum => "minimum",
11263            ExdQualifiers::First => "first",
11264            ExdQualifiers::Second => "second",
11265            ExdQualifiers::Third => "third",
11266            ExdQualifiers::Shifter => "shifter",
11267            ExdQualifiers::LastSport => "last_sport",
11268            ExdQualifiers::Moving => "moving",
11269            ExdQualifiers::Stopped => "stopped",
11270            ExdQualifiers::EstimatedTotal => "estimated_total",
11271            ExdQualifiers::Zone9 => "zone_9",
11272            ExdQualifiers::Zone8 => "zone_8",
11273            ExdQualifiers::Zone7 => "zone_7",
11274            ExdQualifiers::Zone6 => "zone_6",
11275            ExdQualifiers::Zone5 => "zone_5",
11276            ExdQualifiers::Zone4 => "zone_4",
11277            ExdQualifiers::Zone3 => "zone_3",
11278            ExdQualifiers::Zone2 => "zone_2",
11279            ExdQualifiers::Zone1 => "zone_1",
11280        }
11281    }
11282
11283    /// Try to construct from the underlying numeric value.
11284    pub fn from_value(value: u8) -> Option<Self> {
11285        match value {
11286            0 => Some(ExdQualifiers::NoQualifier),
11287            1 => Some(ExdQualifiers::Instantaneous),
11288            2 => Some(ExdQualifiers::Average),
11289            3 => Some(ExdQualifiers::Lap),
11290            4 => Some(ExdQualifiers::Maximum),
11291            5 => Some(ExdQualifiers::MaximumAverage),
11292            6 => Some(ExdQualifiers::MaximumLap),
11293            7 => Some(ExdQualifiers::LastLap),
11294            8 => Some(ExdQualifiers::AverageLap),
11295            9 => Some(ExdQualifiers::ToDestination),
11296            10 => Some(ExdQualifiers::ToGo),
11297            11 => Some(ExdQualifiers::ToNext),
11298            12 => Some(ExdQualifiers::NextCoursePoint),
11299            13 => Some(ExdQualifiers::Total),
11300            14 => Some(ExdQualifiers::ThreeSecondAverage),
11301            15 => Some(ExdQualifiers::TenSecondAverage),
11302            16 => Some(ExdQualifiers::ThirtySecondAverage),
11303            17 => Some(ExdQualifiers::PercentMaximum),
11304            18 => Some(ExdQualifiers::PercentMaximumAverage),
11305            19 => Some(ExdQualifiers::LapPercentMaximum),
11306            20 => Some(ExdQualifiers::Elapsed),
11307            21 => Some(ExdQualifiers::Sunrise),
11308            22 => Some(ExdQualifiers::Sunset),
11309            23 => Some(ExdQualifiers::ComparedToVirtualPartner),
11310            24 => Some(ExdQualifiers::Maximum24h),
11311            25 => Some(ExdQualifiers::Minimum24h),
11312            26 => Some(ExdQualifiers::Minimum),
11313            27 => Some(ExdQualifiers::First),
11314            28 => Some(ExdQualifiers::Second),
11315            29 => Some(ExdQualifiers::Third),
11316            30 => Some(ExdQualifiers::Shifter),
11317            31 => Some(ExdQualifiers::LastSport),
11318            32 => Some(ExdQualifiers::Moving),
11319            33 => Some(ExdQualifiers::Stopped),
11320            34 => Some(ExdQualifiers::EstimatedTotal),
11321            242 => Some(ExdQualifiers::Zone9),
11322            243 => Some(ExdQualifiers::Zone8),
11323            244 => Some(ExdQualifiers::Zone7),
11324            245 => Some(ExdQualifiers::Zone6),
11325            246 => Some(ExdQualifiers::Zone5),
11326            247 => Some(ExdQualifiers::Zone4),
11327            248 => Some(ExdQualifiers::Zone3),
11328            249 => Some(ExdQualifiers::Zone2),
11329            250 => Some(ExdQualifiers::Zone1),
11330            _ => None,
11331        }
11332    }
11333
11334    /// Try to construct from the snake-case canonical name.
11335    pub fn from_str(name: &str) -> Option<Self> {
11336        match name {
11337            "no_qualifier" => Some(ExdQualifiers::NoQualifier),
11338            "instantaneous" => Some(ExdQualifiers::Instantaneous),
11339            "average" => Some(ExdQualifiers::Average),
11340            "lap" => Some(ExdQualifiers::Lap),
11341            "maximum" => Some(ExdQualifiers::Maximum),
11342            "maximum_average" => Some(ExdQualifiers::MaximumAverage),
11343            "maximum_lap" => Some(ExdQualifiers::MaximumLap),
11344            "last_lap" => Some(ExdQualifiers::LastLap),
11345            "average_lap" => Some(ExdQualifiers::AverageLap),
11346            "to_destination" => Some(ExdQualifiers::ToDestination),
11347            "to_go" => Some(ExdQualifiers::ToGo),
11348            "to_next" => Some(ExdQualifiers::ToNext),
11349            "next_course_point" => Some(ExdQualifiers::NextCoursePoint),
11350            "total" => Some(ExdQualifiers::Total),
11351            "three_second_average" => Some(ExdQualifiers::ThreeSecondAverage),
11352            "ten_second_average" => Some(ExdQualifiers::TenSecondAverage),
11353            "thirty_second_average" => Some(ExdQualifiers::ThirtySecondAverage),
11354            "percent_maximum" => Some(ExdQualifiers::PercentMaximum),
11355            "percent_maximum_average" => Some(ExdQualifiers::PercentMaximumAverage),
11356            "lap_percent_maximum" => Some(ExdQualifiers::LapPercentMaximum),
11357            "elapsed" => Some(ExdQualifiers::Elapsed),
11358            "sunrise" => Some(ExdQualifiers::Sunrise),
11359            "sunset" => Some(ExdQualifiers::Sunset),
11360            "compared_to_virtual_partner" => Some(ExdQualifiers::ComparedToVirtualPartner),
11361            "maximum_24h" => Some(ExdQualifiers::Maximum24h),
11362            "minimum_24h" => Some(ExdQualifiers::Minimum24h),
11363            "minimum" => Some(ExdQualifiers::Minimum),
11364            "first" => Some(ExdQualifiers::First),
11365            "second" => Some(ExdQualifiers::Second),
11366            "third" => Some(ExdQualifiers::Third),
11367            "shifter" => Some(ExdQualifiers::Shifter),
11368            "last_sport" => Some(ExdQualifiers::LastSport),
11369            "moving" => Some(ExdQualifiers::Moving),
11370            "stopped" => Some(ExdQualifiers::Stopped),
11371            "estimated_total" => Some(ExdQualifiers::EstimatedTotal),
11372            "zone_9" => Some(ExdQualifiers::Zone9),
11373            "zone_8" => Some(ExdQualifiers::Zone8),
11374            "zone_7" => Some(ExdQualifiers::Zone7),
11375            "zone_6" => Some(ExdQualifiers::Zone6),
11376            "zone_5" => Some(ExdQualifiers::Zone5),
11377            "zone_4" => Some(ExdQualifiers::Zone4),
11378            "zone_3" => Some(ExdQualifiers::Zone3),
11379            "zone_2" => Some(ExdQualifiers::Zone2),
11380            "zone_1" => Some(ExdQualifiers::Zone1),
11381            _ => None,
11382        }
11383    }
11384}
11385
11386#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
11387#[repr(u8)]
11388#[non_exhaustive]
11389pub enum ExdDescriptors {
11390    BikeLightBatteryStatus = 0,
11391    BeamAngleStatus = 1,
11392    BateryLevel = 2,
11393    LightNetworkMode = 3,
11394    NumberLightsConnected = 4,
11395    Cadence = 5,
11396    Distance = 6,
11397    EstimatedTimeOfArrival = 7,
11398    Heading = 8,
11399    Time = 9,
11400    BatteryLevel = 10,
11401    TrainerResistance = 11,
11402    TrainerTargetPower = 12,
11403    TimeSeated = 13,
11404    TimeStanding = 14,
11405    Elevation = 15,
11406    Grade = 16,
11407    Ascent = 17,
11408    Descent = 18,
11409    VerticalSpeed = 19,
11410    Di2BatteryLevel = 20,
11411    FrontGear = 21,
11412    RearGear = 22,
11413    GearRatio = 23,
11414    HeartRate = 24,
11415    HeartRateZone = 25,
11416    TimeInHeartRateZone = 26,
11417    HeartRateReserve = 27,
11418    Calories = 28,
11419    GpsAccuracy = 29,
11420    GpsSignalStrength = 30,
11421    Temperature = 31,
11422    TimeOfDay = 32,
11423    Balance = 33,
11424    PedalSmoothness = 34,
11425    Power = 35,
11426    FunctionalThresholdPower = 36,
11427    IntensityFactor = 37,
11428    Work = 38,
11429    PowerRatio = 39,
11430    NormalizedPower = 40,
11431    TrainingStressScore = 41,
11432    TimeOnZone = 42,
11433    Speed = 43,
11434    Laps = 44,
11435    Reps = 45,
11436    WorkoutStep = 46,
11437    CourseDistance = 47,
11438    NavigationDistance = 48,
11439    CourseEstimatedTimeOfArrival = 49,
11440    NavigationEstimatedTimeOfArrival = 50,
11441    CourseTime = 51,
11442    NavigationTime = 52,
11443    CourseHeading = 53,
11444    NavigationHeading = 54,
11445    PowerZone = 55,
11446    TorqueEffectiveness = 56,
11447    TimerTime = 57,
11448    PowerWeightRatio = 58,
11449    LeftPlatformCenterOffset = 59,
11450    RightPlatformCenterOffset = 60,
11451    LeftPowerPhaseStartAngle = 61,
11452    RightPowerPhaseStartAngle = 62,
11453    LeftPowerPhaseFinishAngle = 63,
11454    RightPowerPhaseFinishAngle = 64,
11455    Gears = 65,
11456    Pace = 66,
11457    TrainingEffect = 67,
11458    VerticalOscillation = 68,
11459    VerticalRatio = 69,
11460    GroundContactTime = 70,
11461    LeftGroundContactTimeBalance = 71,
11462    RightGroundContactTimeBalance = 72,
11463    StrideLength = 73,
11464    RunningCadence = 74,
11465    PerformanceCondition = 75,
11466    CourseType = 76,
11467    TimeInPowerZone = 77,
11468    NavigationTurn = 78,
11469    CourseLocation = 79,
11470    NavigationLocation = 80,
11471    Compass = 81,
11472    GearCombo = 82,
11473    MuscleOxygen = 83,
11474    Icon = 84,
11475    CompassHeading = 85,
11476    GpsHeading = 86,
11477    GpsElevation = 87,
11478    AnaerobicTrainingEffect = 88,
11479    Course = 89,
11480    OffCourse = 90,
11481    GlideRatio = 91,
11482    VerticalDistance = 92,
11483    Vmg = 93,
11484    AmbientPressure = 94,
11485    Pressure = 95,
11486    Vam = 96,
11487}
11488
11489impl ExdDescriptors {
11490    /// Snake-case canonical name from Profile.xlsx.
11491    pub fn as_str(&self) -> &'static str {
11492        match self {
11493            ExdDescriptors::BikeLightBatteryStatus => "bike_light_battery_status",
11494            ExdDescriptors::BeamAngleStatus => "beam_angle_status",
11495            ExdDescriptors::BateryLevel => "batery_level",
11496            ExdDescriptors::LightNetworkMode => "light_network_mode",
11497            ExdDescriptors::NumberLightsConnected => "number_lights_connected",
11498            ExdDescriptors::Cadence => "cadence",
11499            ExdDescriptors::Distance => "distance",
11500            ExdDescriptors::EstimatedTimeOfArrival => "estimated_time_of_arrival",
11501            ExdDescriptors::Heading => "heading",
11502            ExdDescriptors::Time => "time",
11503            ExdDescriptors::BatteryLevel => "battery_level",
11504            ExdDescriptors::TrainerResistance => "trainer_resistance",
11505            ExdDescriptors::TrainerTargetPower => "trainer_target_power",
11506            ExdDescriptors::TimeSeated => "time_seated",
11507            ExdDescriptors::TimeStanding => "time_standing",
11508            ExdDescriptors::Elevation => "elevation",
11509            ExdDescriptors::Grade => "grade",
11510            ExdDescriptors::Ascent => "ascent",
11511            ExdDescriptors::Descent => "descent",
11512            ExdDescriptors::VerticalSpeed => "vertical_speed",
11513            ExdDescriptors::Di2BatteryLevel => "di2_battery_level",
11514            ExdDescriptors::FrontGear => "front_gear",
11515            ExdDescriptors::RearGear => "rear_gear",
11516            ExdDescriptors::GearRatio => "gear_ratio",
11517            ExdDescriptors::HeartRate => "heart_rate",
11518            ExdDescriptors::HeartRateZone => "heart_rate_zone",
11519            ExdDescriptors::TimeInHeartRateZone => "time_in_heart_rate_zone",
11520            ExdDescriptors::HeartRateReserve => "heart_rate_reserve",
11521            ExdDescriptors::Calories => "calories",
11522            ExdDescriptors::GpsAccuracy => "gps_accuracy",
11523            ExdDescriptors::GpsSignalStrength => "gps_signal_strength",
11524            ExdDescriptors::Temperature => "temperature",
11525            ExdDescriptors::TimeOfDay => "time_of_day",
11526            ExdDescriptors::Balance => "balance",
11527            ExdDescriptors::PedalSmoothness => "pedal_smoothness",
11528            ExdDescriptors::Power => "power",
11529            ExdDescriptors::FunctionalThresholdPower => "functional_threshold_power",
11530            ExdDescriptors::IntensityFactor => "intensity_factor",
11531            ExdDescriptors::Work => "work",
11532            ExdDescriptors::PowerRatio => "power_ratio",
11533            ExdDescriptors::NormalizedPower => "normalized_power",
11534            ExdDescriptors::TrainingStressScore => "training_stress_Score",
11535            ExdDescriptors::TimeOnZone => "time_on_zone",
11536            ExdDescriptors::Speed => "speed",
11537            ExdDescriptors::Laps => "laps",
11538            ExdDescriptors::Reps => "reps",
11539            ExdDescriptors::WorkoutStep => "workout_step",
11540            ExdDescriptors::CourseDistance => "course_distance",
11541            ExdDescriptors::NavigationDistance => "navigation_distance",
11542            ExdDescriptors::CourseEstimatedTimeOfArrival => "course_estimated_time_of_arrival",
11543            ExdDescriptors::NavigationEstimatedTimeOfArrival => {
11544                "navigation_estimated_time_of_arrival"
11545            }
11546            ExdDescriptors::CourseTime => "course_time",
11547            ExdDescriptors::NavigationTime => "navigation_time",
11548            ExdDescriptors::CourseHeading => "course_heading",
11549            ExdDescriptors::NavigationHeading => "navigation_heading",
11550            ExdDescriptors::PowerZone => "power_zone",
11551            ExdDescriptors::TorqueEffectiveness => "torque_effectiveness",
11552            ExdDescriptors::TimerTime => "timer_time",
11553            ExdDescriptors::PowerWeightRatio => "power_weight_ratio",
11554            ExdDescriptors::LeftPlatformCenterOffset => "left_platform_center_offset",
11555            ExdDescriptors::RightPlatformCenterOffset => "right_platform_center_offset",
11556            ExdDescriptors::LeftPowerPhaseStartAngle => "left_power_phase_start_angle",
11557            ExdDescriptors::RightPowerPhaseStartAngle => "right_power_phase_start_angle",
11558            ExdDescriptors::LeftPowerPhaseFinishAngle => "left_power_phase_finish_angle",
11559            ExdDescriptors::RightPowerPhaseFinishAngle => "right_power_phase_finish_angle",
11560            ExdDescriptors::Gears => "gears",
11561            ExdDescriptors::Pace => "pace",
11562            ExdDescriptors::TrainingEffect => "training_effect",
11563            ExdDescriptors::VerticalOscillation => "vertical_oscillation",
11564            ExdDescriptors::VerticalRatio => "vertical_ratio",
11565            ExdDescriptors::GroundContactTime => "ground_contact_time",
11566            ExdDescriptors::LeftGroundContactTimeBalance => "left_ground_contact_time_balance",
11567            ExdDescriptors::RightGroundContactTimeBalance => "right_ground_contact_time_balance",
11568            ExdDescriptors::StrideLength => "stride_length",
11569            ExdDescriptors::RunningCadence => "running_cadence",
11570            ExdDescriptors::PerformanceCondition => "performance_condition",
11571            ExdDescriptors::CourseType => "course_type",
11572            ExdDescriptors::TimeInPowerZone => "time_in_power_zone",
11573            ExdDescriptors::NavigationTurn => "navigation_turn",
11574            ExdDescriptors::CourseLocation => "course_location",
11575            ExdDescriptors::NavigationLocation => "navigation_location",
11576            ExdDescriptors::Compass => "compass",
11577            ExdDescriptors::GearCombo => "gear_combo",
11578            ExdDescriptors::MuscleOxygen => "muscle_oxygen",
11579            ExdDescriptors::Icon => "icon",
11580            ExdDescriptors::CompassHeading => "compass_heading",
11581            ExdDescriptors::GpsHeading => "gps_heading",
11582            ExdDescriptors::GpsElevation => "gps_elevation",
11583            ExdDescriptors::AnaerobicTrainingEffect => "anaerobic_training_effect",
11584            ExdDescriptors::Course => "course",
11585            ExdDescriptors::OffCourse => "off_course",
11586            ExdDescriptors::GlideRatio => "glide_ratio",
11587            ExdDescriptors::VerticalDistance => "vertical_distance",
11588            ExdDescriptors::Vmg => "vmg",
11589            ExdDescriptors::AmbientPressure => "ambient_pressure",
11590            ExdDescriptors::Pressure => "pressure",
11591            ExdDescriptors::Vam => "vam",
11592        }
11593    }
11594
11595    /// Try to construct from the underlying numeric value.
11596    pub fn from_value(value: u8) -> Option<Self> {
11597        match value {
11598            0 => Some(ExdDescriptors::BikeLightBatteryStatus),
11599            1 => Some(ExdDescriptors::BeamAngleStatus),
11600            2 => Some(ExdDescriptors::BateryLevel),
11601            3 => Some(ExdDescriptors::LightNetworkMode),
11602            4 => Some(ExdDescriptors::NumberLightsConnected),
11603            5 => Some(ExdDescriptors::Cadence),
11604            6 => Some(ExdDescriptors::Distance),
11605            7 => Some(ExdDescriptors::EstimatedTimeOfArrival),
11606            8 => Some(ExdDescriptors::Heading),
11607            9 => Some(ExdDescriptors::Time),
11608            10 => Some(ExdDescriptors::BatteryLevel),
11609            11 => Some(ExdDescriptors::TrainerResistance),
11610            12 => Some(ExdDescriptors::TrainerTargetPower),
11611            13 => Some(ExdDescriptors::TimeSeated),
11612            14 => Some(ExdDescriptors::TimeStanding),
11613            15 => Some(ExdDescriptors::Elevation),
11614            16 => Some(ExdDescriptors::Grade),
11615            17 => Some(ExdDescriptors::Ascent),
11616            18 => Some(ExdDescriptors::Descent),
11617            19 => Some(ExdDescriptors::VerticalSpeed),
11618            20 => Some(ExdDescriptors::Di2BatteryLevel),
11619            21 => Some(ExdDescriptors::FrontGear),
11620            22 => Some(ExdDescriptors::RearGear),
11621            23 => Some(ExdDescriptors::GearRatio),
11622            24 => Some(ExdDescriptors::HeartRate),
11623            25 => Some(ExdDescriptors::HeartRateZone),
11624            26 => Some(ExdDescriptors::TimeInHeartRateZone),
11625            27 => Some(ExdDescriptors::HeartRateReserve),
11626            28 => Some(ExdDescriptors::Calories),
11627            29 => Some(ExdDescriptors::GpsAccuracy),
11628            30 => Some(ExdDescriptors::GpsSignalStrength),
11629            31 => Some(ExdDescriptors::Temperature),
11630            32 => Some(ExdDescriptors::TimeOfDay),
11631            33 => Some(ExdDescriptors::Balance),
11632            34 => Some(ExdDescriptors::PedalSmoothness),
11633            35 => Some(ExdDescriptors::Power),
11634            36 => Some(ExdDescriptors::FunctionalThresholdPower),
11635            37 => Some(ExdDescriptors::IntensityFactor),
11636            38 => Some(ExdDescriptors::Work),
11637            39 => Some(ExdDescriptors::PowerRatio),
11638            40 => Some(ExdDescriptors::NormalizedPower),
11639            41 => Some(ExdDescriptors::TrainingStressScore),
11640            42 => Some(ExdDescriptors::TimeOnZone),
11641            43 => Some(ExdDescriptors::Speed),
11642            44 => Some(ExdDescriptors::Laps),
11643            45 => Some(ExdDescriptors::Reps),
11644            46 => Some(ExdDescriptors::WorkoutStep),
11645            47 => Some(ExdDescriptors::CourseDistance),
11646            48 => Some(ExdDescriptors::NavigationDistance),
11647            49 => Some(ExdDescriptors::CourseEstimatedTimeOfArrival),
11648            50 => Some(ExdDescriptors::NavigationEstimatedTimeOfArrival),
11649            51 => Some(ExdDescriptors::CourseTime),
11650            52 => Some(ExdDescriptors::NavigationTime),
11651            53 => Some(ExdDescriptors::CourseHeading),
11652            54 => Some(ExdDescriptors::NavigationHeading),
11653            55 => Some(ExdDescriptors::PowerZone),
11654            56 => Some(ExdDescriptors::TorqueEffectiveness),
11655            57 => Some(ExdDescriptors::TimerTime),
11656            58 => Some(ExdDescriptors::PowerWeightRatio),
11657            59 => Some(ExdDescriptors::LeftPlatformCenterOffset),
11658            60 => Some(ExdDescriptors::RightPlatformCenterOffset),
11659            61 => Some(ExdDescriptors::LeftPowerPhaseStartAngle),
11660            62 => Some(ExdDescriptors::RightPowerPhaseStartAngle),
11661            63 => Some(ExdDescriptors::LeftPowerPhaseFinishAngle),
11662            64 => Some(ExdDescriptors::RightPowerPhaseFinishAngle),
11663            65 => Some(ExdDescriptors::Gears),
11664            66 => Some(ExdDescriptors::Pace),
11665            67 => Some(ExdDescriptors::TrainingEffect),
11666            68 => Some(ExdDescriptors::VerticalOscillation),
11667            69 => Some(ExdDescriptors::VerticalRatio),
11668            70 => Some(ExdDescriptors::GroundContactTime),
11669            71 => Some(ExdDescriptors::LeftGroundContactTimeBalance),
11670            72 => Some(ExdDescriptors::RightGroundContactTimeBalance),
11671            73 => Some(ExdDescriptors::StrideLength),
11672            74 => Some(ExdDescriptors::RunningCadence),
11673            75 => Some(ExdDescriptors::PerformanceCondition),
11674            76 => Some(ExdDescriptors::CourseType),
11675            77 => Some(ExdDescriptors::TimeInPowerZone),
11676            78 => Some(ExdDescriptors::NavigationTurn),
11677            79 => Some(ExdDescriptors::CourseLocation),
11678            80 => Some(ExdDescriptors::NavigationLocation),
11679            81 => Some(ExdDescriptors::Compass),
11680            82 => Some(ExdDescriptors::GearCombo),
11681            83 => Some(ExdDescriptors::MuscleOxygen),
11682            84 => Some(ExdDescriptors::Icon),
11683            85 => Some(ExdDescriptors::CompassHeading),
11684            86 => Some(ExdDescriptors::GpsHeading),
11685            87 => Some(ExdDescriptors::GpsElevation),
11686            88 => Some(ExdDescriptors::AnaerobicTrainingEffect),
11687            89 => Some(ExdDescriptors::Course),
11688            90 => Some(ExdDescriptors::OffCourse),
11689            91 => Some(ExdDescriptors::GlideRatio),
11690            92 => Some(ExdDescriptors::VerticalDistance),
11691            93 => Some(ExdDescriptors::Vmg),
11692            94 => Some(ExdDescriptors::AmbientPressure),
11693            95 => Some(ExdDescriptors::Pressure),
11694            96 => Some(ExdDescriptors::Vam),
11695            _ => None,
11696        }
11697    }
11698
11699    /// Try to construct from the snake-case canonical name.
11700    pub fn from_str(name: &str) -> Option<Self> {
11701        match name {
11702            "bike_light_battery_status" => Some(ExdDescriptors::BikeLightBatteryStatus),
11703            "beam_angle_status" => Some(ExdDescriptors::BeamAngleStatus),
11704            "batery_level" => Some(ExdDescriptors::BateryLevel),
11705            "light_network_mode" => Some(ExdDescriptors::LightNetworkMode),
11706            "number_lights_connected" => Some(ExdDescriptors::NumberLightsConnected),
11707            "cadence" => Some(ExdDescriptors::Cadence),
11708            "distance" => Some(ExdDescriptors::Distance),
11709            "estimated_time_of_arrival" => Some(ExdDescriptors::EstimatedTimeOfArrival),
11710            "heading" => Some(ExdDescriptors::Heading),
11711            "time" => Some(ExdDescriptors::Time),
11712            "battery_level" => Some(ExdDescriptors::BatteryLevel),
11713            "trainer_resistance" => Some(ExdDescriptors::TrainerResistance),
11714            "trainer_target_power" => Some(ExdDescriptors::TrainerTargetPower),
11715            "time_seated" => Some(ExdDescriptors::TimeSeated),
11716            "time_standing" => Some(ExdDescriptors::TimeStanding),
11717            "elevation" => Some(ExdDescriptors::Elevation),
11718            "grade" => Some(ExdDescriptors::Grade),
11719            "ascent" => Some(ExdDescriptors::Ascent),
11720            "descent" => Some(ExdDescriptors::Descent),
11721            "vertical_speed" => Some(ExdDescriptors::VerticalSpeed),
11722            "di2_battery_level" => Some(ExdDescriptors::Di2BatteryLevel),
11723            "front_gear" => Some(ExdDescriptors::FrontGear),
11724            "rear_gear" => Some(ExdDescriptors::RearGear),
11725            "gear_ratio" => Some(ExdDescriptors::GearRatio),
11726            "heart_rate" => Some(ExdDescriptors::HeartRate),
11727            "heart_rate_zone" => Some(ExdDescriptors::HeartRateZone),
11728            "time_in_heart_rate_zone" => Some(ExdDescriptors::TimeInHeartRateZone),
11729            "heart_rate_reserve" => Some(ExdDescriptors::HeartRateReserve),
11730            "calories" => Some(ExdDescriptors::Calories),
11731            "gps_accuracy" => Some(ExdDescriptors::GpsAccuracy),
11732            "gps_signal_strength" => Some(ExdDescriptors::GpsSignalStrength),
11733            "temperature" => Some(ExdDescriptors::Temperature),
11734            "time_of_day" => Some(ExdDescriptors::TimeOfDay),
11735            "balance" => Some(ExdDescriptors::Balance),
11736            "pedal_smoothness" => Some(ExdDescriptors::PedalSmoothness),
11737            "power" => Some(ExdDescriptors::Power),
11738            "functional_threshold_power" => Some(ExdDescriptors::FunctionalThresholdPower),
11739            "intensity_factor" => Some(ExdDescriptors::IntensityFactor),
11740            "work" => Some(ExdDescriptors::Work),
11741            "power_ratio" => Some(ExdDescriptors::PowerRatio),
11742            "normalized_power" => Some(ExdDescriptors::NormalizedPower),
11743            "training_stress_Score" => Some(ExdDescriptors::TrainingStressScore),
11744            "time_on_zone" => Some(ExdDescriptors::TimeOnZone),
11745            "speed" => Some(ExdDescriptors::Speed),
11746            "laps" => Some(ExdDescriptors::Laps),
11747            "reps" => Some(ExdDescriptors::Reps),
11748            "workout_step" => Some(ExdDescriptors::WorkoutStep),
11749            "course_distance" => Some(ExdDescriptors::CourseDistance),
11750            "navigation_distance" => Some(ExdDescriptors::NavigationDistance),
11751            "course_estimated_time_of_arrival" => {
11752                Some(ExdDescriptors::CourseEstimatedTimeOfArrival)
11753            }
11754            "navigation_estimated_time_of_arrival" => {
11755                Some(ExdDescriptors::NavigationEstimatedTimeOfArrival)
11756            }
11757            "course_time" => Some(ExdDescriptors::CourseTime),
11758            "navigation_time" => Some(ExdDescriptors::NavigationTime),
11759            "course_heading" => Some(ExdDescriptors::CourseHeading),
11760            "navigation_heading" => Some(ExdDescriptors::NavigationHeading),
11761            "power_zone" => Some(ExdDescriptors::PowerZone),
11762            "torque_effectiveness" => Some(ExdDescriptors::TorqueEffectiveness),
11763            "timer_time" => Some(ExdDescriptors::TimerTime),
11764            "power_weight_ratio" => Some(ExdDescriptors::PowerWeightRatio),
11765            "left_platform_center_offset" => Some(ExdDescriptors::LeftPlatformCenterOffset),
11766            "right_platform_center_offset" => Some(ExdDescriptors::RightPlatformCenterOffset),
11767            "left_power_phase_start_angle" => Some(ExdDescriptors::LeftPowerPhaseStartAngle),
11768            "right_power_phase_start_angle" => Some(ExdDescriptors::RightPowerPhaseStartAngle),
11769            "left_power_phase_finish_angle" => Some(ExdDescriptors::LeftPowerPhaseFinishAngle),
11770            "right_power_phase_finish_angle" => Some(ExdDescriptors::RightPowerPhaseFinishAngle),
11771            "gears" => Some(ExdDescriptors::Gears),
11772            "pace" => Some(ExdDescriptors::Pace),
11773            "training_effect" => Some(ExdDescriptors::TrainingEffect),
11774            "vertical_oscillation" => Some(ExdDescriptors::VerticalOscillation),
11775            "vertical_ratio" => Some(ExdDescriptors::VerticalRatio),
11776            "ground_contact_time" => Some(ExdDescriptors::GroundContactTime),
11777            "left_ground_contact_time_balance" => {
11778                Some(ExdDescriptors::LeftGroundContactTimeBalance)
11779            }
11780            "right_ground_contact_time_balance" => {
11781                Some(ExdDescriptors::RightGroundContactTimeBalance)
11782            }
11783            "stride_length" => Some(ExdDescriptors::StrideLength),
11784            "running_cadence" => Some(ExdDescriptors::RunningCadence),
11785            "performance_condition" => Some(ExdDescriptors::PerformanceCondition),
11786            "course_type" => Some(ExdDescriptors::CourseType),
11787            "time_in_power_zone" => Some(ExdDescriptors::TimeInPowerZone),
11788            "navigation_turn" => Some(ExdDescriptors::NavigationTurn),
11789            "course_location" => Some(ExdDescriptors::CourseLocation),
11790            "navigation_location" => Some(ExdDescriptors::NavigationLocation),
11791            "compass" => Some(ExdDescriptors::Compass),
11792            "gear_combo" => Some(ExdDescriptors::GearCombo),
11793            "muscle_oxygen" => Some(ExdDescriptors::MuscleOxygen),
11794            "icon" => Some(ExdDescriptors::Icon),
11795            "compass_heading" => Some(ExdDescriptors::CompassHeading),
11796            "gps_heading" => Some(ExdDescriptors::GpsHeading),
11797            "gps_elevation" => Some(ExdDescriptors::GpsElevation),
11798            "anaerobic_training_effect" => Some(ExdDescriptors::AnaerobicTrainingEffect),
11799            "course" => Some(ExdDescriptors::Course),
11800            "off_course" => Some(ExdDescriptors::OffCourse),
11801            "glide_ratio" => Some(ExdDescriptors::GlideRatio),
11802            "vertical_distance" => Some(ExdDescriptors::VerticalDistance),
11803            "vmg" => Some(ExdDescriptors::Vmg),
11804            "ambient_pressure" => Some(ExdDescriptors::AmbientPressure),
11805            "pressure" => Some(ExdDescriptors::Pressure),
11806            "vam" => Some(ExdDescriptors::Vam),
11807            _ => None,
11808        }
11809    }
11810}
11811
11812#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
11813#[repr(u32)]
11814#[non_exhaustive]
11815pub enum AutoActivityDetect {
11816    None = 0,
11817    Running = 1,
11818    Cycling = 2,
11819    Swimming = 4,
11820    Walking = 8,
11821    Elliptical = 32,
11822    Sedentary = 1024,
11823}
11824
11825impl AutoActivityDetect {
11826    /// Snake-case canonical name from Profile.xlsx.
11827    pub fn as_str(&self) -> &'static str {
11828        match self {
11829            AutoActivityDetect::None => "none",
11830            AutoActivityDetect::Running => "running",
11831            AutoActivityDetect::Cycling => "cycling",
11832            AutoActivityDetect::Swimming => "swimming",
11833            AutoActivityDetect::Walking => "walking",
11834            AutoActivityDetect::Elliptical => "elliptical",
11835            AutoActivityDetect::Sedentary => "sedentary",
11836        }
11837    }
11838
11839    /// Try to construct from the underlying numeric value.
11840    pub fn from_value(value: u32) -> Option<Self> {
11841        match value {
11842            0 => Some(AutoActivityDetect::None),
11843            1 => Some(AutoActivityDetect::Running),
11844            2 => Some(AutoActivityDetect::Cycling),
11845            4 => Some(AutoActivityDetect::Swimming),
11846            8 => Some(AutoActivityDetect::Walking),
11847            32 => Some(AutoActivityDetect::Elliptical),
11848            1024 => Some(AutoActivityDetect::Sedentary),
11849            _ => None,
11850        }
11851    }
11852
11853    /// Try to construct from the snake-case canonical name.
11854    pub fn from_str(name: &str) -> Option<Self> {
11855        match name {
11856            "none" => Some(AutoActivityDetect::None),
11857            "running" => Some(AutoActivityDetect::Running),
11858            "cycling" => Some(AutoActivityDetect::Cycling),
11859            "swimming" => Some(AutoActivityDetect::Swimming),
11860            "walking" => Some(AutoActivityDetect::Walking),
11861            "elliptical" => Some(AutoActivityDetect::Elliptical),
11862            "sedentary" => Some(AutoActivityDetect::Sedentary),
11863            _ => None,
11864        }
11865    }
11866}
11867
11868#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
11869#[repr(u32)]
11870#[non_exhaustive]
11871pub enum SupportedExdScreenLayouts {
11872    FullScreen = 1,
11873    HalfVertical = 2,
11874    HalfHorizontal = 4,
11875    HalfVerticalRightSplit = 8,
11876    HalfHorizontalBottomSplit = 16,
11877    FullQuarterSplit = 32,
11878    HalfVerticalLeftSplit = 64,
11879    HalfHorizontalTopSplit = 128,
11880}
11881
11882impl SupportedExdScreenLayouts {
11883    /// Snake-case canonical name from Profile.xlsx.
11884    pub fn as_str(&self) -> &'static str {
11885        match self {
11886            SupportedExdScreenLayouts::FullScreen => "full_screen",
11887            SupportedExdScreenLayouts::HalfVertical => "half_vertical",
11888            SupportedExdScreenLayouts::HalfHorizontal => "half_horizontal",
11889            SupportedExdScreenLayouts::HalfVerticalRightSplit => "half_vertical_right_split",
11890            SupportedExdScreenLayouts::HalfHorizontalBottomSplit => "half_horizontal_bottom_split",
11891            SupportedExdScreenLayouts::FullQuarterSplit => "full_quarter_split",
11892            SupportedExdScreenLayouts::HalfVerticalLeftSplit => "half_vertical_left_split",
11893            SupportedExdScreenLayouts::HalfHorizontalTopSplit => "half_horizontal_top_split",
11894        }
11895    }
11896
11897    /// Try to construct from the underlying numeric value.
11898    pub fn from_value(value: u32) -> Option<Self> {
11899        match value {
11900            1 => Some(SupportedExdScreenLayouts::FullScreen),
11901            2 => Some(SupportedExdScreenLayouts::HalfVertical),
11902            4 => Some(SupportedExdScreenLayouts::HalfHorizontal),
11903            8 => Some(SupportedExdScreenLayouts::HalfVerticalRightSplit),
11904            16 => Some(SupportedExdScreenLayouts::HalfHorizontalBottomSplit),
11905            32 => Some(SupportedExdScreenLayouts::FullQuarterSplit),
11906            64 => Some(SupportedExdScreenLayouts::HalfVerticalLeftSplit),
11907            128 => Some(SupportedExdScreenLayouts::HalfHorizontalTopSplit),
11908            _ => None,
11909        }
11910    }
11911
11912    /// Try to construct from the snake-case canonical name.
11913    pub fn from_str(name: &str) -> Option<Self> {
11914        match name {
11915            "full_screen" => Some(SupportedExdScreenLayouts::FullScreen),
11916            "half_vertical" => Some(SupportedExdScreenLayouts::HalfVertical),
11917            "half_horizontal" => Some(SupportedExdScreenLayouts::HalfHorizontal),
11918            "half_vertical_right_split" => Some(SupportedExdScreenLayouts::HalfVerticalRightSplit),
11919            "half_horizontal_bottom_split" => {
11920                Some(SupportedExdScreenLayouts::HalfHorizontalBottomSplit)
11921            }
11922            "full_quarter_split" => Some(SupportedExdScreenLayouts::FullQuarterSplit),
11923            "half_vertical_left_split" => Some(SupportedExdScreenLayouts::HalfVerticalLeftSplit),
11924            "half_horizontal_top_split" => Some(SupportedExdScreenLayouts::HalfHorizontalTopSplit),
11925            _ => None,
11926        }
11927    }
11928}
11929
11930#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
11931#[repr(u8)]
11932#[non_exhaustive]
11933pub enum FitBaseType {
11934    Enum = 0,
11935    Sint8 = 1,
11936    Uint8 = 2,
11937    Sint16 = 131,
11938    Uint16 = 132,
11939    Sint32 = 133,
11940    Uint32 = 134,
11941    String = 7,
11942    Float32 = 136,
11943    Float64 = 137,
11944    Uint8z = 10,
11945    Uint16z = 139,
11946    Uint32z = 140,
11947    Byte = 13,
11948    Sint64 = 142,
11949    Uint64 = 143,
11950    Uint64z = 144,
11951}
11952
11953impl FitBaseType {
11954    /// Snake-case canonical name from Profile.xlsx.
11955    pub fn as_str(&self) -> &'static str {
11956        match self {
11957            FitBaseType::Enum => "enum",
11958            FitBaseType::Sint8 => "sint8",
11959            FitBaseType::Uint8 => "uint8",
11960            FitBaseType::Sint16 => "sint16",
11961            FitBaseType::Uint16 => "uint16",
11962            FitBaseType::Sint32 => "sint32",
11963            FitBaseType::Uint32 => "uint32",
11964            FitBaseType::String => "string",
11965            FitBaseType::Float32 => "float32",
11966            FitBaseType::Float64 => "float64",
11967            FitBaseType::Uint8z => "uint8z",
11968            FitBaseType::Uint16z => "uint16z",
11969            FitBaseType::Uint32z => "uint32z",
11970            FitBaseType::Byte => "byte",
11971            FitBaseType::Sint64 => "sint64",
11972            FitBaseType::Uint64 => "uint64",
11973            FitBaseType::Uint64z => "uint64z",
11974        }
11975    }
11976
11977    /// Try to construct from the underlying numeric value.
11978    pub fn from_value(value: u8) -> Option<Self> {
11979        match value {
11980            0 => Some(FitBaseType::Enum),
11981            1 => Some(FitBaseType::Sint8),
11982            2 => Some(FitBaseType::Uint8),
11983            131 => Some(FitBaseType::Sint16),
11984            132 => Some(FitBaseType::Uint16),
11985            133 => Some(FitBaseType::Sint32),
11986            134 => Some(FitBaseType::Uint32),
11987            7 => Some(FitBaseType::String),
11988            136 => Some(FitBaseType::Float32),
11989            137 => Some(FitBaseType::Float64),
11990            10 => Some(FitBaseType::Uint8z),
11991            139 => Some(FitBaseType::Uint16z),
11992            140 => Some(FitBaseType::Uint32z),
11993            13 => Some(FitBaseType::Byte),
11994            142 => Some(FitBaseType::Sint64),
11995            143 => Some(FitBaseType::Uint64),
11996            144 => Some(FitBaseType::Uint64z),
11997            _ => None,
11998        }
11999    }
12000
12001    /// Try to construct from the snake-case canonical name.
12002    pub fn from_str(name: &str) -> Option<Self> {
12003        match name {
12004            "enum" => Some(FitBaseType::Enum),
12005            "sint8" => Some(FitBaseType::Sint8),
12006            "uint8" => Some(FitBaseType::Uint8),
12007            "sint16" => Some(FitBaseType::Sint16),
12008            "uint16" => Some(FitBaseType::Uint16),
12009            "sint32" => Some(FitBaseType::Sint32),
12010            "uint32" => Some(FitBaseType::Uint32),
12011            "string" => Some(FitBaseType::String),
12012            "float32" => Some(FitBaseType::Float32),
12013            "float64" => Some(FitBaseType::Float64),
12014            "uint8z" => Some(FitBaseType::Uint8z),
12015            "uint16z" => Some(FitBaseType::Uint16z),
12016            "uint32z" => Some(FitBaseType::Uint32z),
12017            "byte" => Some(FitBaseType::Byte),
12018            "sint64" => Some(FitBaseType::Sint64),
12019            "uint64" => Some(FitBaseType::Uint64),
12020            "uint64z" => Some(FitBaseType::Uint64z),
12021            _ => None,
12022        }
12023    }
12024}
12025
12026#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
12027#[repr(u8)]
12028#[non_exhaustive]
12029pub enum TurnType {
12030    ArrivingIdx = 0,
12031    ArrivingLeftIdx = 1,
12032    ArrivingRightIdx = 2,
12033    ArrivingViaIdx = 3,
12034    ArrivingViaLeftIdx = 4,
12035    ArrivingViaRightIdx = 5,
12036    BearKeepLeftIdx = 6,
12037    BearKeepRightIdx = 7,
12038    ContinueIdx = 8,
12039    ExitLeftIdx = 9,
12040    ExitRightIdx = 10,
12041    FerryIdx = 11,
12042    Roundabout45Idx = 12,
12043    Roundabout90Idx = 13,
12044    Roundabout135Idx = 14,
12045    Roundabout180Idx = 15,
12046    Roundabout225Idx = 16,
12047    Roundabout270Idx = 17,
12048    Roundabout315Idx = 18,
12049    Roundabout360Idx = 19,
12050    RoundaboutNeg45Idx = 20,
12051    RoundaboutNeg90Idx = 21,
12052    RoundaboutNeg135Idx = 22,
12053    RoundaboutNeg180Idx = 23,
12054    RoundaboutNeg225Idx = 24,
12055    RoundaboutNeg270Idx = 25,
12056    RoundaboutNeg315Idx = 26,
12057    RoundaboutNeg360Idx = 27,
12058    RoundaboutGenericIdx = 28,
12059    RoundaboutNegGenericIdx = 29,
12060    SharpTurnLeftIdx = 30,
12061    SharpTurnRightIdx = 31,
12062    TurnLeftIdx = 32,
12063    TurnRightIdx = 33,
12064    UturnLeftIdx = 34,
12065    UturnRightIdx = 35,
12066    IconInvIdx = 36,
12067    IconIdxCnt = 37,
12068}
12069
12070impl TurnType {
12071    /// Snake-case canonical name from Profile.xlsx.
12072    pub fn as_str(&self) -> &'static str {
12073        match self {
12074            TurnType::ArrivingIdx => "arriving_idx",
12075            TurnType::ArrivingLeftIdx => "arriving_left_idx",
12076            TurnType::ArrivingRightIdx => "arriving_right_idx",
12077            TurnType::ArrivingViaIdx => "arriving_via_idx",
12078            TurnType::ArrivingViaLeftIdx => "arriving_via_left_idx",
12079            TurnType::ArrivingViaRightIdx => "arriving_via_right_idx",
12080            TurnType::BearKeepLeftIdx => "bear_keep_left_idx",
12081            TurnType::BearKeepRightIdx => "bear_keep_right_idx",
12082            TurnType::ContinueIdx => "continue_idx",
12083            TurnType::ExitLeftIdx => "exit_left_idx",
12084            TurnType::ExitRightIdx => "exit_right_idx",
12085            TurnType::FerryIdx => "ferry_idx",
12086            TurnType::Roundabout45Idx => "roundabout_45_idx",
12087            TurnType::Roundabout90Idx => "roundabout_90_idx",
12088            TurnType::Roundabout135Idx => "roundabout_135_idx",
12089            TurnType::Roundabout180Idx => "roundabout_180_idx",
12090            TurnType::Roundabout225Idx => "roundabout_225_idx",
12091            TurnType::Roundabout270Idx => "roundabout_270_idx",
12092            TurnType::Roundabout315Idx => "roundabout_315_idx",
12093            TurnType::Roundabout360Idx => "roundabout_360_idx",
12094            TurnType::RoundaboutNeg45Idx => "roundabout_neg_45_idx",
12095            TurnType::RoundaboutNeg90Idx => "roundabout_neg_90_idx",
12096            TurnType::RoundaboutNeg135Idx => "roundabout_neg_135_idx",
12097            TurnType::RoundaboutNeg180Idx => "roundabout_neg_180_idx",
12098            TurnType::RoundaboutNeg225Idx => "roundabout_neg_225_idx",
12099            TurnType::RoundaboutNeg270Idx => "roundabout_neg_270_idx",
12100            TurnType::RoundaboutNeg315Idx => "roundabout_neg_315_idx",
12101            TurnType::RoundaboutNeg360Idx => "roundabout_neg_360_idx",
12102            TurnType::RoundaboutGenericIdx => "roundabout_generic_idx",
12103            TurnType::RoundaboutNegGenericIdx => "roundabout_neg_generic_idx",
12104            TurnType::SharpTurnLeftIdx => "sharp_turn_left_idx",
12105            TurnType::SharpTurnRightIdx => "sharp_turn_right_idx",
12106            TurnType::TurnLeftIdx => "turn_left_idx",
12107            TurnType::TurnRightIdx => "turn_right_idx",
12108            TurnType::UturnLeftIdx => "uturn_left_idx",
12109            TurnType::UturnRightIdx => "uturn_right_idx",
12110            TurnType::IconInvIdx => "icon_inv_idx",
12111            TurnType::IconIdxCnt => "icon_idx_cnt",
12112        }
12113    }
12114
12115    /// Try to construct from the underlying numeric value.
12116    pub fn from_value(value: u8) -> Option<Self> {
12117        match value {
12118            0 => Some(TurnType::ArrivingIdx),
12119            1 => Some(TurnType::ArrivingLeftIdx),
12120            2 => Some(TurnType::ArrivingRightIdx),
12121            3 => Some(TurnType::ArrivingViaIdx),
12122            4 => Some(TurnType::ArrivingViaLeftIdx),
12123            5 => Some(TurnType::ArrivingViaRightIdx),
12124            6 => Some(TurnType::BearKeepLeftIdx),
12125            7 => Some(TurnType::BearKeepRightIdx),
12126            8 => Some(TurnType::ContinueIdx),
12127            9 => Some(TurnType::ExitLeftIdx),
12128            10 => Some(TurnType::ExitRightIdx),
12129            11 => Some(TurnType::FerryIdx),
12130            12 => Some(TurnType::Roundabout45Idx),
12131            13 => Some(TurnType::Roundabout90Idx),
12132            14 => Some(TurnType::Roundabout135Idx),
12133            15 => Some(TurnType::Roundabout180Idx),
12134            16 => Some(TurnType::Roundabout225Idx),
12135            17 => Some(TurnType::Roundabout270Idx),
12136            18 => Some(TurnType::Roundabout315Idx),
12137            19 => Some(TurnType::Roundabout360Idx),
12138            20 => Some(TurnType::RoundaboutNeg45Idx),
12139            21 => Some(TurnType::RoundaboutNeg90Idx),
12140            22 => Some(TurnType::RoundaboutNeg135Idx),
12141            23 => Some(TurnType::RoundaboutNeg180Idx),
12142            24 => Some(TurnType::RoundaboutNeg225Idx),
12143            25 => Some(TurnType::RoundaboutNeg270Idx),
12144            26 => Some(TurnType::RoundaboutNeg315Idx),
12145            27 => Some(TurnType::RoundaboutNeg360Idx),
12146            28 => Some(TurnType::RoundaboutGenericIdx),
12147            29 => Some(TurnType::RoundaboutNegGenericIdx),
12148            30 => Some(TurnType::SharpTurnLeftIdx),
12149            31 => Some(TurnType::SharpTurnRightIdx),
12150            32 => Some(TurnType::TurnLeftIdx),
12151            33 => Some(TurnType::TurnRightIdx),
12152            34 => Some(TurnType::UturnLeftIdx),
12153            35 => Some(TurnType::UturnRightIdx),
12154            36 => Some(TurnType::IconInvIdx),
12155            37 => Some(TurnType::IconIdxCnt),
12156            _ => None,
12157        }
12158    }
12159
12160    /// Try to construct from the snake-case canonical name.
12161    pub fn from_str(name: &str) -> Option<Self> {
12162        match name {
12163            "arriving_idx" => Some(TurnType::ArrivingIdx),
12164            "arriving_left_idx" => Some(TurnType::ArrivingLeftIdx),
12165            "arriving_right_idx" => Some(TurnType::ArrivingRightIdx),
12166            "arriving_via_idx" => Some(TurnType::ArrivingViaIdx),
12167            "arriving_via_left_idx" => Some(TurnType::ArrivingViaLeftIdx),
12168            "arriving_via_right_idx" => Some(TurnType::ArrivingViaRightIdx),
12169            "bear_keep_left_idx" => Some(TurnType::BearKeepLeftIdx),
12170            "bear_keep_right_idx" => Some(TurnType::BearKeepRightIdx),
12171            "continue_idx" => Some(TurnType::ContinueIdx),
12172            "exit_left_idx" => Some(TurnType::ExitLeftIdx),
12173            "exit_right_idx" => Some(TurnType::ExitRightIdx),
12174            "ferry_idx" => Some(TurnType::FerryIdx),
12175            "roundabout_45_idx" => Some(TurnType::Roundabout45Idx),
12176            "roundabout_90_idx" => Some(TurnType::Roundabout90Idx),
12177            "roundabout_135_idx" => Some(TurnType::Roundabout135Idx),
12178            "roundabout_180_idx" => Some(TurnType::Roundabout180Idx),
12179            "roundabout_225_idx" => Some(TurnType::Roundabout225Idx),
12180            "roundabout_270_idx" => Some(TurnType::Roundabout270Idx),
12181            "roundabout_315_idx" => Some(TurnType::Roundabout315Idx),
12182            "roundabout_360_idx" => Some(TurnType::Roundabout360Idx),
12183            "roundabout_neg_45_idx" => Some(TurnType::RoundaboutNeg45Idx),
12184            "roundabout_neg_90_idx" => Some(TurnType::RoundaboutNeg90Idx),
12185            "roundabout_neg_135_idx" => Some(TurnType::RoundaboutNeg135Idx),
12186            "roundabout_neg_180_idx" => Some(TurnType::RoundaboutNeg180Idx),
12187            "roundabout_neg_225_idx" => Some(TurnType::RoundaboutNeg225Idx),
12188            "roundabout_neg_270_idx" => Some(TurnType::RoundaboutNeg270Idx),
12189            "roundabout_neg_315_idx" => Some(TurnType::RoundaboutNeg315Idx),
12190            "roundabout_neg_360_idx" => Some(TurnType::RoundaboutNeg360Idx),
12191            "roundabout_generic_idx" => Some(TurnType::RoundaboutGenericIdx),
12192            "roundabout_neg_generic_idx" => Some(TurnType::RoundaboutNegGenericIdx),
12193            "sharp_turn_left_idx" => Some(TurnType::SharpTurnLeftIdx),
12194            "sharp_turn_right_idx" => Some(TurnType::SharpTurnRightIdx),
12195            "turn_left_idx" => Some(TurnType::TurnLeftIdx),
12196            "turn_right_idx" => Some(TurnType::TurnRightIdx),
12197            "uturn_left_idx" => Some(TurnType::UturnLeftIdx),
12198            "uturn_right_idx" => Some(TurnType::UturnRightIdx),
12199            "icon_inv_idx" => Some(TurnType::IconInvIdx),
12200            "icon_idx_cnt" => Some(TurnType::IconIdxCnt),
12201            _ => None,
12202        }
12203    }
12204}
12205
12206#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
12207#[repr(u8)]
12208#[non_exhaustive]
12209pub enum BikeLightBeamAngleMode {
12210    Manual = 0,
12211    Auto = 1,
12212}
12213
12214impl BikeLightBeamAngleMode {
12215    /// Snake-case canonical name from Profile.xlsx.
12216    pub fn as_str(&self) -> &'static str {
12217        match self {
12218            BikeLightBeamAngleMode::Manual => "manual",
12219            BikeLightBeamAngleMode::Auto => "auto",
12220        }
12221    }
12222
12223    /// Try to construct from the underlying numeric value.
12224    pub fn from_value(value: u8) -> Option<Self> {
12225        match value {
12226            0 => Some(BikeLightBeamAngleMode::Manual),
12227            1 => Some(BikeLightBeamAngleMode::Auto),
12228            _ => None,
12229        }
12230    }
12231
12232    /// Try to construct from the snake-case canonical name.
12233    pub fn from_str(name: &str) -> Option<Self> {
12234        match name {
12235            "manual" => Some(BikeLightBeamAngleMode::Manual),
12236            "auto" => Some(BikeLightBeamAngleMode::Auto),
12237            _ => None,
12238        }
12239    }
12240}
12241
12242#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
12243#[repr(u16)]
12244#[non_exhaustive]
12245pub enum FitBaseUnit {
12246    Other = 0,
12247    Kilogram = 1,
12248    Pound = 2,
12249}
12250
12251impl FitBaseUnit {
12252    /// Snake-case canonical name from Profile.xlsx.
12253    pub fn as_str(&self) -> &'static str {
12254        match self {
12255            FitBaseUnit::Other => "other",
12256            FitBaseUnit::Kilogram => "kilogram",
12257            FitBaseUnit::Pound => "pound",
12258        }
12259    }
12260
12261    /// Try to construct from the underlying numeric value.
12262    pub fn from_value(value: u16) -> Option<Self> {
12263        match value {
12264            0 => Some(FitBaseUnit::Other),
12265            1 => Some(FitBaseUnit::Kilogram),
12266            2 => Some(FitBaseUnit::Pound),
12267            _ => None,
12268        }
12269    }
12270
12271    /// Try to construct from the snake-case canonical name.
12272    pub fn from_str(name: &str) -> Option<Self> {
12273        match name {
12274            "other" => Some(FitBaseUnit::Other),
12275            "kilogram" => Some(FitBaseUnit::Kilogram),
12276            "pound" => Some(FitBaseUnit::Pound),
12277            _ => None,
12278        }
12279    }
12280}
12281
12282#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
12283#[repr(u8)]
12284#[non_exhaustive]
12285pub enum SetType {
12286    Rest = 0,
12287    Active = 1,
12288}
12289
12290impl SetType {
12291    /// Snake-case canonical name from Profile.xlsx.
12292    pub fn as_str(&self) -> &'static str {
12293        match self {
12294            SetType::Rest => "rest",
12295            SetType::Active => "active",
12296        }
12297    }
12298
12299    /// Try to construct from the underlying numeric value.
12300    pub fn from_value(value: u8) -> Option<Self> {
12301        match value {
12302            0 => Some(SetType::Rest),
12303            1 => Some(SetType::Active),
12304            _ => None,
12305        }
12306    }
12307
12308    /// Try to construct from the snake-case canonical name.
12309    pub fn from_str(name: &str) -> Option<Self> {
12310        match name {
12311            "rest" => Some(SetType::Rest),
12312            "active" => Some(SetType::Active),
12313            _ => None,
12314        }
12315    }
12316}
12317
12318#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
12319#[repr(u8)]
12320#[non_exhaustive]
12321pub enum MaxMetCategory {
12322    Generic = 0,
12323    Cycling = 1,
12324}
12325
12326impl MaxMetCategory {
12327    /// Snake-case canonical name from Profile.xlsx.
12328    pub fn as_str(&self) -> &'static str {
12329        match self {
12330            MaxMetCategory::Generic => "generic",
12331            MaxMetCategory::Cycling => "cycling",
12332        }
12333    }
12334
12335    /// Try to construct from the underlying numeric value.
12336    pub fn from_value(value: u8) -> Option<Self> {
12337        match value {
12338            0 => Some(MaxMetCategory::Generic),
12339            1 => Some(MaxMetCategory::Cycling),
12340            _ => None,
12341        }
12342    }
12343
12344    /// Try to construct from the snake-case canonical name.
12345    pub fn from_str(name: &str) -> Option<Self> {
12346        match name {
12347            "generic" => Some(MaxMetCategory::Generic),
12348            "cycling" => Some(MaxMetCategory::Cycling),
12349            _ => None,
12350        }
12351    }
12352}
12353
12354#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
12355#[repr(u16)]
12356#[non_exhaustive]
12357pub enum ExerciseCategory {
12358    BenchPress = 0,
12359    CalfRaise = 1,
12360    Cardio = 2,
12361    Carry = 3,
12362    Chop = 4,
12363    Core = 5,
12364    Crunch = 6,
12365    Curl = 7,
12366    Deadlift = 8,
12367    Flye = 9,
12368    HipRaise = 10,
12369    HipStability = 11,
12370    HipSwing = 12,
12371    Hyperextension = 13,
12372    LateralRaise = 14,
12373    LegCurl = 15,
12374    LegRaise = 16,
12375    Lunge = 17,
12376    OlympicLift = 18,
12377    Plank = 19,
12378    Plyo = 20,
12379    PullUp = 21,
12380    PushUp = 22,
12381    Row = 23,
12382    ShoulderPress = 24,
12383    ShoulderStability = 25,
12384    Shrug = 26,
12385    SitUp = 27,
12386    Squat = 28,
12387    TotalBody = 29,
12388    TricepsExtension = 30,
12389    WarmUp = 31,
12390    Run = 32,
12391    Bike = 33,
12392    CardioSensors = 34,
12393    Move = 35,
12394    Pose = 36,
12395    BandedExercises = 37,
12396    BattleRope = 38,
12397    Elliptical = 39,
12398    FloorClimb = 40,
12399    IndoorBike = 41,
12400    IndoorRow = 42,
12401    Ladder = 43,
12402    Sandbag = 44,
12403    Sled = 45,
12404    SledgeHammer = 46,
12405    StairStepper = 47,
12406    Suspension = 49,
12407    Tire = 50,
12408    RunIndoor = 52,
12409    BikeOutdoor = 53,
12410    Unknown = 65534,
12411}
12412
12413impl ExerciseCategory {
12414    /// Snake-case canonical name from Profile.xlsx.
12415    pub fn as_str(&self) -> &'static str {
12416        match self {
12417            ExerciseCategory::BenchPress => "bench_press",
12418            ExerciseCategory::CalfRaise => "calf_raise",
12419            ExerciseCategory::Cardio => "cardio",
12420            ExerciseCategory::Carry => "carry",
12421            ExerciseCategory::Chop => "chop",
12422            ExerciseCategory::Core => "core",
12423            ExerciseCategory::Crunch => "crunch",
12424            ExerciseCategory::Curl => "curl",
12425            ExerciseCategory::Deadlift => "deadlift",
12426            ExerciseCategory::Flye => "flye",
12427            ExerciseCategory::HipRaise => "hip_raise",
12428            ExerciseCategory::HipStability => "hip_stability",
12429            ExerciseCategory::HipSwing => "hip_swing",
12430            ExerciseCategory::Hyperextension => "hyperextension",
12431            ExerciseCategory::LateralRaise => "lateral_raise",
12432            ExerciseCategory::LegCurl => "leg_curl",
12433            ExerciseCategory::LegRaise => "leg_raise",
12434            ExerciseCategory::Lunge => "lunge",
12435            ExerciseCategory::OlympicLift => "olympic_lift",
12436            ExerciseCategory::Plank => "plank",
12437            ExerciseCategory::Plyo => "plyo",
12438            ExerciseCategory::PullUp => "pull_up",
12439            ExerciseCategory::PushUp => "push_up",
12440            ExerciseCategory::Row => "row",
12441            ExerciseCategory::ShoulderPress => "shoulder_press",
12442            ExerciseCategory::ShoulderStability => "shoulder_stability",
12443            ExerciseCategory::Shrug => "shrug",
12444            ExerciseCategory::SitUp => "sit_up",
12445            ExerciseCategory::Squat => "squat",
12446            ExerciseCategory::TotalBody => "total_body",
12447            ExerciseCategory::TricepsExtension => "triceps_extension",
12448            ExerciseCategory::WarmUp => "warm_up",
12449            ExerciseCategory::Run => "run",
12450            ExerciseCategory::Bike => "bike",
12451            ExerciseCategory::CardioSensors => "cardio_sensors",
12452            ExerciseCategory::Move => "move",
12453            ExerciseCategory::Pose => "pose",
12454            ExerciseCategory::BandedExercises => "banded_exercises",
12455            ExerciseCategory::BattleRope => "battle_rope",
12456            ExerciseCategory::Elliptical => "elliptical",
12457            ExerciseCategory::FloorClimb => "floor_climb",
12458            ExerciseCategory::IndoorBike => "indoor_bike",
12459            ExerciseCategory::IndoorRow => "indoor_row",
12460            ExerciseCategory::Ladder => "ladder",
12461            ExerciseCategory::Sandbag => "sandbag",
12462            ExerciseCategory::Sled => "sled",
12463            ExerciseCategory::SledgeHammer => "sledge_hammer",
12464            ExerciseCategory::StairStepper => "stair_stepper",
12465            ExerciseCategory::Suspension => "suspension",
12466            ExerciseCategory::Tire => "tire",
12467            ExerciseCategory::RunIndoor => "run_indoor",
12468            ExerciseCategory::BikeOutdoor => "bike_outdoor",
12469            ExerciseCategory::Unknown => "unknown",
12470        }
12471    }
12472
12473    /// Try to construct from the underlying numeric value.
12474    pub fn from_value(value: u16) -> Option<Self> {
12475        match value {
12476            0 => Some(ExerciseCategory::BenchPress),
12477            1 => Some(ExerciseCategory::CalfRaise),
12478            2 => Some(ExerciseCategory::Cardio),
12479            3 => Some(ExerciseCategory::Carry),
12480            4 => Some(ExerciseCategory::Chop),
12481            5 => Some(ExerciseCategory::Core),
12482            6 => Some(ExerciseCategory::Crunch),
12483            7 => Some(ExerciseCategory::Curl),
12484            8 => Some(ExerciseCategory::Deadlift),
12485            9 => Some(ExerciseCategory::Flye),
12486            10 => Some(ExerciseCategory::HipRaise),
12487            11 => Some(ExerciseCategory::HipStability),
12488            12 => Some(ExerciseCategory::HipSwing),
12489            13 => Some(ExerciseCategory::Hyperextension),
12490            14 => Some(ExerciseCategory::LateralRaise),
12491            15 => Some(ExerciseCategory::LegCurl),
12492            16 => Some(ExerciseCategory::LegRaise),
12493            17 => Some(ExerciseCategory::Lunge),
12494            18 => Some(ExerciseCategory::OlympicLift),
12495            19 => Some(ExerciseCategory::Plank),
12496            20 => Some(ExerciseCategory::Plyo),
12497            21 => Some(ExerciseCategory::PullUp),
12498            22 => Some(ExerciseCategory::PushUp),
12499            23 => Some(ExerciseCategory::Row),
12500            24 => Some(ExerciseCategory::ShoulderPress),
12501            25 => Some(ExerciseCategory::ShoulderStability),
12502            26 => Some(ExerciseCategory::Shrug),
12503            27 => Some(ExerciseCategory::SitUp),
12504            28 => Some(ExerciseCategory::Squat),
12505            29 => Some(ExerciseCategory::TotalBody),
12506            30 => Some(ExerciseCategory::TricepsExtension),
12507            31 => Some(ExerciseCategory::WarmUp),
12508            32 => Some(ExerciseCategory::Run),
12509            33 => Some(ExerciseCategory::Bike),
12510            34 => Some(ExerciseCategory::CardioSensors),
12511            35 => Some(ExerciseCategory::Move),
12512            36 => Some(ExerciseCategory::Pose),
12513            37 => Some(ExerciseCategory::BandedExercises),
12514            38 => Some(ExerciseCategory::BattleRope),
12515            39 => Some(ExerciseCategory::Elliptical),
12516            40 => Some(ExerciseCategory::FloorClimb),
12517            41 => Some(ExerciseCategory::IndoorBike),
12518            42 => Some(ExerciseCategory::IndoorRow),
12519            43 => Some(ExerciseCategory::Ladder),
12520            44 => Some(ExerciseCategory::Sandbag),
12521            45 => Some(ExerciseCategory::Sled),
12522            46 => Some(ExerciseCategory::SledgeHammer),
12523            47 => Some(ExerciseCategory::StairStepper),
12524            49 => Some(ExerciseCategory::Suspension),
12525            50 => Some(ExerciseCategory::Tire),
12526            52 => Some(ExerciseCategory::RunIndoor),
12527            53 => Some(ExerciseCategory::BikeOutdoor),
12528            65534 => Some(ExerciseCategory::Unknown),
12529            _ => None,
12530        }
12531    }
12532
12533    /// Try to construct from the snake-case canonical name.
12534    pub fn from_str(name: &str) -> Option<Self> {
12535        match name {
12536            "bench_press" => Some(ExerciseCategory::BenchPress),
12537            "calf_raise" => Some(ExerciseCategory::CalfRaise),
12538            "cardio" => Some(ExerciseCategory::Cardio),
12539            "carry" => Some(ExerciseCategory::Carry),
12540            "chop" => Some(ExerciseCategory::Chop),
12541            "core" => Some(ExerciseCategory::Core),
12542            "crunch" => Some(ExerciseCategory::Crunch),
12543            "curl" => Some(ExerciseCategory::Curl),
12544            "deadlift" => Some(ExerciseCategory::Deadlift),
12545            "flye" => Some(ExerciseCategory::Flye),
12546            "hip_raise" => Some(ExerciseCategory::HipRaise),
12547            "hip_stability" => Some(ExerciseCategory::HipStability),
12548            "hip_swing" => Some(ExerciseCategory::HipSwing),
12549            "hyperextension" => Some(ExerciseCategory::Hyperextension),
12550            "lateral_raise" => Some(ExerciseCategory::LateralRaise),
12551            "leg_curl" => Some(ExerciseCategory::LegCurl),
12552            "leg_raise" => Some(ExerciseCategory::LegRaise),
12553            "lunge" => Some(ExerciseCategory::Lunge),
12554            "olympic_lift" => Some(ExerciseCategory::OlympicLift),
12555            "plank" => Some(ExerciseCategory::Plank),
12556            "plyo" => Some(ExerciseCategory::Plyo),
12557            "pull_up" => Some(ExerciseCategory::PullUp),
12558            "push_up" => Some(ExerciseCategory::PushUp),
12559            "row" => Some(ExerciseCategory::Row),
12560            "shoulder_press" => Some(ExerciseCategory::ShoulderPress),
12561            "shoulder_stability" => Some(ExerciseCategory::ShoulderStability),
12562            "shrug" => Some(ExerciseCategory::Shrug),
12563            "sit_up" => Some(ExerciseCategory::SitUp),
12564            "squat" => Some(ExerciseCategory::Squat),
12565            "total_body" => Some(ExerciseCategory::TotalBody),
12566            "triceps_extension" => Some(ExerciseCategory::TricepsExtension),
12567            "warm_up" => Some(ExerciseCategory::WarmUp),
12568            "run" => Some(ExerciseCategory::Run),
12569            "bike" => Some(ExerciseCategory::Bike),
12570            "cardio_sensors" => Some(ExerciseCategory::CardioSensors),
12571            "move" => Some(ExerciseCategory::Move),
12572            "pose" => Some(ExerciseCategory::Pose),
12573            "banded_exercises" => Some(ExerciseCategory::BandedExercises),
12574            "battle_rope" => Some(ExerciseCategory::BattleRope),
12575            "elliptical" => Some(ExerciseCategory::Elliptical),
12576            "floor_climb" => Some(ExerciseCategory::FloorClimb),
12577            "indoor_bike" => Some(ExerciseCategory::IndoorBike),
12578            "indoor_row" => Some(ExerciseCategory::IndoorRow),
12579            "ladder" => Some(ExerciseCategory::Ladder),
12580            "sandbag" => Some(ExerciseCategory::Sandbag),
12581            "sled" => Some(ExerciseCategory::Sled),
12582            "sledge_hammer" => Some(ExerciseCategory::SledgeHammer),
12583            "stair_stepper" => Some(ExerciseCategory::StairStepper),
12584            "suspension" => Some(ExerciseCategory::Suspension),
12585            "tire" => Some(ExerciseCategory::Tire),
12586            "run_indoor" => Some(ExerciseCategory::RunIndoor),
12587            "bike_outdoor" => Some(ExerciseCategory::BikeOutdoor),
12588            "unknown" => Some(ExerciseCategory::Unknown),
12589            _ => None,
12590        }
12591    }
12592}
12593
12594#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
12595#[repr(u16)]
12596#[non_exhaustive]
12597pub enum BenchPressExerciseName {
12598    AlternatingDumbbellChestPressOnSwissBall = 0,
12599    BarbellBenchPress = 1,
12600    BarbellBoardBenchPress = 2,
12601    BarbellFloorPress = 3,
12602    CloseGripBarbellBenchPress = 4,
12603    DeclineDumbbellBenchPress = 5,
12604    DumbbellBenchPress = 6,
12605    DumbbellFloorPress = 7,
12606    InclineBarbellBenchPress = 8,
12607    InclineDumbbellBenchPress = 9,
12608    InclineSmithMachineBenchPress = 10,
12609    IsometricBarbellBenchPress = 11,
12610    KettlebellChestPress = 12,
12611    NeutralGripDumbbellBenchPress = 13,
12612    NeutralGripDumbbellInclineBenchPress = 14,
12613    OneArmFloorPress = 15,
12614    WeightedOneArmFloorPress = 16,
12615    PartialLockout = 17,
12616    ReverseGripBarbellBenchPress = 18,
12617    ReverseGripInclineBenchPress = 19,
12618    SingleArmCableChestPress = 20,
12619    SingleArmDumbbellBenchPress = 21,
12620    SmithMachineBenchPress = 22,
12621    SwissBallDumbbellChestPress = 23,
12622    TripleStopBarbellBenchPress = 24,
12623    WideGripBarbellBenchPress = 25,
12624    AlternatingDumbbellChestPress = 26,
12625}
12626
12627impl BenchPressExerciseName {
12628    /// Snake-case canonical name from Profile.xlsx.
12629    pub fn as_str(&self) -> &'static str {
12630        match self {
12631            BenchPressExerciseName::AlternatingDumbbellChestPressOnSwissBall => {
12632                "alternating_dumbbell_chest_press_on_swiss_ball"
12633            }
12634            BenchPressExerciseName::BarbellBenchPress => "barbell_bench_press",
12635            BenchPressExerciseName::BarbellBoardBenchPress => "barbell_board_bench_press",
12636            BenchPressExerciseName::BarbellFloorPress => "barbell_floor_press",
12637            BenchPressExerciseName::CloseGripBarbellBenchPress => "close_grip_barbell_bench_press",
12638            BenchPressExerciseName::DeclineDumbbellBenchPress => "decline_dumbbell_bench_press",
12639            BenchPressExerciseName::DumbbellBenchPress => "dumbbell_bench_press",
12640            BenchPressExerciseName::DumbbellFloorPress => "dumbbell_floor_press",
12641            BenchPressExerciseName::InclineBarbellBenchPress => "incline_barbell_bench_press",
12642            BenchPressExerciseName::InclineDumbbellBenchPress => "incline_dumbbell_bench_press",
12643            BenchPressExerciseName::InclineSmithMachineBenchPress => {
12644                "incline_smith_machine_bench_press"
12645            }
12646            BenchPressExerciseName::IsometricBarbellBenchPress => "isometric_barbell_bench_press",
12647            BenchPressExerciseName::KettlebellChestPress => "kettlebell_chest_press",
12648            BenchPressExerciseName::NeutralGripDumbbellBenchPress => {
12649                "neutral_grip_dumbbell_bench_press"
12650            }
12651            BenchPressExerciseName::NeutralGripDumbbellInclineBenchPress => {
12652                "neutral_grip_dumbbell_incline_bench_press"
12653            }
12654            BenchPressExerciseName::OneArmFloorPress => "one_arm_floor_press",
12655            BenchPressExerciseName::WeightedOneArmFloorPress => "weighted_one_arm_floor_press",
12656            BenchPressExerciseName::PartialLockout => "partial_lockout",
12657            BenchPressExerciseName::ReverseGripBarbellBenchPress => {
12658                "reverse_grip_barbell_bench_press"
12659            }
12660            BenchPressExerciseName::ReverseGripInclineBenchPress => {
12661                "reverse_grip_incline_bench_press"
12662            }
12663            BenchPressExerciseName::SingleArmCableChestPress => "single_arm_cable_chest_press",
12664            BenchPressExerciseName::SingleArmDumbbellBenchPress => {
12665                "single_arm_dumbbell_bench_press"
12666            }
12667            BenchPressExerciseName::SmithMachineBenchPress => "smith_machine_bench_press",
12668            BenchPressExerciseName::SwissBallDumbbellChestPress => {
12669                "swiss_ball_dumbbell_chest_press"
12670            }
12671            BenchPressExerciseName::TripleStopBarbellBenchPress => {
12672                "triple_stop_barbell_bench_press"
12673            }
12674            BenchPressExerciseName::WideGripBarbellBenchPress => "wide_grip_barbell_bench_press",
12675            BenchPressExerciseName::AlternatingDumbbellChestPress => {
12676                "alternating_dumbbell_chest_press"
12677            }
12678        }
12679    }
12680
12681    /// Try to construct from the underlying numeric value.
12682    pub fn from_value(value: u16) -> Option<Self> {
12683        match value {
12684            0 => Some(BenchPressExerciseName::AlternatingDumbbellChestPressOnSwissBall),
12685            1 => Some(BenchPressExerciseName::BarbellBenchPress),
12686            2 => Some(BenchPressExerciseName::BarbellBoardBenchPress),
12687            3 => Some(BenchPressExerciseName::BarbellFloorPress),
12688            4 => Some(BenchPressExerciseName::CloseGripBarbellBenchPress),
12689            5 => Some(BenchPressExerciseName::DeclineDumbbellBenchPress),
12690            6 => Some(BenchPressExerciseName::DumbbellBenchPress),
12691            7 => Some(BenchPressExerciseName::DumbbellFloorPress),
12692            8 => Some(BenchPressExerciseName::InclineBarbellBenchPress),
12693            9 => Some(BenchPressExerciseName::InclineDumbbellBenchPress),
12694            10 => Some(BenchPressExerciseName::InclineSmithMachineBenchPress),
12695            11 => Some(BenchPressExerciseName::IsometricBarbellBenchPress),
12696            12 => Some(BenchPressExerciseName::KettlebellChestPress),
12697            13 => Some(BenchPressExerciseName::NeutralGripDumbbellBenchPress),
12698            14 => Some(BenchPressExerciseName::NeutralGripDumbbellInclineBenchPress),
12699            15 => Some(BenchPressExerciseName::OneArmFloorPress),
12700            16 => Some(BenchPressExerciseName::WeightedOneArmFloorPress),
12701            17 => Some(BenchPressExerciseName::PartialLockout),
12702            18 => Some(BenchPressExerciseName::ReverseGripBarbellBenchPress),
12703            19 => Some(BenchPressExerciseName::ReverseGripInclineBenchPress),
12704            20 => Some(BenchPressExerciseName::SingleArmCableChestPress),
12705            21 => Some(BenchPressExerciseName::SingleArmDumbbellBenchPress),
12706            22 => Some(BenchPressExerciseName::SmithMachineBenchPress),
12707            23 => Some(BenchPressExerciseName::SwissBallDumbbellChestPress),
12708            24 => Some(BenchPressExerciseName::TripleStopBarbellBenchPress),
12709            25 => Some(BenchPressExerciseName::WideGripBarbellBenchPress),
12710            26 => Some(BenchPressExerciseName::AlternatingDumbbellChestPress),
12711            _ => None,
12712        }
12713    }
12714
12715    /// Try to construct from the snake-case canonical name.
12716    pub fn from_str(name: &str) -> Option<Self> {
12717        match name {
12718            "alternating_dumbbell_chest_press_on_swiss_ball" => {
12719                Some(BenchPressExerciseName::AlternatingDumbbellChestPressOnSwissBall)
12720            }
12721            "barbell_bench_press" => Some(BenchPressExerciseName::BarbellBenchPress),
12722            "barbell_board_bench_press" => Some(BenchPressExerciseName::BarbellBoardBenchPress),
12723            "barbell_floor_press" => Some(BenchPressExerciseName::BarbellFloorPress),
12724            "close_grip_barbell_bench_press" => {
12725                Some(BenchPressExerciseName::CloseGripBarbellBenchPress)
12726            }
12727            "decline_dumbbell_bench_press" => {
12728                Some(BenchPressExerciseName::DeclineDumbbellBenchPress)
12729            }
12730            "dumbbell_bench_press" => Some(BenchPressExerciseName::DumbbellBenchPress),
12731            "dumbbell_floor_press" => Some(BenchPressExerciseName::DumbbellFloorPress),
12732            "incline_barbell_bench_press" => Some(BenchPressExerciseName::InclineBarbellBenchPress),
12733            "incline_dumbbell_bench_press" => {
12734                Some(BenchPressExerciseName::InclineDumbbellBenchPress)
12735            }
12736            "incline_smith_machine_bench_press" => {
12737                Some(BenchPressExerciseName::InclineSmithMachineBenchPress)
12738            }
12739            "isometric_barbell_bench_press" => {
12740                Some(BenchPressExerciseName::IsometricBarbellBenchPress)
12741            }
12742            "kettlebell_chest_press" => Some(BenchPressExerciseName::KettlebellChestPress),
12743            "neutral_grip_dumbbell_bench_press" => {
12744                Some(BenchPressExerciseName::NeutralGripDumbbellBenchPress)
12745            }
12746            "neutral_grip_dumbbell_incline_bench_press" => {
12747                Some(BenchPressExerciseName::NeutralGripDumbbellInclineBenchPress)
12748            }
12749            "one_arm_floor_press" => Some(BenchPressExerciseName::OneArmFloorPress),
12750            "weighted_one_arm_floor_press" => {
12751                Some(BenchPressExerciseName::WeightedOneArmFloorPress)
12752            }
12753            "partial_lockout" => Some(BenchPressExerciseName::PartialLockout),
12754            "reverse_grip_barbell_bench_press" => {
12755                Some(BenchPressExerciseName::ReverseGripBarbellBenchPress)
12756            }
12757            "reverse_grip_incline_bench_press" => {
12758                Some(BenchPressExerciseName::ReverseGripInclineBenchPress)
12759            }
12760            "single_arm_cable_chest_press" => {
12761                Some(BenchPressExerciseName::SingleArmCableChestPress)
12762            }
12763            "single_arm_dumbbell_bench_press" => {
12764                Some(BenchPressExerciseName::SingleArmDumbbellBenchPress)
12765            }
12766            "smith_machine_bench_press" => Some(BenchPressExerciseName::SmithMachineBenchPress),
12767            "swiss_ball_dumbbell_chest_press" => {
12768                Some(BenchPressExerciseName::SwissBallDumbbellChestPress)
12769            }
12770            "triple_stop_barbell_bench_press" => {
12771                Some(BenchPressExerciseName::TripleStopBarbellBenchPress)
12772            }
12773            "wide_grip_barbell_bench_press" => {
12774                Some(BenchPressExerciseName::WideGripBarbellBenchPress)
12775            }
12776            "alternating_dumbbell_chest_press" => {
12777                Some(BenchPressExerciseName::AlternatingDumbbellChestPress)
12778            }
12779            _ => None,
12780        }
12781    }
12782}
12783
12784#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
12785#[repr(u16)]
12786#[non_exhaustive]
12787pub enum CalfRaiseExerciseName {
12788    _3WayCalfRaise = 0,
12789    _3WayWeightedCalfRaise = 1,
12790    _3WaySingleLegCalfRaise = 2,
12791    _3WayWeightedSingleLegCalfRaise = 3,
12792    DonkeyCalfRaise = 4,
12793    WeightedDonkeyCalfRaise = 5,
12794    SeatedCalfRaise = 6,
12795    WeightedSeatedCalfRaise = 7,
12796    SeatedDumbbellToeRaise = 8,
12797    SingleLegBentKneeCalfRaise = 9,
12798    WeightedSingleLegBentKneeCalfRaise = 10,
12799    SingleLegDeclinePushUp = 11,
12800    SingleLegDonkeyCalfRaise = 12,
12801    WeightedSingleLegDonkeyCalfRaise = 13,
12802    SingleLegHipRaiseWithKneeHold = 14,
12803    SingleLegStandingCalfRaise = 15,
12804    SingleLegStandingDumbbellCalfRaise = 16,
12805    StandingBarbellCalfRaise = 17,
12806    StandingCalfRaise = 18,
12807    WeightedStandingCalfRaise = 19,
12808    StandingDumbbellCalfRaise = 20,
12809}
12810
12811impl CalfRaiseExerciseName {
12812    /// Snake-case canonical name from Profile.xlsx.
12813    pub fn as_str(&self) -> &'static str {
12814        match self {
12815            CalfRaiseExerciseName::_3WayCalfRaise => "3_way_calf_raise",
12816            CalfRaiseExerciseName::_3WayWeightedCalfRaise => "3_way_weighted_calf_raise",
12817            CalfRaiseExerciseName::_3WaySingleLegCalfRaise => "3_way_single_leg_calf_raise",
12818            CalfRaiseExerciseName::_3WayWeightedSingleLegCalfRaise => {
12819                "3_way_weighted_single_leg_calf_raise"
12820            }
12821            CalfRaiseExerciseName::DonkeyCalfRaise => "donkey_calf_raise",
12822            CalfRaiseExerciseName::WeightedDonkeyCalfRaise => "weighted_donkey_calf_raise",
12823            CalfRaiseExerciseName::SeatedCalfRaise => "seated_calf_raise",
12824            CalfRaiseExerciseName::WeightedSeatedCalfRaise => "weighted_seated_calf_raise",
12825            CalfRaiseExerciseName::SeatedDumbbellToeRaise => "seated_dumbbell_toe_raise",
12826            CalfRaiseExerciseName::SingleLegBentKneeCalfRaise => "single_leg_bent_knee_calf_raise",
12827            CalfRaiseExerciseName::WeightedSingleLegBentKneeCalfRaise => {
12828                "weighted_single_leg_bent_knee_calf_raise"
12829            }
12830            CalfRaiseExerciseName::SingleLegDeclinePushUp => "single_leg_decline_push_up",
12831            CalfRaiseExerciseName::SingleLegDonkeyCalfRaise => "single_leg_donkey_calf_raise",
12832            CalfRaiseExerciseName::WeightedSingleLegDonkeyCalfRaise => {
12833                "weighted_single_leg_donkey_calf_raise"
12834            }
12835            CalfRaiseExerciseName::SingleLegHipRaiseWithKneeHold => {
12836                "single_leg_hip_raise_with_knee_hold"
12837            }
12838            CalfRaiseExerciseName::SingleLegStandingCalfRaise => "single_leg_standing_calf_raise",
12839            CalfRaiseExerciseName::SingleLegStandingDumbbellCalfRaise => {
12840                "single_leg_standing_dumbbell_calf_raise"
12841            }
12842            CalfRaiseExerciseName::StandingBarbellCalfRaise => "standing_barbell_calf_raise",
12843            CalfRaiseExerciseName::StandingCalfRaise => "standing_calf_raise",
12844            CalfRaiseExerciseName::WeightedStandingCalfRaise => "weighted_standing_calf_raise",
12845            CalfRaiseExerciseName::StandingDumbbellCalfRaise => "standing_dumbbell_calf_raise",
12846        }
12847    }
12848
12849    /// Try to construct from the underlying numeric value.
12850    pub fn from_value(value: u16) -> Option<Self> {
12851        match value {
12852            0 => Some(CalfRaiseExerciseName::_3WayCalfRaise),
12853            1 => Some(CalfRaiseExerciseName::_3WayWeightedCalfRaise),
12854            2 => Some(CalfRaiseExerciseName::_3WaySingleLegCalfRaise),
12855            3 => Some(CalfRaiseExerciseName::_3WayWeightedSingleLegCalfRaise),
12856            4 => Some(CalfRaiseExerciseName::DonkeyCalfRaise),
12857            5 => Some(CalfRaiseExerciseName::WeightedDonkeyCalfRaise),
12858            6 => Some(CalfRaiseExerciseName::SeatedCalfRaise),
12859            7 => Some(CalfRaiseExerciseName::WeightedSeatedCalfRaise),
12860            8 => Some(CalfRaiseExerciseName::SeatedDumbbellToeRaise),
12861            9 => Some(CalfRaiseExerciseName::SingleLegBentKneeCalfRaise),
12862            10 => Some(CalfRaiseExerciseName::WeightedSingleLegBentKneeCalfRaise),
12863            11 => Some(CalfRaiseExerciseName::SingleLegDeclinePushUp),
12864            12 => Some(CalfRaiseExerciseName::SingleLegDonkeyCalfRaise),
12865            13 => Some(CalfRaiseExerciseName::WeightedSingleLegDonkeyCalfRaise),
12866            14 => Some(CalfRaiseExerciseName::SingleLegHipRaiseWithKneeHold),
12867            15 => Some(CalfRaiseExerciseName::SingleLegStandingCalfRaise),
12868            16 => Some(CalfRaiseExerciseName::SingleLegStandingDumbbellCalfRaise),
12869            17 => Some(CalfRaiseExerciseName::StandingBarbellCalfRaise),
12870            18 => Some(CalfRaiseExerciseName::StandingCalfRaise),
12871            19 => Some(CalfRaiseExerciseName::WeightedStandingCalfRaise),
12872            20 => Some(CalfRaiseExerciseName::StandingDumbbellCalfRaise),
12873            _ => None,
12874        }
12875    }
12876
12877    /// Try to construct from the snake-case canonical name.
12878    pub fn from_str(name: &str) -> Option<Self> {
12879        match name {
12880            "3_way_calf_raise" => Some(CalfRaiseExerciseName::_3WayCalfRaise),
12881            "3_way_weighted_calf_raise" => Some(CalfRaiseExerciseName::_3WayWeightedCalfRaise),
12882            "3_way_single_leg_calf_raise" => Some(CalfRaiseExerciseName::_3WaySingleLegCalfRaise),
12883            "3_way_weighted_single_leg_calf_raise" => {
12884                Some(CalfRaiseExerciseName::_3WayWeightedSingleLegCalfRaise)
12885            }
12886            "donkey_calf_raise" => Some(CalfRaiseExerciseName::DonkeyCalfRaise),
12887            "weighted_donkey_calf_raise" => Some(CalfRaiseExerciseName::WeightedDonkeyCalfRaise),
12888            "seated_calf_raise" => Some(CalfRaiseExerciseName::SeatedCalfRaise),
12889            "weighted_seated_calf_raise" => Some(CalfRaiseExerciseName::WeightedSeatedCalfRaise),
12890            "seated_dumbbell_toe_raise" => Some(CalfRaiseExerciseName::SeatedDumbbellToeRaise),
12891            "single_leg_bent_knee_calf_raise" => {
12892                Some(CalfRaiseExerciseName::SingleLegBentKneeCalfRaise)
12893            }
12894            "weighted_single_leg_bent_knee_calf_raise" => {
12895                Some(CalfRaiseExerciseName::WeightedSingleLegBentKneeCalfRaise)
12896            }
12897            "single_leg_decline_push_up" => Some(CalfRaiseExerciseName::SingleLegDeclinePushUp),
12898            "single_leg_donkey_calf_raise" => Some(CalfRaiseExerciseName::SingleLegDonkeyCalfRaise),
12899            "weighted_single_leg_donkey_calf_raise" => {
12900                Some(CalfRaiseExerciseName::WeightedSingleLegDonkeyCalfRaise)
12901            }
12902            "single_leg_hip_raise_with_knee_hold" => {
12903                Some(CalfRaiseExerciseName::SingleLegHipRaiseWithKneeHold)
12904            }
12905            "single_leg_standing_calf_raise" => {
12906                Some(CalfRaiseExerciseName::SingleLegStandingCalfRaise)
12907            }
12908            "single_leg_standing_dumbbell_calf_raise" => {
12909                Some(CalfRaiseExerciseName::SingleLegStandingDumbbellCalfRaise)
12910            }
12911            "standing_barbell_calf_raise" => Some(CalfRaiseExerciseName::StandingBarbellCalfRaise),
12912            "standing_calf_raise" => Some(CalfRaiseExerciseName::StandingCalfRaise),
12913            "weighted_standing_calf_raise" => {
12914                Some(CalfRaiseExerciseName::WeightedStandingCalfRaise)
12915            }
12916            "standing_dumbbell_calf_raise" => {
12917                Some(CalfRaiseExerciseName::StandingDumbbellCalfRaise)
12918            }
12919            _ => None,
12920        }
12921    }
12922}
12923
12924#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
12925#[repr(u16)]
12926#[non_exhaustive]
12927pub enum CardioExerciseName {
12928    BobAndWeaveCircle = 0,
12929    WeightedBobAndWeaveCircle = 1,
12930    CardioCoreCrawl = 2,
12931    WeightedCardioCoreCrawl = 3,
12932    DoubleUnder = 4,
12933    WeightedDoubleUnder = 5,
12934    JumpRope = 6,
12935    WeightedJumpRope = 7,
12936    JumpRopeCrossover = 8,
12937    WeightedJumpRopeCrossover = 9,
12938    JumpRopeJog = 10,
12939    WeightedJumpRopeJog = 11,
12940    JumpingJacks = 12,
12941    WeightedJumpingJacks = 13,
12942    SkiMoguls = 14,
12943    WeightedSkiMoguls = 15,
12944    SplitJacks = 16,
12945    WeightedSplitJacks = 17,
12946    SquatJacks = 18,
12947    WeightedSquatJacks = 19,
12948    TripleUnder = 20,
12949    WeightedTripleUnder = 21,
12950    Elliptical = 22,
12951    Spinning = 23,
12952    PolePaddleForwardWheelchair = 24,
12953    PolePaddleBackwardWheelchair = 25,
12954    PoleHandcycleForwardWheelchair = 26,
12955    PoleHandcycleBackwardWheelchair = 27,
12956    PoleRainbowWheelchair = 28,
12957    DoublePunchForwardWheelchair = 29,
12958    DoublePunchDownWheelchair = 30,
12959    DoublePunchSidewaysWheelchair = 31,
12960    DoublePunchUpWheelchair = 32,
12961    SitSkiWheelchair = 33,
12962    SittingJacksWheelchair = 34,
12963    PunchForwardWheelchair = 35,
12964    PunchDownWheelchair = 36,
12965    PunchSidewaysWheelchair = 37,
12966    PunchUpWheelchair = 38,
12967    PunchBagWheelchair = 39,
12968    PoleDdFfUuWheelchair = 40,
12969    ButterflyArmsWheelchair = 41,
12970    Punch = 42,
12971}
12972
12973impl CardioExerciseName {
12974    /// Snake-case canonical name from Profile.xlsx.
12975    pub fn as_str(&self) -> &'static str {
12976        match self {
12977            CardioExerciseName::BobAndWeaveCircle => "bob_and_weave_circle",
12978            CardioExerciseName::WeightedBobAndWeaveCircle => "weighted_bob_and_weave_circle",
12979            CardioExerciseName::CardioCoreCrawl => "cardio_core_crawl",
12980            CardioExerciseName::WeightedCardioCoreCrawl => "weighted_cardio_core_crawl",
12981            CardioExerciseName::DoubleUnder => "double_under",
12982            CardioExerciseName::WeightedDoubleUnder => "weighted_double_under",
12983            CardioExerciseName::JumpRope => "jump_rope",
12984            CardioExerciseName::WeightedJumpRope => "weighted_jump_rope",
12985            CardioExerciseName::JumpRopeCrossover => "jump_rope_crossover",
12986            CardioExerciseName::WeightedJumpRopeCrossover => "weighted_jump_rope_crossover",
12987            CardioExerciseName::JumpRopeJog => "jump_rope_jog",
12988            CardioExerciseName::WeightedJumpRopeJog => "weighted_jump_rope_jog",
12989            CardioExerciseName::JumpingJacks => "jumping_jacks",
12990            CardioExerciseName::WeightedJumpingJacks => "weighted_jumping_jacks",
12991            CardioExerciseName::SkiMoguls => "ski_moguls",
12992            CardioExerciseName::WeightedSkiMoguls => "weighted_ski_moguls",
12993            CardioExerciseName::SplitJacks => "split_jacks",
12994            CardioExerciseName::WeightedSplitJacks => "weighted_split_jacks",
12995            CardioExerciseName::SquatJacks => "squat_jacks",
12996            CardioExerciseName::WeightedSquatJacks => "weighted_squat_jacks",
12997            CardioExerciseName::TripleUnder => "triple_under",
12998            CardioExerciseName::WeightedTripleUnder => "weighted_triple_under",
12999            CardioExerciseName::Elliptical => "elliptical",
13000            CardioExerciseName::Spinning => "spinning",
13001            CardioExerciseName::PolePaddleForwardWheelchair => "pole_paddle_forward_wheelchair",
13002            CardioExerciseName::PolePaddleBackwardWheelchair => "pole_paddle_backward_wheelchair",
13003            CardioExerciseName::PoleHandcycleForwardWheelchair => {
13004                "pole_handcycle_forward_wheelchair"
13005            }
13006            CardioExerciseName::PoleHandcycleBackwardWheelchair => {
13007                "pole_handcycle_backward_wheelchair"
13008            }
13009            CardioExerciseName::PoleRainbowWheelchair => "pole_rainbow_wheelchair",
13010            CardioExerciseName::DoublePunchForwardWheelchair => "double_punch_forward_wheelchair",
13011            CardioExerciseName::DoublePunchDownWheelchair => "double_punch_down_wheelchair",
13012            CardioExerciseName::DoublePunchSidewaysWheelchair => "double_punch_sideways_wheelchair",
13013            CardioExerciseName::DoublePunchUpWheelchair => "double_punch_up_wheelchair",
13014            CardioExerciseName::SitSkiWheelchair => "sit_ski_wheelchair",
13015            CardioExerciseName::SittingJacksWheelchair => "sitting_jacks_wheelchair",
13016            CardioExerciseName::PunchForwardWheelchair => "punch_forward_wheelchair",
13017            CardioExerciseName::PunchDownWheelchair => "punch_down_wheelchair",
13018            CardioExerciseName::PunchSidewaysWheelchair => "punch_sideways_wheelchair",
13019            CardioExerciseName::PunchUpWheelchair => "punch_up_wheelchair",
13020            CardioExerciseName::PunchBagWheelchair => "punch_bag_wheelchair",
13021            CardioExerciseName::PoleDdFfUuWheelchair => "pole_dd_ff_uu_wheelchair",
13022            CardioExerciseName::ButterflyArmsWheelchair => "butterfly_arms_wheelchair",
13023            CardioExerciseName::Punch => "punch",
13024        }
13025    }
13026
13027    /// Try to construct from the underlying numeric value.
13028    pub fn from_value(value: u16) -> Option<Self> {
13029        match value {
13030            0 => Some(CardioExerciseName::BobAndWeaveCircle),
13031            1 => Some(CardioExerciseName::WeightedBobAndWeaveCircle),
13032            2 => Some(CardioExerciseName::CardioCoreCrawl),
13033            3 => Some(CardioExerciseName::WeightedCardioCoreCrawl),
13034            4 => Some(CardioExerciseName::DoubleUnder),
13035            5 => Some(CardioExerciseName::WeightedDoubleUnder),
13036            6 => Some(CardioExerciseName::JumpRope),
13037            7 => Some(CardioExerciseName::WeightedJumpRope),
13038            8 => Some(CardioExerciseName::JumpRopeCrossover),
13039            9 => Some(CardioExerciseName::WeightedJumpRopeCrossover),
13040            10 => Some(CardioExerciseName::JumpRopeJog),
13041            11 => Some(CardioExerciseName::WeightedJumpRopeJog),
13042            12 => Some(CardioExerciseName::JumpingJacks),
13043            13 => Some(CardioExerciseName::WeightedJumpingJacks),
13044            14 => Some(CardioExerciseName::SkiMoguls),
13045            15 => Some(CardioExerciseName::WeightedSkiMoguls),
13046            16 => Some(CardioExerciseName::SplitJacks),
13047            17 => Some(CardioExerciseName::WeightedSplitJacks),
13048            18 => Some(CardioExerciseName::SquatJacks),
13049            19 => Some(CardioExerciseName::WeightedSquatJacks),
13050            20 => Some(CardioExerciseName::TripleUnder),
13051            21 => Some(CardioExerciseName::WeightedTripleUnder),
13052            22 => Some(CardioExerciseName::Elliptical),
13053            23 => Some(CardioExerciseName::Spinning),
13054            24 => Some(CardioExerciseName::PolePaddleForwardWheelchair),
13055            25 => Some(CardioExerciseName::PolePaddleBackwardWheelchair),
13056            26 => Some(CardioExerciseName::PoleHandcycleForwardWheelchair),
13057            27 => Some(CardioExerciseName::PoleHandcycleBackwardWheelchair),
13058            28 => Some(CardioExerciseName::PoleRainbowWheelchair),
13059            29 => Some(CardioExerciseName::DoublePunchForwardWheelchair),
13060            30 => Some(CardioExerciseName::DoublePunchDownWheelchair),
13061            31 => Some(CardioExerciseName::DoublePunchSidewaysWheelchair),
13062            32 => Some(CardioExerciseName::DoublePunchUpWheelchair),
13063            33 => Some(CardioExerciseName::SitSkiWheelchair),
13064            34 => Some(CardioExerciseName::SittingJacksWheelchair),
13065            35 => Some(CardioExerciseName::PunchForwardWheelchair),
13066            36 => Some(CardioExerciseName::PunchDownWheelchair),
13067            37 => Some(CardioExerciseName::PunchSidewaysWheelchair),
13068            38 => Some(CardioExerciseName::PunchUpWheelchair),
13069            39 => Some(CardioExerciseName::PunchBagWheelchair),
13070            40 => Some(CardioExerciseName::PoleDdFfUuWheelchair),
13071            41 => Some(CardioExerciseName::ButterflyArmsWheelchair),
13072            42 => Some(CardioExerciseName::Punch),
13073            _ => None,
13074        }
13075    }
13076
13077    /// Try to construct from the snake-case canonical name.
13078    pub fn from_str(name: &str) -> Option<Self> {
13079        match name {
13080            "bob_and_weave_circle" => Some(CardioExerciseName::BobAndWeaveCircle),
13081            "weighted_bob_and_weave_circle" => Some(CardioExerciseName::WeightedBobAndWeaveCircle),
13082            "cardio_core_crawl" => Some(CardioExerciseName::CardioCoreCrawl),
13083            "weighted_cardio_core_crawl" => Some(CardioExerciseName::WeightedCardioCoreCrawl),
13084            "double_under" => Some(CardioExerciseName::DoubleUnder),
13085            "weighted_double_under" => Some(CardioExerciseName::WeightedDoubleUnder),
13086            "jump_rope" => Some(CardioExerciseName::JumpRope),
13087            "weighted_jump_rope" => Some(CardioExerciseName::WeightedJumpRope),
13088            "jump_rope_crossover" => Some(CardioExerciseName::JumpRopeCrossover),
13089            "weighted_jump_rope_crossover" => Some(CardioExerciseName::WeightedJumpRopeCrossover),
13090            "jump_rope_jog" => Some(CardioExerciseName::JumpRopeJog),
13091            "weighted_jump_rope_jog" => Some(CardioExerciseName::WeightedJumpRopeJog),
13092            "jumping_jacks" => Some(CardioExerciseName::JumpingJacks),
13093            "weighted_jumping_jacks" => Some(CardioExerciseName::WeightedJumpingJacks),
13094            "ski_moguls" => Some(CardioExerciseName::SkiMoguls),
13095            "weighted_ski_moguls" => Some(CardioExerciseName::WeightedSkiMoguls),
13096            "split_jacks" => Some(CardioExerciseName::SplitJacks),
13097            "weighted_split_jacks" => Some(CardioExerciseName::WeightedSplitJacks),
13098            "squat_jacks" => Some(CardioExerciseName::SquatJacks),
13099            "weighted_squat_jacks" => Some(CardioExerciseName::WeightedSquatJacks),
13100            "triple_under" => Some(CardioExerciseName::TripleUnder),
13101            "weighted_triple_under" => Some(CardioExerciseName::WeightedTripleUnder),
13102            "elliptical" => Some(CardioExerciseName::Elliptical),
13103            "spinning" => Some(CardioExerciseName::Spinning),
13104            "pole_paddle_forward_wheelchair" => {
13105                Some(CardioExerciseName::PolePaddleForwardWheelchair)
13106            }
13107            "pole_paddle_backward_wheelchair" => {
13108                Some(CardioExerciseName::PolePaddleBackwardWheelchair)
13109            }
13110            "pole_handcycle_forward_wheelchair" => {
13111                Some(CardioExerciseName::PoleHandcycleForwardWheelchair)
13112            }
13113            "pole_handcycle_backward_wheelchair" => {
13114                Some(CardioExerciseName::PoleHandcycleBackwardWheelchair)
13115            }
13116            "pole_rainbow_wheelchair" => Some(CardioExerciseName::PoleRainbowWheelchair),
13117            "double_punch_forward_wheelchair" => {
13118                Some(CardioExerciseName::DoublePunchForwardWheelchair)
13119            }
13120            "double_punch_down_wheelchair" => Some(CardioExerciseName::DoublePunchDownWheelchair),
13121            "double_punch_sideways_wheelchair" => {
13122                Some(CardioExerciseName::DoublePunchSidewaysWheelchair)
13123            }
13124            "double_punch_up_wheelchair" => Some(CardioExerciseName::DoublePunchUpWheelchair),
13125            "sit_ski_wheelchair" => Some(CardioExerciseName::SitSkiWheelchair),
13126            "sitting_jacks_wheelchair" => Some(CardioExerciseName::SittingJacksWheelchair),
13127            "punch_forward_wheelchair" => Some(CardioExerciseName::PunchForwardWheelchair),
13128            "punch_down_wheelchair" => Some(CardioExerciseName::PunchDownWheelchair),
13129            "punch_sideways_wheelchair" => Some(CardioExerciseName::PunchSidewaysWheelchair),
13130            "punch_up_wheelchair" => Some(CardioExerciseName::PunchUpWheelchair),
13131            "punch_bag_wheelchair" => Some(CardioExerciseName::PunchBagWheelchair),
13132            "pole_dd_ff_uu_wheelchair" => Some(CardioExerciseName::PoleDdFfUuWheelchair),
13133            "butterfly_arms_wheelchair" => Some(CardioExerciseName::ButterflyArmsWheelchair),
13134            "punch" => Some(CardioExerciseName::Punch),
13135            _ => None,
13136        }
13137    }
13138}
13139
13140#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
13141#[repr(u16)]
13142#[non_exhaustive]
13143pub enum CarryExerciseName {
13144    BarHolds = 0,
13145    FarmersWalk = 1,
13146    FarmersWalkOnToes = 2,
13147    HexDumbbellHold = 3,
13148    OverheadCarry = 4,
13149    DumbbellWaiterCarry = 5,
13150    FarmersCarryWalkLunge = 6,
13151    FarmersCarry = 7,
13152    FarmersCarryOnToes = 8,
13153}
13154
13155impl CarryExerciseName {
13156    /// Snake-case canonical name from Profile.xlsx.
13157    pub fn as_str(&self) -> &'static str {
13158        match self {
13159            CarryExerciseName::BarHolds => "bar_holds",
13160            CarryExerciseName::FarmersWalk => "farmers_walk",
13161            CarryExerciseName::FarmersWalkOnToes => "farmers_walk_on_toes",
13162            CarryExerciseName::HexDumbbellHold => "hex_dumbbell_hold",
13163            CarryExerciseName::OverheadCarry => "overhead_carry",
13164            CarryExerciseName::DumbbellWaiterCarry => "dumbbell_waiter_carry",
13165            CarryExerciseName::FarmersCarryWalkLunge => "farmers_carry_walk_lunge",
13166            CarryExerciseName::FarmersCarry => "farmers_carry",
13167            CarryExerciseName::FarmersCarryOnToes => "farmers_carry_on_toes",
13168        }
13169    }
13170
13171    /// Try to construct from the underlying numeric value.
13172    pub fn from_value(value: u16) -> Option<Self> {
13173        match value {
13174            0 => Some(CarryExerciseName::BarHolds),
13175            1 => Some(CarryExerciseName::FarmersWalk),
13176            2 => Some(CarryExerciseName::FarmersWalkOnToes),
13177            3 => Some(CarryExerciseName::HexDumbbellHold),
13178            4 => Some(CarryExerciseName::OverheadCarry),
13179            5 => Some(CarryExerciseName::DumbbellWaiterCarry),
13180            6 => Some(CarryExerciseName::FarmersCarryWalkLunge),
13181            7 => Some(CarryExerciseName::FarmersCarry),
13182            8 => Some(CarryExerciseName::FarmersCarryOnToes),
13183            _ => None,
13184        }
13185    }
13186
13187    /// Try to construct from the snake-case canonical name.
13188    pub fn from_str(name: &str) -> Option<Self> {
13189        match name {
13190            "bar_holds" => Some(CarryExerciseName::BarHolds),
13191            "farmers_walk" => Some(CarryExerciseName::FarmersWalk),
13192            "farmers_walk_on_toes" => Some(CarryExerciseName::FarmersWalkOnToes),
13193            "hex_dumbbell_hold" => Some(CarryExerciseName::HexDumbbellHold),
13194            "overhead_carry" => Some(CarryExerciseName::OverheadCarry),
13195            "dumbbell_waiter_carry" => Some(CarryExerciseName::DumbbellWaiterCarry),
13196            "farmers_carry_walk_lunge" => Some(CarryExerciseName::FarmersCarryWalkLunge),
13197            "farmers_carry" => Some(CarryExerciseName::FarmersCarry),
13198            "farmers_carry_on_toes" => Some(CarryExerciseName::FarmersCarryOnToes),
13199            _ => None,
13200        }
13201    }
13202}
13203
13204#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
13205#[repr(u16)]
13206#[non_exhaustive]
13207pub enum ChopExerciseName {
13208    CablePullThrough = 0,
13209    CableRotationalLift = 1,
13210    CableWoodchop = 2,
13211    CrossChopToKnee = 3,
13212    WeightedCrossChopToKnee = 4,
13213    DumbbellChop = 5,
13214    HalfKneelingRotation = 6,
13215    WeightedHalfKneelingRotation = 7,
13216    HalfKneelingRotationalChop = 8,
13217    HalfKneelingRotationalReverseChop = 9,
13218    HalfKneelingStabilityChop = 10,
13219    HalfKneelingStabilityReverseChop = 11,
13220    KneelingRotationalChop = 12,
13221    KneelingRotationalReverseChop = 13,
13222    KneelingStabilityChop = 14,
13223    KneelingWoodchopper = 15,
13224    MedicineBallWoodChops = 16,
13225    PowerSquatChops = 17,
13226    WeightedPowerSquatChops = 18,
13227    StandingRotationalChop = 19,
13228    StandingSplitRotationalChop = 20,
13229    StandingSplitRotationalReverseChop = 21,
13230    StandingStabilityReverseChop = 22,
13231}
13232
13233impl ChopExerciseName {
13234    /// Snake-case canonical name from Profile.xlsx.
13235    pub fn as_str(&self) -> &'static str {
13236        match self {
13237            ChopExerciseName::CablePullThrough => "cable_pull_through",
13238            ChopExerciseName::CableRotationalLift => "cable_rotational_lift",
13239            ChopExerciseName::CableWoodchop => "cable_woodchop",
13240            ChopExerciseName::CrossChopToKnee => "cross_chop_to_knee",
13241            ChopExerciseName::WeightedCrossChopToKnee => "weighted_cross_chop_to_knee",
13242            ChopExerciseName::DumbbellChop => "dumbbell_chop",
13243            ChopExerciseName::HalfKneelingRotation => "half_kneeling_rotation",
13244            ChopExerciseName::WeightedHalfKneelingRotation => "weighted_half_kneeling_rotation",
13245            ChopExerciseName::HalfKneelingRotationalChop => "half_kneeling_rotational_chop",
13246            ChopExerciseName::HalfKneelingRotationalReverseChop => {
13247                "half_kneeling_rotational_reverse_chop"
13248            }
13249            ChopExerciseName::HalfKneelingStabilityChop => "half_kneeling_stability_chop",
13250            ChopExerciseName::HalfKneelingStabilityReverseChop => {
13251                "half_kneeling_stability_reverse_chop"
13252            }
13253            ChopExerciseName::KneelingRotationalChop => "kneeling_rotational_chop",
13254            ChopExerciseName::KneelingRotationalReverseChop => "kneeling_rotational_reverse_chop",
13255            ChopExerciseName::KneelingStabilityChop => "kneeling_stability_chop",
13256            ChopExerciseName::KneelingWoodchopper => "kneeling_woodchopper",
13257            ChopExerciseName::MedicineBallWoodChops => "medicine_ball_wood_chops",
13258            ChopExerciseName::PowerSquatChops => "power_squat_chops",
13259            ChopExerciseName::WeightedPowerSquatChops => "weighted_power_squat_chops",
13260            ChopExerciseName::StandingRotationalChop => "standing_rotational_chop",
13261            ChopExerciseName::StandingSplitRotationalChop => "standing_split_rotational_chop",
13262            ChopExerciseName::StandingSplitRotationalReverseChop => {
13263                "standing_split_rotational_reverse_chop"
13264            }
13265            ChopExerciseName::StandingStabilityReverseChop => "standing_stability_reverse_chop",
13266        }
13267    }
13268
13269    /// Try to construct from the underlying numeric value.
13270    pub fn from_value(value: u16) -> Option<Self> {
13271        match value {
13272            0 => Some(ChopExerciseName::CablePullThrough),
13273            1 => Some(ChopExerciseName::CableRotationalLift),
13274            2 => Some(ChopExerciseName::CableWoodchop),
13275            3 => Some(ChopExerciseName::CrossChopToKnee),
13276            4 => Some(ChopExerciseName::WeightedCrossChopToKnee),
13277            5 => Some(ChopExerciseName::DumbbellChop),
13278            6 => Some(ChopExerciseName::HalfKneelingRotation),
13279            7 => Some(ChopExerciseName::WeightedHalfKneelingRotation),
13280            8 => Some(ChopExerciseName::HalfKneelingRotationalChop),
13281            9 => Some(ChopExerciseName::HalfKneelingRotationalReverseChop),
13282            10 => Some(ChopExerciseName::HalfKneelingStabilityChop),
13283            11 => Some(ChopExerciseName::HalfKneelingStabilityReverseChop),
13284            12 => Some(ChopExerciseName::KneelingRotationalChop),
13285            13 => Some(ChopExerciseName::KneelingRotationalReverseChop),
13286            14 => Some(ChopExerciseName::KneelingStabilityChop),
13287            15 => Some(ChopExerciseName::KneelingWoodchopper),
13288            16 => Some(ChopExerciseName::MedicineBallWoodChops),
13289            17 => Some(ChopExerciseName::PowerSquatChops),
13290            18 => Some(ChopExerciseName::WeightedPowerSquatChops),
13291            19 => Some(ChopExerciseName::StandingRotationalChop),
13292            20 => Some(ChopExerciseName::StandingSplitRotationalChop),
13293            21 => Some(ChopExerciseName::StandingSplitRotationalReverseChop),
13294            22 => Some(ChopExerciseName::StandingStabilityReverseChop),
13295            _ => None,
13296        }
13297    }
13298
13299    /// Try to construct from the snake-case canonical name.
13300    pub fn from_str(name: &str) -> Option<Self> {
13301        match name {
13302            "cable_pull_through" => Some(ChopExerciseName::CablePullThrough),
13303            "cable_rotational_lift" => Some(ChopExerciseName::CableRotationalLift),
13304            "cable_woodchop" => Some(ChopExerciseName::CableWoodchop),
13305            "cross_chop_to_knee" => Some(ChopExerciseName::CrossChopToKnee),
13306            "weighted_cross_chop_to_knee" => Some(ChopExerciseName::WeightedCrossChopToKnee),
13307            "dumbbell_chop" => Some(ChopExerciseName::DumbbellChop),
13308            "half_kneeling_rotation" => Some(ChopExerciseName::HalfKneelingRotation),
13309            "weighted_half_kneeling_rotation" => {
13310                Some(ChopExerciseName::WeightedHalfKneelingRotation)
13311            }
13312            "half_kneeling_rotational_chop" => Some(ChopExerciseName::HalfKneelingRotationalChop),
13313            "half_kneeling_rotational_reverse_chop" => {
13314                Some(ChopExerciseName::HalfKneelingRotationalReverseChop)
13315            }
13316            "half_kneeling_stability_chop" => Some(ChopExerciseName::HalfKneelingStabilityChop),
13317            "half_kneeling_stability_reverse_chop" => {
13318                Some(ChopExerciseName::HalfKneelingStabilityReverseChop)
13319            }
13320            "kneeling_rotational_chop" => Some(ChopExerciseName::KneelingRotationalChop),
13321            "kneeling_rotational_reverse_chop" => {
13322                Some(ChopExerciseName::KneelingRotationalReverseChop)
13323            }
13324            "kneeling_stability_chop" => Some(ChopExerciseName::KneelingStabilityChop),
13325            "kneeling_woodchopper" => Some(ChopExerciseName::KneelingWoodchopper),
13326            "medicine_ball_wood_chops" => Some(ChopExerciseName::MedicineBallWoodChops),
13327            "power_squat_chops" => Some(ChopExerciseName::PowerSquatChops),
13328            "weighted_power_squat_chops" => Some(ChopExerciseName::WeightedPowerSquatChops),
13329            "standing_rotational_chop" => Some(ChopExerciseName::StandingRotationalChop),
13330            "standing_split_rotational_chop" => Some(ChopExerciseName::StandingSplitRotationalChop),
13331            "standing_split_rotational_reverse_chop" => {
13332                Some(ChopExerciseName::StandingSplitRotationalReverseChop)
13333            }
13334            "standing_stability_reverse_chop" => {
13335                Some(ChopExerciseName::StandingStabilityReverseChop)
13336            }
13337            _ => None,
13338        }
13339    }
13340}
13341
13342#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
13343#[repr(u16)]
13344#[non_exhaustive]
13345pub enum CoreExerciseName {
13346    AbsJabs = 0,
13347    WeightedAbsJabs = 1,
13348    AlternatingPlateReach = 2,
13349    BarbellRollout = 3,
13350    WeightedBarbellRollout = 4,
13351    BodyBarObliqueTwist = 5,
13352    CableCorePress = 6,
13353    CableSideBend = 7,
13354    SideBend = 8,
13355    WeightedSideBend = 9,
13356    CrescentCircle = 10,
13357    WeightedCrescentCircle = 11,
13358    CyclingRussianTwist = 12,
13359    WeightedCyclingRussianTwist = 13,
13360    ElevatedFeetRussianTwist = 14,
13361    WeightedElevatedFeetRussianTwist = 15,
13362    HalfTurkishGetUp = 16,
13363    KettlebellWindmill = 17,
13364    KneelingAbWheel = 18,
13365    WeightedKneelingAbWheel = 19,
13366    ModifiedFrontLever = 20,
13367    OpenKneeTucks = 21,
13368    WeightedOpenKneeTucks = 22,
13369    SideAbsLegLift = 23,
13370    WeightedSideAbsLegLift = 24,
13371    SwissBallJackknife = 25,
13372    WeightedSwissBallJackknife = 26,
13373    SwissBallPike = 27,
13374    WeightedSwissBallPike = 28,
13375    SwissBallRollout = 29,
13376    WeightedSwissBallRollout = 30,
13377    TriangleHipPress = 31,
13378    WeightedTriangleHipPress = 32,
13379    TrxSuspendedJackknife = 33,
13380    WeightedTrxSuspendedJackknife = 34,
13381    UBoat = 35,
13382    WeightedUBoat = 36,
13383    WindmillSwitches = 37,
13384    WeightedWindmillSwitches = 38,
13385    AlternatingSlideOut = 39,
13386    WeightedAlternatingSlideOut = 40,
13387    GhdBackExtensions = 41,
13388    WeightedGhdBackExtensions = 42,
13389    OverheadWalk = 43,
13390    Inchworm = 44,
13391    WeightedModifiedFrontLever = 45,
13392    RussianTwist = 46,
13393    AbdominalLegRotations = 47,
13394    ArmAndLegExtensionOnKnees = 48,
13395    Bicycle = 49,
13396    BicepCurlWithLegExtension = 50,
13397    CatCow = 51,
13398    Corkscrew = 52,
13399    CrissCross = 53,
13400    CrissCrossWithBall = 54,
13401    DoubleLegStretch = 55,
13402    KneeFolds = 56,
13403    LowerLift = 57,
13404    NeckPull = 58,
13405    PelvicClocks = 59,
13406    RollOver = 60,
13407    RollUp = 61,
13408    Rolling = 62,
13409    Rowing1 = 63,
13410    Rowing2 = 64,
13411    Scissors = 65,
13412    SingleLegCircles = 66,
13413    SingleLegStretch = 67,
13414    SnakeTwist1And2 = 68,
13415    Swan = 69,
13416    Swimming = 70,
13417    Teaser = 71,
13418    TheHundred = 72,
13419    BicepCurlWithLegExtensionWithWeights = 73,
13420    HangingLSit = 75,
13421    LowerLiftWithWeights = 77,
13422    RingLSit = 79,
13423    Rowing1WithWeights = 80,
13424    Rowing2WithWeights = 81,
13425    ScissorsWithWeights = 82,
13426    SingleLegStretchWithWeights = 83,
13427    ToesToElbows = 84,
13428    WeightedCrissCross = 85,
13429    WeightedDoubleLegStretch = 86,
13430    WeightedTheHundred = 87,
13431    LSit = 88,
13432    TurkishGetUp = 89,
13433    WeightedRingLSit = 90,
13434    WeightedHangingLSit = 91,
13435    WeightedLSit = 92,
13436    SideBendLowWheelchair = 93,
13437    SideBendMidWheelchair = 94,
13438    SideBendHighWheelchair = 95,
13439    SeatedSideBend = 96,
13440}
13441
13442impl CoreExerciseName {
13443    /// Snake-case canonical name from Profile.xlsx.
13444    pub fn as_str(&self) -> &'static str {
13445        match self {
13446            CoreExerciseName::AbsJabs => "abs_jabs",
13447            CoreExerciseName::WeightedAbsJabs => "weighted_abs_jabs",
13448            CoreExerciseName::AlternatingPlateReach => "alternating_plate_reach",
13449            CoreExerciseName::BarbellRollout => "barbell_rollout",
13450            CoreExerciseName::WeightedBarbellRollout => "weighted_barbell_rollout",
13451            CoreExerciseName::BodyBarObliqueTwist => "body_bar_oblique_twist",
13452            CoreExerciseName::CableCorePress => "cable_core_press",
13453            CoreExerciseName::CableSideBend => "cable_side_bend",
13454            CoreExerciseName::SideBend => "side_bend",
13455            CoreExerciseName::WeightedSideBend => "weighted_side_bend",
13456            CoreExerciseName::CrescentCircle => "crescent_circle",
13457            CoreExerciseName::WeightedCrescentCircle => "weighted_crescent_circle",
13458            CoreExerciseName::CyclingRussianTwist => "cycling_russian_twist",
13459            CoreExerciseName::WeightedCyclingRussianTwist => "weighted_cycling_russian_twist",
13460            CoreExerciseName::ElevatedFeetRussianTwist => "elevated_feet_russian_twist",
13461            CoreExerciseName::WeightedElevatedFeetRussianTwist => {
13462                "weighted_elevated_feet_russian_twist"
13463            }
13464            CoreExerciseName::HalfTurkishGetUp => "half_turkish_get_up",
13465            CoreExerciseName::KettlebellWindmill => "kettlebell_windmill",
13466            CoreExerciseName::KneelingAbWheel => "kneeling_ab_wheel",
13467            CoreExerciseName::WeightedKneelingAbWheel => "weighted_kneeling_ab_wheel",
13468            CoreExerciseName::ModifiedFrontLever => "modified_front_lever",
13469            CoreExerciseName::OpenKneeTucks => "open_knee_tucks",
13470            CoreExerciseName::WeightedOpenKneeTucks => "weighted_open_knee_tucks",
13471            CoreExerciseName::SideAbsLegLift => "side_abs_leg_lift",
13472            CoreExerciseName::WeightedSideAbsLegLift => "weighted_side_abs_leg_lift",
13473            CoreExerciseName::SwissBallJackknife => "swiss_ball_jackknife",
13474            CoreExerciseName::WeightedSwissBallJackknife => "weighted_swiss_ball_jackknife",
13475            CoreExerciseName::SwissBallPike => "swiss_ball_pike",
13476            CoreExerciseName::WeightedSwissBallPike => "weighted_swiss_ball_pike",
13477            CoreExerciseName::SwissBallRollout => "swiss_ball_rollout",
13478            CoreExerciseName::WeightedSwissBallRollout => "weighted_swiss_ball_rollout",
13479            CoreExerciseName::TriangleHipPress => "triangle_hip_press",
13480            CoreExerciseName::WeightedTriangleHipPress => "weighted_triangle_hip_press",
13481            CoreExerciseName::TrxSuspendedJackknife => "trx_suspended_jackknife",
13482            CoreExerciseName::WeightedTrxSuspendedJackknife => "weighted_trx_suspended_jackknife",
13483            CoreExerciseName::UBoat => "u_boat",
13484            CoreExerciseName::WeightedUBoat => "weighted_u_boat",
13485            CoreExerciseName::WindmillSwitches => "windmill_switches",
13486            CoreExerciseName::WeightedWindmillSwitches => "weighted_windmill_switches",
13487            CoreExerciseName::AlternatingSlideOut => "alternating_slide_out",
13488            CoreExerciseName::WeightedAlternatingSlideOut => "weighted_alternating_slide_out",
13489            CoreExerciseName::GhdBackExtensions => "ghd_back_extensions",
13490            CoreExerciseName::WeightedGhdBackExtensions => "weighted_ghd_back_extensions",
13491            CoreExerciseName::OverheadWalk => "overhead_walk",
13492            CoreExerciseName::Inchworm => "inchworm",
13493            CoreExerciseName::WeightedModifiedFrontLever => "weighted_modified_front_lever",
13494            CoreExerciseName::RussianTwist => "russian_twist",
13495            CoreExerciseName::AbdominalLegRotations => "abdominal_leg_rotations",
13496            CoreExerciseName::ArmAndLegExtensionOnKnees => "arm_and_leg_extension_on_knees",
13497            CoreExerciseName::Bicycle => "bicycle",
13498            CoreExerciseName::BicepCurlWithLegExtension => "bicep_curl_with_leg_extension",
13499            CoreExerciseName::CatCow => "cat_cow",
13500            CoreExerciseName::Corkscrew => "corkscrew",
13501            CoreExerciseName::CrissCross => "criss_cross",
13502            CoreExerciseName::CrissCrossWithBall => "criss_cross_with_ball",
13503            CoreExerciseName::DoubleLegStretch => "double_leg_stretch",
13504            CoreExerciseName::KneeFolds => "knee_folds",
13505            CoreExerciseName::LowerLift => "lower_lift",
13506            CoreExerciseName::NeckPull => "neck_pull",
13507            CoreExerciseName::PelvicClocks => "pelvic_clocks",
13508            CoreExerciseName::RollOver => "roll_over",
13509            CoreExerciseName::RollUp => "roll_up",
13510            CoreExerciseName::Rolling => "rolling",
13511            CoreExerciseName::Rowing1 => "rowing_1",
13512            CoreExerciseName::Rowing2 => "rowing_2",
13513            CoreExerciseName::Scissors => "scissors",
13514            CoreExerciseName::SingleLegCircles => "single_leg_circles",
13515            CoreExerciseName::SingleLegStretch => "single_leg_stretch",
13516            CoreExerciseName::SnakeTwist1And2 => "snake_twist_1_and_2",
13517            CoreExerciseName::Swan => "swan",
13518            CoreExerciseName::Swimming => "swimming",
13519            CoreExerciseName::Teaser => "teaser",
13520            CoreExerciseName::TheHundred => "the_hundred",
13521            CoreExerciseName::BicepCurlWithLegExtensionWithWeights => {
13522                "bicep_curl_with_leg_extension_with_weights"
13523            }
13524            CoreExerciseName::HangingLSit => "hanging_l_sit",
13525            CoreExerciseName::LowerLiftWithWeights => "lower_lift_with_weights",
13526            CoreExerciseName::RingLSit => "ring_l_sit",
13527            CoreExerciseName::Rowing1WithWeights => "rowing_1_with_weights",
13528            CoreExerciseName::Rowing2WithWeights => "rowing_2_with_weights",
13529            CoreExerciseName::ScissorsWithWeights => "scissors_with_weights",
13530            CoreExerciseName::SingleLegStretchWithWeights => "single_leg_stretch_with_weights",
13531            CoreExerciseName::ToesToElbows => "toes_to_elbows",
13532            CoreExerciseName::WeightedCrissCross => "weighted_criss_cross",
13533            CoreExerciseName::WeightedDoubleLegStretch => "weighted_double_leg_stretch",
13534            CoreExerciseName::WeightedTheHundred => "weighted_the_hundred",
13535            CoreExerciseName::LSit => "l_sit",
13536            CoreExerciseName::TurkishGetUp => "turkish_get_up",
13537            CoreExerciseName::WeightedRingLSit => "weighted_ring_l_sit",
13538            CoreExerciseName::WeightedHangingLSit => "weighted_hanging_l_sit",
13539            CoreExerciseName::WeightedLSit => "weighted_l_sit",
13540            CoreExerciseName::SideBendLowWheelchair => "side_bend_low_wheelchair",
13541            CoreExerciseName::SideBendMidWheelchair => "side_bend_mid_wheelchair",
13542            CoreExerciseName::SideBendHighWheelchair => "side_bend_high_wheelchair",
13543            CoreExerciseName::SeatedSideBend => "seated_side_bend",
13544        }
13545    }
13546
13547    /// Try to construct from the underlying numeric value.
13548    pub fn from_value(value: u16) -> Option<Self> {
13549        match value {
13550            0 => Some(CoreExerciseName::AbsJabs),
13551            1 => Some(CoreExerciseName::WeightedAbsJabs),
13552            2 => Some(CoreExerciseName::AlternatingPlateReach),
13553            3 => Some(CoreExerciseName::BarbellRollout),
13554            4 => Some(CoreExerciseName::WeightedBarbellRollout),
13555            5 => Some(CoreExerciseName::BodyBarObliqueTwist),
13556            6 => Some(CoreExerciseName::CableCorePress),
13557            7 => Some(CoreExerciseName::CableSideBend),
13558            8 => Some(CoreExerciseName::SideBend),
13559            9 => Some(CoreExerciseName::WeightedSideBend),
13560            10 => Some(CoreExerciseName::CrescentCircle),
13561            11 => Some(CoreExerciseName::WeightedCrescentCircle),
13562            12 => Some(CoreExerciseName::CyclingRussianTwist),
13563            13 => Some(CoreExerciseName::WeightedCyclingRussianTwist),
13564            14 => Some(CoreExerciseName::ElevatedFeetRussianTwist),
13565            15 => Some(CoreExerciseName::WeightedElevatedFeetRussianTwist),
13566            16 => Some(CoreExerciseName::HalfTurkishGetUp),
13567            17 => Some(CoreExerciseName::KettlebellWindmill),
13568            18 => Some(CoreExerciseName::KneelingAbWheel),
13569            19 => Some(CoreExerciseName::WeightedKneelingAbWheel),
13570            20 => Some(CoreExerciseName::ModifiedFrontLever),
13571            21 => Some(CoreExerciseName::OpenKneeTucks),
13572            22 => Some(CoreExerciseName::WeightedOpenKneeTucks),
13573            23 => Some(CoreExerciseName::SideAbsLegLift),
13574            24 => Some(CoreExerciseName::WeightedSideAbsLegLift),
13575            25 => Some(CoreExerciseName::SwissBallJackknife),
13576            26 => Some(CoreExerciseName::WeightedSwissBallJackknife),
13577            27 => Some(CoreExerciseName::SwissBallPike),
13578            28 => Some(CoreExerciseName::WeightedSwissBallPike),
13579            29 => Some(CoreExerciseName::SwissBallRollout),
13580            30 => Some(CoreExerciseName::WeightedSwissBallRollout),
13581            31 => Some(CoreExerciseName::TriangleHipPress),
13582            32 => Some(CoreExerciseName::WeightedTriangleHipPress),
13583            33 => Some(CoreExerciseName::TrxSuspendedJackknife),
13584            34 => Some(CoreExerciseName::WeightedTrxSuspendedJackknife),
13585            35 => Some(CoreExerciseName::UBoat),
13586            36 => Some(CoreExerciseName::WeightedUBoat),
13587            37 => Some(CoreExerciseName::WindmillSwitches),
13588            38 => Some(CoreExerciseName::WeightedWindmillSwitches),
13589            39 => Some(CoreExerciseName::AlternatingSlideOut),
13590            40 => Some(CoreExerciseName::WeightedAlternatingSlideOut),
13591            41 => Some(CoreExerciseName::GhdBackExtensions),
13592            42 => Some(CoreExerciseName::WeightedGhdBackExtensions),
13593            43 => Some(CoreExerciseName::OverheadWalk),
13594            44 => Some(CoreExerciseName::Inchworm),
13595            45 => Some(CoreExerciseName::WeightedModifiedFrontLever),
13596            46 => Some(CoreExerciseName::RussianTwist),
13597            47 => Some(CoreExerciseName::AbdominalLegRotations),
13598            48 => Some(CoreExerciseName::ArmAndLegExtensionOnKnees),
13599            49 => Some(CoreExerciseName::Bicycle),
13600            50 => Some(CoreExerciseName::BicepCurlWithLegExtension),
13601            51 => Some(CoreExerciseName::CatCow),
13602            52 => Some(CoreExerciseName::Corkscrew),
13603            53 => Some(CoreExerciseName::CrissCross),
13604            54 => Some(CoreExerciseName::CrissCrossWithBall),
13605            55 => Some(CoreExerciseName::DoubleLegStretch),
13606            56 => Some(CoreExerciseName::KneeFolds),
13607            57 => Some(CoreExerciseName::LowerLift),
13608            58 => Some(CoreExerciseName::NeckPull),
13609            59 => Some(CoreExerciseName::PelvicClocks),
13610            60 => Some(CoreExerciseName::RollOver),
13611            61 => Some(CoreExerciseName::RollUp),
13612            62 => Some(CoreExerciseName::Rolling),
13613            63 => Some(CoreExerciseName::Rowing1),
13614            64 => Some(CoreExerciseName::Rowing2),
13615            65 => Some(CoreExerciseName::Scissors),
13616            66 => Some(CoreExerciseName::SingleLegCircles),
13617            67 => Some(CoreExerciseName::SingleLegStretch),
13618            68 => Some(CoreExerciseName::SnakeTwist1And2),
13619            69 => Some(CoreExerciseName::Swan),
13620            70 => Some(CoreExerciseName::Swimming),
13621            71 => Some(CoreExerciseName::Teaser),
13622            72 => Some(CoreExerciseName::TheHundred),
13623            73 => Some(CoreExerciseName::BicepCurlWithLegExtensionWithWeights),
13624            75 => Some(CoreExerciseName::HangingLSit),
13625            77 => Some(CoreExerciseName::LowerLiftWithWeights),
13626            79 => Some(CoreExerciseName::RingLSit),
13627            80 => Some(CoreExerciseName::Rowing1WithWeights),
13628            81 => Some(CoreExerciseName::Rowing2WithWeights),
13629            82 => Some(CoreExerciseName::ScissorsWithWeights),
13630            83 => Some(CoreExerciseName::SingleLegStretchWithWeights),
13631            84 => Some(CoreExerciseName::ToesToElbows),
13632            85 => Some(CoreExerciseName::WeightedCrissCross),
13633            86 => Some(CoreExerciseName::WeightedDoubleLegStretch),
13634            87 => Some(CoreExerciseName::WeightedTheHundred),
13635            88 => Some(CoreExerciseName::LSit),
13636            89 => Some(CoreExerciseName::TurkishGetUp),
13637            90 => Some(CoreExerciseName::WeightedRingLSit),
13638            91 => Some(CoreExerciseName::WeightedHangingLSit),
13639            92 => Some(CoreExerciseName::WeightedLSit),
13640            93 => Some(CoreExerciseName::SideBendLowWheelchair),
13641            94 => Some(CoreExerciseName::SideBendMidWheelchair),
13642            95 => Some(CoreExerciseName::SideBendHighWheelchair),
13643            96 => Some(CoreExerciseName::SeatedSideBend),
13644            _ => None,
13645        }
13646    }
13647
13648    /// Try to construct from the snake-case canonical name.
13649    pub fn from_str(name: &str) -> Option<Self> {
13650        match name {
13651            "abs_jabs" => Some(CoreExerciseName::AbsJabs),
13652            "weighted_abs_jabs" => Some(CoreExerciseName::WeightedAbsJabs),
13653            "alternating_plate_reach" => Some(CoreExerciseName::AlternatingPlateReach),
13654            "barbell_rollout" => Some(CoreExerciseName::BarbellRollout),
13655            "weighted_barbell_rollout" => Some(CoreExerciseName::WeightedBarbellRollout),
13656            "body_bar_oblique_twist" => Some(CoreExerciseName::BodyBarObliqueTwist),
13657            "cable_core_press" => Some(CoreExerciseName::CableCorePress),
13658            "cable_side_bend" => Some(CoreExerciseName::CableSideBend),
13659            "side_bend" => Some(CoreExerciseName::SideBend),
13660            "weighted_side_bend" => Some(CoreExerciseName::WeightedSideBend),
13661            "crescent_circle" => Some(CoreExerciseName::CrescentCircle),
13662            "weighted_crescent_circle" => Some(CoreExerciseName::WeightedCrescentCircle),
13663            "cycling_russian_twist" => Some(CoreExerciseName::CyclingRussianTwist),
13664            "weighted_cycling_russian_twist" => Some(CoreExerciseName::WeightedCyclingRussianTwist),
13665            "elevated_feet_russian_twist" => Some(CoreExerciseName::ElevatedFeetRussianTwist),
13666            "weighted_elevated_feet_russian_twist" => {
13667                Some(CoreExerciseName::WeightedElevatedFeetRussianTwist)
13668            }
13669            "half_turkish_get_up" => Some(CoreExerciseName::HalfTurkishGetUp),
13670            "kettlebell_windmill" => Some(CoreExerciseName::KettlebellWindmill),
13671            "kneeling_ab_wheel" => Some(CoreExerciseName::KneelingAbWheel),
13672            "weighted_kneeling_ab_wheel" => Some(CoreExerciseName::WeightedKneelingAbWheel),
13673            "modified_front_lever" => Some(CoreExerciseName::ModifiedFrontLever),
13674            "open_knee_tucks" => Some(CoreExerciseName::OpenKneeTucks),
13675            "weighted_open_knee_tucks" => Some(CoreExerciseName::WeightedOpenKneeTucks),
13676            "side_abs_leg_lift" => Some(CoreExerciseName::SideAbsLegLift),
13677            "weighted_side_abs_leg_lift" => Some(CoreExerciseName::WeightedSideAbsLegLift),
13678            "swiss_ball_jackknife" => Some(CoreExerciseName::SwissBallJackknife),
13679            "weighted_swiss_ball_jackknife" => Some(CoreExerciseName::WeightedSwissBallJackknife),
13680            "swiss_ball_pike" => Some(CoreExerciseName::SwissBallPike),
13681            "weighted_swiss_ball_pike" => Some(CoreExerciseName::WeightedSwissBallPike),
13682            "swiss_ball_rollout" => Some(CoreExerciseName::SwissBallRollout),
13683            "weighted_swiss_ball_rollout" => Some(CoreExerciseName::WeightedSwissBallRollout),
13684            "triangle_hip_press" => Some(CoreExerciseName::TriangleHipPress),
13685            "weighted_triangle_hip_press" => Some(CoreExerciseName::WeightedTriangleHipPress),
13686            "trx_suspended_jackknife" => Some(CoreExerciseName::TrxSuspendedJackknife),
13687            "weighted_trx_suspended_jackknife" => {
13688                Some(CoreExerciseName::WeightedTrxSuspendedJackknife)
13689            }
13690            "u_boat" => Some(CoreExerciseName::UBoat),
13691            "weighted_u_boat" => Some(CoreExerciseName::WeightedUBoat),
13692            "windmill_switches" => Some(CoreExerciseName::WindmillSwitches),
13693            "weighted_windmill_switches" => Some(CoreExerciseName::WeightedWindmillSwitches),
13694            "alternating_slide_out" => Some(CoreExerciseName::AlternatingSlideOut),
13695            "weighted_alternating_slide_out" => Some(CoreExerciseName::WeightedAlternatingSlideOut),
13696            "ghd_back_extensions" => Some(CoreExerciseName::GhdBackExtensions),
13697            "weighted_ghd_back_extensions" => Some(CoreExerciseName::WeightedGhdBackExtensions),
13698            "overhead_walk" => Some(CoreExerciseName::OverheadWalk),
13699            "inchworm" => Some(CoreExerciseName::Inchworm),
13700            "weighted_modified_front_lever" => Some(CoreExerciseName::WeightedModifiedFrontLever),
13701            "russian_twist" => Some(CoreExerciseName::RussianTwist),
13702            "abdominal_leg_rotations" => Some(CoreExerciseName::AbdominalLegRotations),
13703            "arm_and_leg_extension_on_knees" => Some(CoreExerciseName::ArmAndLegExtensionOnKnees),
13704            "bicycle" => Some(CoreExerciseName::Bicycle),
13705            "bicep_curl_with_leg_extension" => Some(CoreExerciseName::BicepCurlWithLegExtension),
13706            "cat_cow" => Some(CoreExerciseName::CatCow),
13707            "corkscrew" => Some(CoreExerciseName::Corkscrew),
13708            "criss_cross" => Some(CoreExerciseName::CrissCross),
13709            "criss_cross_with_ball" => Some(CoreExerciseName::CrissCrossWithBall),
13710            "double_leg_stretch" => Some(CoreExerciseName::DoubleLegStretch),
13711            "knee_folds" => Some(CoreExerciseName::KneeFolds),
13712            "lower_lift" => Some(CoreExerciseName::LowerLift),
13713            "neck_pull" => Some(CoreExerciseName::NeckPull),
13714            "pelvic_clocks" => Some(CoreExerciseName::PelvicClocks),
13715            "roll_over" => Some(CoreExerciseName::RollOver),
13716            "roll_up" => Some(CoreExerciseName::RollUp),
13717            "rolling" => Some(CoreExerciseName::Rolling),
13718            "rowing_1" => Some(CoreExerciseName::Rowing1),
13719            "rowing_2" => Some(CoreExerciseName::Rowing2),
13720            "scissors" => Some(CoreExerciseName::Scissors),
13721            "single_leg_circles" => Some(CoreExerciseName::SingleLegCircles),
13722            "single_leg_stretch" => Some(CoreExerciseName::SingleLegStretch),
13723            "snake_twist_1_and_2" => Some(CoreExerciseName::SnakeTwist1And2),
13724            "swan" => Some(CoreExerciseName::Swan),
13725            "swimming" => Some(CoreExerciseName::Swimming),
13726            "teaser" => Some(CoreExerciseName::Teaser),
13727            "the_hundred" => Some(CoreExerciseName::TheHundred),
13728            "bicep_curl_with_leg_extension_with_weights" => {
13729                Some(CoreExerciseName::BicepCurlWithLegExtensionWithWeights)
13730            }
13731            "hanging_l_sit" => Some(CoreExerciseName::HangingLSit),
13732            "lower_lift_with_weights" => Some(CoreExerciseName::LowerLiftWithWeights),
13733            "ring_l_sit" => Some(CoreExerciseName::RingLSit),
13734            "rowing_1_with_weights" => Some(CoreExerciseName::Rowing1WithWeights),
13735            "rowing_2_with_weights" => Some(CoreExerciseName::Rowing2WithWeights),
13736            "scissors_with_weights" => Some(CoreExerciseName::ScissorsWithWeights),
13737            "single_leg_stretch_with_weights" => {
13738                Some(CoreExerciseName::SingleLegStretchWithWeights)
13739            }
13740            "toes_to_elbows" => Some(CoreExerciseName::ToesToElbows),
13741            "weighted_criss_cross" => Some(CoreExerciseName::WeightedCrissCross),
13742            "weighted_double_leg_stretch" => Some(CoreExerciseName::WeightedDoubleLegStretch),
13743            "weighted_the_hundred" => Some(CoreExerciseName::WeightedTheHundred),
13744            "l_sit" => Some(CoreExerciseName::LSit),
13745            "turkish_get_up" => Some(CoreExerciseName::TurkishGetUp),
13746            "weighted_ring_l_sit" => Some(CoreExerciseName::WeightedRingLSit),
13747            "weighted_hanging_l_sit" => Some(CoreExerciseName::WeightedHangingLSit),
13748            "weighted_l_sit" => Some(CoreExerciseName::WeightedLSit),
13749            "side_bend_low_wheelchair" => Some(CoreExerciseName::SideBendLowWheelchair),
13750            "side_bend_mid_wheelchair" => Some(CoreExerciseName::SideBendMidWheelchair),
13751            "side_bend_high_wheelchair" => Some(CoreExerciseName::SideBendHighWheelchair),
13752            "seated_side_bend" => Some(CoreExerciseName::SeatedSideBend),
13753            _ => None,
13754        }
13755    }
13756}
13757
13758#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
13759#[repr(u16)]
13760#[non_exhaustive]
13761pub enum CrunchExerciseName {
13762    BicycleCrunch = 0,
13763    CableCrunch = 1,
13764    CircularArmCrunch = 2,
13765    CrossedArmsCrunch = 3,
13766    WeightedCrossedArmsCrunch = 4,
13767    CrossLegReverseCrunch = 5,
13768    WeightedCrossLegReverseCrunch = 6,
13769    CrunchChop = 7,
13770    WeightedCrunchChop = 8,
13771    DoubleCrunch = 9,
13772    WeightedDoubleCrunch = 10,
13773    ElbowToKneeCrunch = 11,
13774    WeightedElbowToKneeCrunch = 12,
13775    FlutterKicks = 13,
13776    WeightedFlutterKicks = 14,
13777    FoamRollerReverseCrunchOnBench = 15,
13778    WeightedFoamRollerReverseCrunchOnBench = 16,
13779    FoamRollerReverseCrunchWithDumbbell = 17,
13780    FoamRollerReverseCrunchWithMedicineBall = 18,
13781    FrogPress = 19,
13782    HangingKneeRaiseObliqueCrunch = 20,
13783    WeightedHangingKneeRaiseObliqueCrunch = 21,
13784    HipCrossover = 22,
13785    WeightedHipCrossover = 23,
13786    HollowRock = 24,
13787    WeightedHollowRock = 25,
13788    InclineReverseCrunch = 26,
13789    WeightedInclineReverseCrunch = 27,
13790    KneelingCableCrunch = 28,
13791    KneelingCrossCrunch = 29,
13792    WeightedKneelingCrossCrunch = 30,
13793    KneelingObliqueCableCrunch = 31,
13794    KneesToElbow = 32,
13795    LegExtensions = 33,
13796    WeightedLegExtensions = 34,
13797    LegLevers = 35,
13798    McgillCurlUp = 36,
13799    WeightedMcgillCurlUp = 37,
13800    ModifiedPilatesRollUpWithBall = 38,
13801    WeightedModifiedPilatesRollUpWithBall = 39,
13802    PilatesCrunch = 40,
13803    WeightedPilatesCrunch = 41,
13804    PilatesRollUpWithBall = 42,
13805    WeightedPilatesRollUpWithBall = 43,
13806    RaisedLegsCrunch = 44,
13807    WeightedRaisedLegsCrunch = 45,
13808    ReverseCrunch = 46,
13809    WeightedReverseCrunch = 47,
13810    ReverseCrunchOnABench = 48,
13811    WeightedReverseCrunchOnABench = 49,
13812    ReverseCurlAndLift = 50,
13813    WeightedReverseCurlAndLift = 51,
13814    RotationalLift = 52,
13815    WeightedRotationalLift = 53,
13816    SeatedAlternatingReverseCrunch = 54,
13817    WeightedSeatedAlternatingReverseCrunch = 55,
13818    SeatedLegU = 56,
13819    WeightedSeatedLegU = 57,
13820    SideToSideCrunchAndWeave = 58,
13821    WeightedSideToSideCrunchAndWeave = 59,
13822    SingleLegReverseCrunch = 60,
13823    WeightedSingleLegReverseCrunch = 61,
13824    SkaterCrunchCross = 62,
13825    WeightedSkaterCrunchCross = 63,
13826    StandingCableCrunch = 64,
13827    StandingSideCrunch = 65,
13828    StepClimb = 66,
13829    WeightedStepClimb = 67,
13830    SwissBallCrunch = 68,
13831    SwissBallReverseCrunch = 69,
13832    WeightedSwissBallReverseCrunch = 70,
13833    SwissBallRussianTwist = 71,
13834    WeightedSwissBallRussianTwist = 72,
13835    SwissBallSideCrunch = 73,
13836    WeightedSwissBallSideCrunch = 74,
13837    ThoracicCrunchesOnFoamRoller = 75,
13838    WeightedThoracicCrunchesOnFoamRoller = 76,
13839    TricepsCrunch = 77,
13840    WeightedBicycleCrunch = 78,
13841    WeightedCrunch = 79,
13842    WeightedSwissBallCrunch = 80,
13843    ToesToBar = 81,
13844    WeightedToesToBar = 82,
13845    Crunch = 83,
13846    StraightLegCrunchWithBall = 84,
13847    LegClimbCrunch = 86,
13848}
13849
13850impl CrunchExerciseName {
13851    /// Snake-case canonical name from Profile.xlsx.
13852    pub fn as_str(&self) -> &'static str {
13853        match self {
13854            CrunchExerciseName::BicycleCrunch => "bicycle_crunch",
13855            CrunchExerciseName::CableCrunch => "cable_crunch",
13856            CrunchExerciseName::CircularArmCrunch => "circular_arm_crunch",
13857            CrunchExerciseName::CrossedArmsCrunch => "crossed_arms_crunch",
13858            CrunchExerciseName::WeightedCrossedArmsCrunch => "weighted_crossed_arms_crunch",
13859            CrunchExerciseName::CrossLegReverseCrunch => "cross_leg_reverse_crunch",
13860            CrunchExerciseName::WeightedCrossLegReverseCrunch => {
13861                "weighted_cross_leg_reverse_crunch"
13862            }
13863            CrunchExerciseName::CrunchChop => "crunch_chop",
13864            CrunchExerciseName::WeightedCrunchChop => "weighted_crunch_chop",
13865            CrunchExerciseName::DoubleCrunch => "double_crunch",
13866            CrunchExerciseName::WeightedDoubleCrunch => "weighted_double_crunch",
13867            CrunchExerciseName::ElbowToKneeCrunch => "elbow_to_knee_crunch",
13868            CrunchExerciseName::WeightedElbowToKneeCrunch => "weighted_elbow_to_knee_crunch",
13869            CrunchExerciseName::FlutterKicks => "flutter_kicks",
13870            CrunchExerciseName::WeightedFlutterKicks => "weighted_flutter_kicks",
13871            CrunchExerciseName::FoamRollerReverseCrunchOnBench => {
13872                "foam_roller_reverse_crunch_on_bench"
13873            }
13874            CrunchExerciseName::WeightedFoamRollerReverseCrunchOnBench => {
13875                "weighted_foam_roller_reverse_crunch_on_bench"
13876            }
13877            CrunchExerciseName::FoamRollerReverseCrunchWithDumbbell => {
13878                "foam_roller_reverse_crunch_with_dumbbell"
13879            }
13880            CrunchExerciseName::FoamRollerReverseCrunchWithMedicineBall => {
13881                "foam_roller_reverse_crunch_with_medicine_ball"
13882            }
13883            CrunchExerciseName::FrogPress => "frog_press",
13884            CrunchExerciseName::HangingKneeRaiseObliqueCrunch => {
13885                "hanging_knee_raise_oblique_crunch"
13886            }
13887            CrunchExerciseName::WeightedHangingKneeRaiseObliqueCrunch => {
13888                "weighted_hanging_knee_raise_oblique_crunch"
13889            }
13890            CrunchExerciseName::HipCrossover => "hip_crossover",
13891            CrunchExerciseName::WeightedHipCrossover => "weighted_hip_crossover",
13892            CrunchExerciseName::HollowRock => "hollow_rock",
13893            CrunchExerciseName::WeightedHollowRock => "weighted_hollow_rock",
13894            CrunchExerciseName::InclineReverseCrunch => "incline_reverse_crunch",
13895            CrunchExerciseName::WeightedInclineReverseCrunch => "weighted_incline_reverse_crunch",
13896            CrunchExerciseName::KneelingCableCrunch => "kneeling_cable_crunch",
13897            CrunchExerciseName::KneelingCrossCrunch => "kneeling_cross_crunch",
13898            CrunchExerciseName::WeightedKneelingCrossCrunch => "weighted_kneeling_cross_crunch",
13899            CrunchExerciseName::KneelingObliqueCableCrunch => "kneeling_oblique_cable_crunch",
13900            CrunchExerciseName::KneesToElbow => "knees_to_elbow",
13901            CrunchExerciseName::LegExtensions => "leg_extensions",
13902            CrunchExerciseName::WeightedLegExtensions => "weighted_leg_extensions",
13903            CrunchExerciseName::LegLevers => "leg_levers",
13904            CrunchExerciseName::McgillCurlUp => "mcgill_curl_up",
13905            CrunchExerciseName::WeightedMcgillCurlUp => "weighted_mcgill_curl_up",
13906            CrunchExerciseName::ModifiedPilatesRollUpWithBall => {
13907                "modified_pilates_roll_up_with_ball"
13908            }
13909            CrunchExerciseName::WeightedModifiedPilatesRollUpWithBall => {
13910                "weighted_modified_pilates_roll_up_with_ball"
13911            }
13912            CrunchExerciseName::PilatesCrunch => "pilates_crunch",
13913            CrunchExerciseName::WeightedPilatesCrunch => "weighted_pilates_crunch",
13914            CrunchExerciseName::PilatesRollUpWithBall => "pilates_roll_up_with_ball",
13915            CrunchExerciseName::WeightedPilatesRollUpWithBall => {
13916                "weighted_pilates_roll_up_with_ball"
13917            }
13918            CrunchExerciseName::RaisedLegsCrunch => "raised_legs_crunch",
13919            CrunchExerciseName::WeightedRaisedLegsCrunch => "weighted_raised_legs_crunch",
13920            CrunchExerciseName::ReverseCrunch => "reverse_crunch",
13921            CrunchExerciseName::WeightedReverseCrunch => "weighted_reverse_crunch",
13922            CrunchExerciseName::ReverseCrunchOnABench => "reverse_crunch_on_a_bench",
13923            CrunchExerciseName::WeightedReverseCrunchOnABench => {
13924                "weighted_reverse_crunch_on_a_bench"
13925            }
13926            CrunchExerciseName::ReverseCurlAndLift => "reverse_curl_and_lift",
13927            CrunchExerciseName::WeightedReverseCurlAndLift => "weighted_reverse_curl_and_lift",
13928            CrunchExerciseName::RotationalLift => "rotational_lift",
13929            CrunchExerciseName::WeightedRotationalLift => "weighted_rotational_lift",
13930            CrunchExerciseName::SeatedAlternatingReverseCrunch => {
13931                "seated_alternating_reverse_crunch"
13932            }
13933            CrunchExerciseName::WeightedSeatedAlternatingReverseCrunch => {
13934                "weighted_seated_alternating_reverse_crunch"
13935            }
13936            CrunchExerciseName::SeatedLegU => "seated_leg_u",
13937            CrunchExerciseName::WeightedSeatedLegU => "weighted_seated_leg_u",
13938            CrunchExerciseName::SideToSideCrunchAndWeave => "side_to_side_crunch_and_weave",
13939            CrunchExerciseName::WeightedSideToSideCrunchAndWeave => {
13940                "weighted_side_to_side_crunch_and_weave"
13941            }
13942            CrunchExerciseName::SingleLegReverseCrunch => "single_leg_reverse_crunch",
13943            CrunchExerciseName::WeightedSingleLegReverseCrunch => {
13944                "weighted_single_leg_reverse_crunch"
13945            }
13946            CrunchExerciseName::SkaterCrunchCross => "skater_crunch_cross",
13947            CrunchExerciseName::WeightedSkaterCrunchCross => "weighted_skater_crunch_cross",
13948            CrunchExerciseName::StandingCableCrunch => "standing_cable_crunch",
13949            CrunchExerciseName::StandingSideCrunch => "standing_side_crunch",
13950            CrunchExerciseName::StepClimb => "step_climb",
13951            CrunchExerciseName::WeightedStepClimb => "weighted_step_climb",
13952            CrunchExerciseName::SwissBallCrunch => "swiss_ball_crunch",
13953            CrunchExerciseName::SwissBallReverseCrunch => "swiss_ball_reverse_crunch",
13954            CrunchExerciseName::WeightedSwissBallReverseCrunch => {
13955                "weighted_swiss_ball_reverse_crunch"
13956            }
13957            CrunchExerciseName::SwissBallRussianTwist => "swiss_ball_russian_twist",
13958            CrunchExerciseName::WeightedSwissBallRussianTwist => {
13959                "weighted_swiss_ball_russian_twist"
13960            }
13961            CrunchExerciseName::SwissBallSideCrunch => "swiss_ball_side_crunch",
13962            CrunchExerciseName::WeightedSwissBallSideCrunch => "weighted_swiss_ball_side_crunch",
13963            CrunchExerciseName::ThoracicCrunchesOnFoamRoller => "thoracic_crunches_on_foam_roller",
13964            CrunchExerciseName::WeightedThoracicCrunchesOnFoamRoller => {
13965                "weighted_thoracic_crunches_on_foam_roller"
13966            }
13967            CrunchExerciseName::TricepsCrunch => "triceps_crunch",
13968            CrunchExerciseName::WeightedBicycleCrunch => "weighted_bicycle_crunch",
13969            CrunchExerciseName::WeightedCrunch => "weighted_crunch",
13970            CrunchExerciseName::WeightedSwissBallCrunch => "weighted_swiss_ball_crunch",
13971            CrunchExerciseName::ToesToBar => "toes_to_bar",
13972            CrunchExerciseName::WeightedToesToBar => "weighted_toes_to_bar",
13973            CrunchExerciseName::Crunch => "crunch",
13974            CrunchExerciseName::StraightLegCrunchWithBall => "straight_leg_crunch_with_ball",
13975            CrunchExerciseName::LegClimbCrunch => "leg_climb_crunch",
13976        }
13977    }
13978
13979    /// Try to construct from the underlying numeric value.
13980    pub fn from_value(value: u16) -> Option<Self> {
13981        match value {
13982            0 => Some(CrunchExerciseName::BicycleCrunch),
13983            1 => Some(CrunchExerciseName::CableCrunch),
13984            2 => Some(CrunchExerciseName::CircularArmCrunch),
13985            3 => Some(CrunchExerciseName::CrossedArmsCrunch),
13986            4 => Some(CrunchExerciseName::WeightedCrossedArmsCrunch),
13987            5 => Some(CrunchExerciseName::CrossLegReverseCrunch),
13988            6 => Some(CrunchExerciseName::WeightedCrossLegReverseCrunch),
13989            7 => Some(CrunchExerciseName::CrunchChop),
13990            8 => Some(CrunchExerciseName::WeightedCrunchChop),
13991            9 => Some(CrunchExerciseName::DoubleCrunch),
13992            10 => Some(CrunchExerciseName::WeightedDoubleCrunch),
13993            11 => Some(CrunchExerciseName::ElbowToKneeCrunch),
13994            12 => Some(CrunchExerciseName::WeightedElbowToKneeCrunch),
13995            13 => Some(CrunchExerciseName::FlutterKicks),
13996            14 => Some(CrunchExerciseName::WeightedFlutterKicks),
13997            15 => Some(CrunchExerciseName::FoamRollerReverseCrunchOnBench),
13998            16 => Some(CrunchExerciseName::WeightedFoamRollerReverseCrunchOnBench),
13999            17 => Some(CrunchExerciseName::FoamRollerReverseCrunchWithDumbbell),
14000            18 => Some(CrunchExerciseName::FoamRollerReverseCrunchWithMedicineBall),
14001            19 => Some(CrunchExerciseName::FrogPress),
14002            20 => Some(CrunchExerciseName::HangingKneeRaiseObliqueCrunch),
14003            21 => Some(CrunchExerciseName::WeightedHangingKneeRaiseObliqueCrunch),
14004            22 => Some(CrunchExerciseName::HipCrossover),
14005            23 => Some(CrunchExerciseName::WeightedHipCrossover),
14006            24 => Some(CrunchExerciseName::HollowRock),
14007            25 => Some(CrunchExerciseName::WeightedHollowRock),
14008            26 => Some(CrunchExerciseName::InclineReverseCrunch),
14009            27 => Some(CrunchExerciseName::WeightedInclineReverseCrunch),
14010            28 => Some(CrunchExerciseName::KneelingCableCrunch),
14011            29 => Some(CrunchExerciseName::KneelingCrossCrunch),
14012            30 => Some(CrunchExerciseName::WeightedKneelingCrossCrunch),
14013            31 => Some(CrunchExerciseName::KneelingObliqueCableCrunch),
14014            32 => Some(CrunchExerciseName::KneesToElbow),
14015            33 => Some(CrunchExerciseName::LegExtensions),
14016            34 => Some(CrunchExerciseName::WeightedLegExtensions),
14017            35 => Some(CrunchExerciseName::LegLevers),
14018            36 => Some(CrunchExerciseName::McgillCurlUp),
14019            37 => Some(CrunchExerciseName::WeightedMcgillCurlUp),
14020            38 => Some(CrunchExerciseName::ModifiedPilatesRollUpWithBall),
14021            39 => Some(CrunchExerciseName::WeightedModifiedPilatesRollUpWithBall),
14022            40 => Some(CrunchExerciseName::PilatesCrunch),
14023            41 => Some(CrunchExerciseName::WeightedPilatesCrunch),
14024            42 => Some(CrunchExerciseName::PilatesRollUpWithBall),
14025            43 => Some(CrunchExerciseName::WeightedPilatesRollUpWithBall),
14026            44 => Some(CrunchExerciseName::RaisedLegsCrunch),
14027            45 => Some(CrunchExerciseName::WeightedRaisedLegsCrunch),
14028            46 => Some(CrunchExerciseName::ReverseCrunch),
14029            47 => Some(CrunchExerciseName::WeightedReverseCrunch),
14030            48 => Some(CrunchExerciseName::ReverseCrunchOnABench),
14031            49 => Some(CrunchExerciseName::WeightedReverseCrunchOnABench),
14032            50 => Some(CrunchExerciseName::ReverseCurlAndLift),
14033            51 => Some(CrunchExerciseName::WeightedReverseCurlAndLift),
14034            52 => Some(CrunchExerciseName::RotationalLift),
14035            53 => Some(CrunchExerciseName::WeightedRotationalLift),
14036            54 => Some(CrunchExerciseName::SeatedAlternatingReverseCrunch),
14037            55 => Some(CrunchExerciseName::WeightedSeatedAlternatingReverseCrunch),
14038            56 => Some(CrunchExerciseName::SeatedLegU),
14039            57 => Some(CrunchExerciseName::WeightedSeatedLegU),
14040            58 => Some(CrunchExerciseName::SideToSideCrunchAndWeave),
14041            59 => Some(CrunchExerciseName::WeightedSideToSideCrunchAndWeave),
14042            60 => Some(CrunchExerciseName::SingleLegReverseCrunch),
14043            61 => Some(CrunchExerciseName::WeightedSingleLegReverseCrunch),
14044            62 => Some(CrunchExerciseName::SkaterCrunchCross),
14045            63 => Some(CrunchExerciseName::WeightedSkaterCrunchCross),
14046            64 => Some(CrunchExerciseName::StandingCableCrunch),
14047            65 => Some(CrunchExerciseName::StandingSideCrunch),
14048            66 => Some(CrunchExerciseName::StepClimb),
14049            67 => Some(CrunchExerciseName::WeightedStepClimb),
14050            68 => Some(CrunchExerciseName::SwissBallCrunch),
14051            69 => Some(CrunchExerciseName::SwissBallReverseCrunch),
14052            70 => Some(CrunchExerciseName::WeightedSwissBallReverseCrunch),
14053            71 => Some(CrunchExerciseName::SwissBallRussianTwist),
14054            72 => Some(CrunchExerciseName::WeightedSwissBallRussianTwist),
14055            73 => Some(CrunchExerciseName::SwissBallSideCrunch),
14056            74 => Some(CrunchExerciseName::WeightedSwissBallSideCrunch),
14057            75 => Some(CrunchExerciseName::ThoracicCrunchesOnFoamRoller),
14058            76 => Some(CrunchExerciseName::WeightedThoracicCrunchesOnFoamRoller),
14059            77 => Some(CrunchExerciseName::TricepsCrunch),
14060            78 => Some(CrunchExerciseName::WeightedBicycleCrunch),
14061            79 => Some(CrunchExerciseName::WeightedCrunch),
14062            80 => Some(CrunchExerciseName::WeightedSwissBallCrunch),
14063            81 => Some(CrunchExerciseName::ToesToBar),
14064            82 => Some(CrunchExerciseName::WeightedToesToBar),
14065            83 => Some(CrunchExerciseName::Crunch),
14066            84 => Some(CrunchExerciseName::StraightLegCrunchWithBall),
14067            86 => Some(CrunchExerciseName::LegClimbCrunch),
14068            _ => None,
14069        }
14070    }
14071
14072    /// Try to construct from the snake-case canonical name.
14073    pub fn from_str(name: &str) -> Option<Self> {
14074        match name {
14075            "bicycle_crunch" => Some(CrunchExerciseName::BicycleCrunch),
14076            "cable_crunch" => Some(CrunchExerciseName::CableCrunch),
14077            "circular_arm_crunch" => Some(CrunchExerciseName::CircularArmCrunch),
14078            "crossed_arms_crunch" => Some(CrunchExerciseName::CrossedArmsCrunch),
14079            "weighted_crossed_arms_crunch" => Some(CrunchExerciseName::WeightedCrossedArmsCrunch),
14080            "cross_leg_reverse_crunch" => Some(CrunchExerciseName::CrossLegReverseCrunch),
14081            "weighted_cross_leg_reverse_crunch" => {
14082                Some(CrunchExerciseName::WeightedCrossLegReverseCrunch)
14083            }
14084            "crunch_chop" => Some(CrunchExerciseName::CrunchChop),
14085            "weighted_crunch_chop" => Some(CrunchExerciseName::WeightedCrunchChop),
14086            "double_crunch" => Some(CrunchExerciseName::DoubleCrunch),
14087            "weighted_double_crunch" => Some(CrunchExerciseName::WeightedDoubleCrunch),
14088            "elbow_to_knee_crunch" => Some(CrunchExerciseName::ElbowToKneeCrunch),
14089            "weighted_elbow_to_knee_crunch" => Some(CrunchExerciseName::WeightedElbowToKneeCrunch),
14090            "flutter_kicks" => Some(CrunchExerciseName::FlutterKicks),
14091            "weighted_flutter_kicks" => Some(CrunchExerciseName::WeightedFlutterKicks),
14092            "foam_roller_reverse_crunch_on_bench" => {
14093                Some(CrunchExerciseName::FoamRollerReverseCrunchOnBench)
14094            }
14095            "weighted_foam_roller_reverse_crunch_on_bench" => {
14096                Some(CrunchExerciseName::WeightedFoamRollerReverseCrunchOnBench)
14097            }
14098            "foam_roller_reverse_crunch_with_dumbbell" => {
14099                Some(CrunchExerciseName::FoamRollerReverseCrunchWithDumbbell)
14100            }
14101            "foam_roller_reverse_crunch_with_medicine_ball" => {
14102                Some(CrunchExerciseName::FoamRollerReverseCrunchWithMedicineBall)
14103            }
14104            "frog_press" => Some(CrunchExerciseName::FrogPress),
14105            "hanging_knee_raise_oblique_crunch" => {
14106                Some(CrunchExerciseName::HangingKneeRaiseObliqueCrunch)
14107            }
14108            "weighted_hanging_knee_raise_oblique_crunch" => {
14109                Some(CrunchExerciseName::WeightedHangingKneeRaiseObliqueCrunch)
14110            }
14111            "hip_crossover" => Some(CrunchExerciseName::HipCrossover),
14112            "weighted_hip_crossover" => Some(CrunchExerciseName::WeightedHipCrossover),
14113            "hollow_rock" => Some(CrunchExerciseName::HollowRock),
14114            "weighted_hollow_rock" => Some(CrunchExerciseName::WeightedHollowRock),
14115            "incline_reverse_crunch" => Some(CrunchExerciseName::InclineReverseCrunch),
14116            "weighted_incline_reverse_crunch" => {
14117                Some(CrunchExerciseName::WeightedInclineReverseCrunch)
14118            }
14119            "kneeling_cable_crunch" => Some(CrunchExerciseName::KneelingCableCrunch),
14120            "kneeling_cross_crunch" => Some(CrunchExerciseName::KneelingCrossCrunch),
14121            "weighted_kneeling_cross_crunch" => {
14122                Some(CrunchExerciseName::WeightedKneelingCrossCrunch)
14123            }
14124            "kneeling_oblique_cable_crunch" => Some(CrunchExerciseName::KneelingObliqueCableCrunch),
14125            "knees_to_elbow" => Some(CrunchExerciseName::KneesToElbow),
14126            "leg_extensions" => Some(CrunchExerciseName::LegExtensions),
14127            "weighted_leg_extensions" => Some(CrunchExerciseName::WeightedLegExtensions),
14128            "leg_levers" => Some(CrunchExerciseName::LegLevers),
14129            "mcgill_curl_up" => Some(CrunchExerciseName::McgillCurlUp),
14130            "weighted_mcgill_curl_up" => Some(CrunchExerciseName::WeightedMcgillCurlUp),
14131            "modified_pilates_roll_up_with_ball" => {
14132                Some(CrunchExerciseName::ModifiedPilatesRollUpWithBall)
14133            }
14134            "weighted_modified_pilates_roll_up_with_ball" => {
14135                Some(CrunchExerciseName::WeightedModifiedPilatesRollUpWithBall)
14136            }
14137            "pilates_crunch" => Some(CrunchExerciseName::PilatesCrunch),
14138            "weighted_pilates_crunch" => Some(CrunchExerciseName::WeightedPilatesCrunch),
14139            "pilates_roll_up_with_ball" => Some(CrunchExerciseName::PilatesRollUpWithBall),
14140            "weighted_pilates_roll_up_with_ball" => {
14141                Some(CrunchExerciseName::WeightedPilatesRollUpWithBall)
14142            }
14143            "raised_legs_crunch" => Some(CrunchExerciseName::RaisedLegsCrunch),
14144            "weighted_raised_legs_crunch" => Some(CrunchExerciseName::WeightedRaisedLegsCrunch),
14145            "reverse_crunch" => Some(CrunchExerciseName::ReverseCrunch),
14146            "weighted_reverse_crunch" => Some(CrunchExerciseName::WeightedReverseCrunch),
14147            "reverse_crunch_on_a_bench" => Some(CrunchExerciseName::ReverseCrunchOnABench),
14148            "weighted_reverse_crunch_on_a_bench" => {
14149                Some(CrunchExerciseName::WeightedReverseCrunchOnABench)
14150            }
14151            "reverse_curl_and_lift" => Some(CrunchExerciseName::ReverseCurlAndLift),
14152            "weighted_reverse_curl_and_lift" => {
14153                Some(CrunchExerciseName::WeightedReverseCurlAndLift)
14154            }
14155            "rotational_lift" => Some(CrunchExerciseName::RotationalLift),
14156            "weighted_rotational_lift" => Some(CrunchExerciseName::WeightedRotationalLift),
14157            "seated_alternating_reverse_crunch" => {
14158                Some(CrunchExerciseName::SeatedAlternatingReverseCrunch)
14159            }
14160            "weighted_seated_alternating_reverse_crunch" => {
14161                Some(CrunchExerciseName::WeightedSeatedAlternatingReverseCrunch)
14162            }
14163            "seated_leg_u" => Some(CrunchExerciseName::SeatedLegU),
14164            "weighted_seated_leg_u" => Some(CrunchExerciseName::WeightedSeatedLegU),
14165            "side_to_side_crunch_and_weave" => Some(CrunchExerciseName::SideToSideCrunchAndWeave),
14166            "weighted_side_to_side_crunch_and_weave" => {
14167                Some(CrunchExerciseName::WeightedSideToSideCrunchAndWeave)
14168            }
14169            "single_leg_reverse_crunch" => Some(CrunchExerciseName::SingleLegReverseCrunch),
14170            "weighted_single_leg_reverse_crunch" => {
14171                Some(CrunchExerciseName::WeightedSingleLegReverseCrunch)
14172            }
14173            "skater_crunch_cross" => Some(CrunchExerciseName::SkaterCrunchCross),
14174            "weighted_skater_crunch_cross" => Some(CrunchExerciseName::WeightedSkaterCrunchCross),
14175            "standing_cable_crunch" => Some(CrunchExerciseName::StandingCableCrunch),
14176            "standing_side_crunch" => Some(CrunchExerciseName::StandingSideCrunch),
14177            "step_climb" => Some(CrunchExerciseName::StepClimb),
14178            "weighted_step_climb" => Some(CrunchExerciseName::WeightedStepClimb),
14179            "swiss_ball_crunch" => Some(CrunchExerciseName::SwissBallCrunch),
14180            "swiss_ball_reverse_crunch" => Some(CrunchExerciseName::SwissBallReverseCrunch),
14181            "weighted_swiss_ball_reverse_crunch" => {
14182                Some(CrunchExerciseName::WeightedSwissBallReverseCrunch)
14183            }
14184            "swiss_ball_russian_twist" => Some(CrunchExerciseName::SwissBallRussianTwist),
14185            "weighted_swiss_ball_russian_twist" => {
14186                Some(CrunchExerciseName::WeightedSwissBallRussianTwist)
14187            }
14188            "swiss_ball_side_crunch" => Some(CrunchExerciseName::SwissBallSideCrunch),
14189            "weighted_swiss_ball_side_crunch" => {
14190                Some(CrunchExerciseName::WeightedSwissBallSideCrunch)
14191            }
14192            "thoracic_crunches_on_foam_roller" => {
14193                Some(CrunchExerciseName::ThoracicCrunchesOnFoamRoller)
14194            }
14195            "weighted_thoracic_crunches_on_foam_roller" => {
14196                Some(CrunchExerciseName::WeightedThoracicCrunchesOnFoamRoller)
14197            }
14198            "triceps_crunch" => Some(CrunchExerciseName::TricepsCrunch),
14199            "weighted_bicycle_crunch" => Some(CrunchExerciseName::WeightedBicycleCrunch),
14200            "weighted_crunch" => Some(CrunchExerciseName::WeightedCrunch),
14201            "weighted_swiss_ball_crunch" => Some(CrunchExerciseName::WeightedSwissBallCrunch),
14202            "toes_to_bar" => Some(CrunchExerciseName::ToesToBar),
14203            "weighted_toes_to_bar" => Some(CrunchExerciseName::WeightedToesToBar),
14204            "crunch" => Some(CrunchExerciseName::Crunch),
14205            "straight_leg_crunch_with_ball" => Some(CrunchExerciseName::StraightLegCrunchWithBall),
14206            "leg_climb_crunch" => Some(CrunchExerciseName::LegClimbCrunch),
14207            _ => None,
14208        }
14209    }
14210}
14211
14212#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
14213#[repr(u16)]
14214#[non_exhaustive]
14215pub enum CurlExerciseName {
14216    AlternatingDumbbellBicepsCurl = 0,
14217    AlternatingDumbbellBicepsCurlOnSwissBall = 1,
14218    AlternatingInclineDumbbellBicepsCurl = 2,
14219    BarbellBicepsCurl = 3,
14220    BarbellReverseWristCurl = 4,
14221    BarbellWristCurl = 5,
14222    BehindTheBackBarbellReverseWristCurl = 6,
14223    BehindTheBackOneArmCableCurl = 7,
14224    CableBicepsCurl = 8,
14225    CableHammerCurl = 9,
14226    CheatingBarbellBicepsCurl = 10,
14227    CloseGripEzBarBicepsCurl = 11,
14228    CrossBodyDumbbellHammerCurl = 12,
14229    DeadHangBicepsCurl = 13,
14230    DeclineHammerCurl = 14,
14231    DumbbellBicepsCurlWithStaticHold = 15,
14232    DumbbellHammerCurl = 16,
14233    DumbbellReverseWristCurl = 17,
14234    DumbbellWristCurl = 18,
14235    EzBarPreacherCurl = 19,
14236    ForwardBendBicepsCurl = 20,
14237    HammerCurlToPress = 21,
14238    InclineDumbbellBicepsCurl = 22,
14239    InclineOffsetThumbDumbbellCurl = 23,
14240    KettlebellBicepsCurl = 24,
14241    LyingConcentrationCableCurl = 25,
14242    OneArmPreacherCurl = 26,
14243    PlatePinchCurl = 27,
14244    PreacherCurlWithCable = 28,
14245    ReverseEzBarCurl = 29,
14246    ReverseGripWristCurl = 30,
14247    ReverseGripBarbellBicepsCurl = 31,
14248    SeatedAlternatingDumbbellBicepsCurl = 32,
14249    SeatedDumbbellBicepsCurl = 33,
14250    SeatedReverseDumbbellCurl = 34,
14251    SplitStanceOffsetPinkyDumbbellCurl = 35,
14252    StandingAlternatingDumbbellCurls = 36,
14253    StandingDumbbellBicepsCurl = 37,
14254    StandingEzBarBicepsCurl = 38,
14255    StaticCurl = 39,
14256    SwissBallDumbbellOverheadTricepsExtension = 40,
14257    SwissBallEzBarPreacherCurl = 41,
14258    TwistingStandingDumbbellBicepsCurl = 42,
14259    WideGripEzBarBicepsCurl = 43,
14260    OneArmConcentrationCurl = 44,
14261    StandingZottmanBicepsCurl = 45,
14262    DumbbellBicepsCurl = 46,
14263    DragCurlWheelchair = 47,
14264    DumbbellBicepsCurlWheelchair = 48,
14265    BottleCurl = 49,
14266    SeatedBottleCurl = 50,
14267}
14268
14269impl CurlExerciseName {
14270    /// Snake-case canonical name from Profile.xlsx.
14271    pub fn as_str(&self) -> &'static str {
14272        match self {
14273            CurlExerciseName::AlternatingDumbbellBicepsCurl => "alternating_dumbbell_biceps_curl",
14274            CurlExerciseName::AlternatingDumbbellBicepsCurlOnSwissBall => {
14275                "alternating_dumbbell_biceps_curl_on_swiss_ball"
14276            }
14277            CurlExerciseName::AlternatingInclineDumbbellBicepsCurl => {
14278                "alternating_incline_dumbbell_biceps_curl"
14279            }
14280            CurlExerciseName::BarbellBicepsCurl => "barbell_biceps_curl",
14281            CurlExerciseName::BarbellReverseWristCurl => "barbell_reverse_wrist_curl",
14282            CurlExerciseName::BarbellWristCurl => "barbell_wrist_curl",
14283            CurlExerciseName::BehindTheBackBarbellReverseWristCurl => {
14284                "behind_the_back_barbell_reverse_wrist_curl"
14285            }
14286            CurlExerciseName::BehindTheBackOneArmCableCurl => "behind_the_back_one_arm_cable_curl",
14287            CurlExerciseName::CableBicepsCurl => "cable_biceps_curl",
14288            CurlExerciseName::CableHammerCurl => "cable_hammer_curl",
14289            CurlExerciseName::CheatingBarbellBicepsCurl => "cheating_barbell_biceps_curl",
14290            CurlExerciseName::CloseGripEzBarBicepsCurl => "close_grip_ez_bar_biceps_curl",
14291            CurlExerciseName::CrossBodyDumbbellHammerCurl => "cross_body_dumbbell_hammer_curl",
14292            CurlExerciseName::DeadHangBicepsCurl => "dead_hang_biceps_curl",
14293            CurlExerciseName::DeclineHammerCurl => "decline_hammer_curl",
14294            CurlExerciseName::DumbbellBicepsCurlWithStaticHold => {
14295                "dumbbell_biceps_curl_with_static_hold"
14296            }
14297            CurlExerciseName::DumbbellHammerCurl => "dumbbell_hammer_curl",
14298            CurlExerciseName::DumbbellReverseWristCurl => "dumbbell_reverse_wrist_curl",
14299            CurlExerciseName::DumbbellWristCurl => "dumbbell_wrist_curl",
14300            CurlExerciseName::EzBarPreacherCurl => "ez_bar_preacher_curl",
14301            CurlExerciseName::ForwardBendBicepsCurl => "forward_bend_biceps_curl",
14302            CurlExerciseName::HammerCurlToPress => "hammer_curl_to_press",
14303            CurlExerciseName::InclineDumbbellBicepsCurl => "incline_dumbbell_biceps_curl",
14304            CurlExerciseName::InclineOffsetThumbDumbbellCurl => {
14305                "incline_offset_thumb_dumbbell_curl"
14306            }
14307            CurlExerciseName::KettlebellBicepsCurl => "kettlebell_biceps_curl",
14308            CurlExerciseName::LyingConcentrationCableCurl => "lying_concentration_cable_curl",
14309            CurlExerciseName::OneArmPreacherCurl => "one_arm_preacher_curl",
14310            CurlExerciseName::PlatePinchCurl => "plate_pinch_curl",
14311            CurlExerciseName::PreacherCurlWithCable => "preacher_curl_with_cable",
14312            CurlExerciseName::ReverseEzBarCurl => "reverse_ez_bar_curl",
14313            CurlExerciseName::ReverseGripWristCurl => "reverse_grip_wrist_curl",
14314            CurlExerciseName::ReverseGripBarbellBicepsCurl => "reverse_grip_barbell_biceps_curl",
14315            CurlExerciseName::SeatedAlternatingDumbbellBicepsCurl => {
14316                "seated_alternating_dumbbell_biceps_curl"
14317            }
14318            CurlExerciseName::SeatedDumbbellBicepsCurl => "seated_dumbbell_biceps_curl",
14319            CurlExerciseName::SeatedReverseDumbbellCurl => "seated_reverse_dumbbell_curl",
14320            CurlExerciseName::SplitStanceOffsetPinkyDumbbellCurl => {
14321                "split_stance_offset_pinky_dumbbell_curl"
14322            }
14323            CurlExerciseName::StandingAlternatingDumbbellCurls => {
14324                "standing_alternating_dumbbell_curls"
14325            }
14326            CurlExerciseName::StandingDumbbellBicepsCurl => "standing_dumbbell_biceps_curl",
14327            CurlExerciseName::StandingEzBarBicepsCurl => "standing_ez_bar_biceps_curl",
14328            CurlExerciseName::StaticCurl => "static_curl",
14329            CurlExerciseName::SwissBallDumbbellOverheadTricepsExtension => {
14330                "swiss_ball_dumbbell_overhead_triceps_extension"
14331            }
14332            CurlExerciseName::SwissBallEzBarPreacherCurl => "swiss_ball_ez_bar_preacher_curl",
14333            CurlExerciseName::TwistingStandingDumbbellBicepsCurl => {
14334                "twisting_standing_dumbbell_biceps_curl"
14335            }
14336            CurlExerciseName::WideGripEzBarBicepsCurl => "wide_grip_ez_bar_biceps_curl",
14337            CurlExerciseName::OneArmConcentrationCurl => "one_arm_concentration_curl",
14338            CurlExerciseName::StandingZottmanBicepsCurl => "standing_zottman_biceps_curl",
14339            CurlExerciseName::DumbbellBicepsCurl => "dumbbell_biceps_curl",
14340            CurlExerciseName::DragCurlWheelchair => "drag_curl_wheelchair",
14341            CurlExerciseName::DumbbellBicepsCurlWheelchair => "dumbbell_biceps_curl_wheelchair",
14342            CurlExerciseName::BottleCurl => "bottle_curl",
14343            CurlExerciseName::SeatedBottleCurl => "seated_bottle_curl",
14344        }
14345    }
14346
14347    /// Try to construct from the underlying numeric value.
14348    pub fn from_value(value: u16) -> Option<Self> {
14349        match value {
14350            0 => Some(CurlExerciseName::AlternatingDumbbellBicepsCurl),
14351            1 => Some(CurlExerciseName::AlternatingDumbbellBicepsCurlOnSwissBall),
14352            2 => Some(CurlExerciseName::AlternatingInclineDumbbellBicepsCurl),
14353            3 => Some(CurlExerciseName::BarbellBicepsCurl),
14354            4 => Some(CurlExerciseName::BarbellReverseWristCurl),
14355            5 => Some(CurlExerciseName::BarbellWristCurl),
14356            6 => Some(CurlExerciseName::BehindTheBackBarbellReverseWristCurl),
14357            7 => Some(CurlExerciseName::BehindTheBackOneArmCableCurl),
14358            8 => Some(CurlExerciseName::CableBicepsCurl),
14359            9 => Some(CurlExerciseName::CableHammerCurl),
14360            10 => Some(CurlExerciseName::CheatingBarbellBicepsCurl),
14361            11 => Some(CurlExerciseName::CloseGripEzBarBicepsCurl),
14362            12 => Some(CurlExerciseName::CrossBodyDumbbellHammerCurl),
14363            13 => Some(CurlExerciseName::DeadHangBicepsCurl),
14364            14 => Some(CurlExerciseName::DeclineHammerCurl),
14365            15 => Some(CurlExerciseName::DumbbellBicepsCurlWithStaticHold),
14366            16 => Some(CurlExerciseName::DumbbellHammerCurl),
14367            17 => Some(CurlExerciseName::DumbbellReverseWristCurl),
14368            18 => Some(CurlExerciseName::DumbbellWristCurl),
14369            19 => Some(CurlExerciseName::EzBarPreacherCurl),
14370            20 => Some(CurlExerciseName::ForwardBendBicepsCurl),
14371            21 => Some(CurlExerciseName::HammerCurlToPress),
14372            22 => Some(CurlExerciseName::InclineDumbbellBicepsCurl),
14373            23 => Some(CurlExerciseName::InclineOffsetThumbDumbbellCurl),
14374            24 => Some(CurlExerciseName::KettlebellBicepsCurl),
14375            25 => Some(CurlExerciseName::LyingConcentrationCableCurl),
14376            26 => Some(CurlExerciseName::OneArmPreacherCurl),
14377            27 => Some(CurlExerciseName::PlatePinchCurl),
14378            28 => Some(CurlExerciseName::PreacherCurlWithCable),
14379            29 => Some(CurlExerciseName::ReverseEzBarCurl),
14380            30 => Some(CurlExerciseName::ReverseGripWristCurl),
14381            31 => Some(CurlExerciseName::ReverseGripBarbellBicepsCurl),
14382            32 => Some(CurlExerciseName::SeatedAlternatingDumbbellBicepsCurl),
14383            33 => Some(CurlExerciseName::SeatedDumbbellBicepsCurl),
14384            34 => Some(CurlExerciseName::SeatedReverseDumbbellCurl),
14385            35 => Some(CurlExerciseName::SplitStanceOffsetPinkyDumbbellCurl),
14386            36 => Some(CurlExerciseName::StandingAlternatingDumbbellCurls),
14387            37 => Some(CurlExerciseName::StandingDumbbellBicepsCurl),
14388            38 => Some(CurlExerciseName::StandingEzBarBicepsCurl),
14389            39 => Some(CurlExerciseName::StaticCurl),
14390            40 => Some(CurlExerciseName::SwissBallDumbbellOverheadTricepsExtension),
14391            41 => Some(CurlExerciseName::SwissBallEzBarPreacherCurl),
14392            42 => Some(CurlExerciseName::TwistingStandingDumbbellBicepsCurl),
14393            43 => Some(CurlExerciseName::WideGripEzBarBicepsCurl),
14394            44 => Some(CurlExerciseName::OneArmConcentrationCurl),
14395            45 => Some(CurlExerciseName::StandingZottmanBicepsCurl),
14396            46 => Some(CurlExerciseName::DumbbellBicepsCurl),
14397            47 => Some(CurlExerciseName::DragCurlWheelchair),
14398            48 => Some(CurlExerciseName::DumbbellBicepsCurlWheelchair),
14399            49 => Some(CurlExerciseName::BottleCurl),
14400            50 => Some(CurlExerciseName::SeatedBottleCurl),
14401            _ => None,
14402        }
14403    }
14404
14405    /// Try to construct from the snake-case canonical name.
14406    pub fn from_str(name: &str) -> Option<Self> {
14407        match name {
14408            "alternating_dumbbell_biceps_curl" => {
14409                Some(CurlExerciseName::AlternatingDumbbellBicepsCurl)
14410            }
14411            "alternating_dumbbell_biceps_curl_on_swiss_ball" => {
14412                Some(CurlExerciseName::AlternatingDumbbellBicepsCurlOnSwissBall)
14413            }
14414            "alternating_incline_dumbbell_biceps_curl" => {
14415                Some(CurlExerciseName::AlternatingInclineDumbbellBicepsCurl)
14416            }
14417            "barbell_biceps_curl" => Some(CurlExerciseName::BarbellBicepsCurl),
14418            "barbell_reverse_wrist_curl" => Some(CurlExerciseName::BarbellReverseWristCurl),
14419            "barbell_wrist_curl" => Some(CurlExerciseName::BarbellWristCurl),
14420            "behind_the_back_barbell_reverse_wrist_curl" => {
14421                Some(CurlExerciseName::BehindTheBackBarbellReverseWristCurl)
14422            }
14423            "behind_the_back_one_arm_cable_curl" => {
14424                Some(CurlExerciseName::BehindTheBackOneArmCableCurl)
14425            }
14426            "cable_biceps_curl" => Some(CurlExerciseName::CableBicepsCurl),
14427            "cable_hammer_curl" => Some(CurlExerciseName::CableHammerCurl),
14428            "cheating_barbell_biceps_curl" => Some(CurlExerciseName::CheatingBarbellBicepsCurl),
14429            "close_grip_ez_bar_biceps_curl" => Some(CurlExerciseName::CloseGripEzBarBicepsCurl),
14430            "cross_body_dumbbell_hammer_curl" => {
14431                Some(CurlExerciseName::CrossBodyDumbbellHammerCurl)
14432            }
14433            "dead_hang_biceps_curl" => Some(CurlExerciseName::DeadHangBicepsCurl),
14434            "decline_hammer_curl" => Some(CurlExerciseName::DeclineHammerCurl),
14435            "dumbbell_biceps_curl_with_static_hold" => {
14436                Some(CurlExerciseName::DumbbellBicepsCurlWithStaticHold)
14437            }
14438            "dumbbell_hammer_curl" => Some(CurlExerciseName::DumbbellHammerCurl),
14439            "dumbbell_reverse_wrist_curl" => Some(CurlExerciseName::DumbbellReverseWristCurl),
14440            "dumbbell_wrist_curl" => Some(CurlExerciseName::DumbbellWristCurl),
14441            "ez_bar_preacher_curl" => Some(CurlExerciseName::EzBarPreacherCurl),
14442            "forward_bend_biceps_curl" => Some(CurlExerciseName::ForwardBendBicepsCurl),
14443            "hammer_curl_to_press" => Some(CurlExerciseName::HammerCurlToPress),
14444            "incline_dumbbell_biceps_curl" => Some(CurlExerciseName::InclineDumbbellBicepsCurl),
14445            "incline_offset_thumb_dumbbell_curl" => {
14446                Some(CurlExerciseName::InclineOffsetThumbDumbbellCurl)
14447            }
14448            "kettlebell_biceps_curl" => Some(CurlExerciseName::KettlebellBicepsCurl),
14449            "lying_concentration_cable_curl" => Some(CurlExerciseName::LyingConcentrationCableCurl),
14450            "one_arm_preacher_curl" => Some(CurlExerciseName::OneArmPreacherCurl),
14451            "plate_pinch_curl" => Some(CurlExerciseName::PlatePinchCurl),
14452            "preacher_curl_with_cable" => Some(CurlExerciseName::PreacherCurlWithCable),
14453            "reverse_ez_bar_curl" => Some(CurlExerciseName::ReverseEzBarCurl),
14454            "reverse_grip_wrist_curl" => Some(CurlExerciseName::ReverseGripWristCurl),
14455            "reverse_grip_barbell_biceps_curl" => {
14456                Some(CurlExerciseName::ReverseGripBarbellBicepsCurl)
14457            }
14458            "seated_alternating_dumbbell_biceps_curl" => {
14459                Some(CurlExerciseName::SeatedAlternatingDumbbellBicepsCurl)
14460            }
14461            "seated_dumbbell_biceps_curl" => Some(CurlExerciseName::SeatedDumbbellBicepsCurl),
14462            "seated_reverse_dumbbell_curl" => Some(CurlExerciseName::SeatedReverseDumbbellCurl),
14463            "split_stance_offset_pinky_dumbbell_curl" => {
14464                Some(CurlExerciseName::SplitStanceOffsetPinkyDumbbellCurl)
14465            }
14466            "standing_alternating_dumbbell_curls" => {
14467                Some(CurlExerciseName::StandingAlternatingDumbbellCurls)
14468            }
14469            "standing_dumbbell_biceps_curl" => Some(CurlExerciseName::StandingDumbbellBicepsCurl),
14470            "standing_ez_bar_biceps_curl" => Some(CurlExerciseName::StandingEzBarBicepsCurl),
14471            "static_curl" => Some(CurlExerciseName::StaticCurl),
14472            "swiss_ball_dumbbell_overhead_triceps_extension" => {
14473                Some(CurlExerciseName::SwissBallDumbbellOverheadTricepsExtension)
14474            }
14475            "swiss_ball_ez_bar_preacher_curl" => Some(CurlExerciseName::SwissBallEzBarPreacherCurl),
14476            "twisting_standing_dumbbell_biceps_curl" => {
14477                Some(CurlExerciseName::TwistingStandingDumbbellBicepsCurl)
14478            }
14479            "wide_grip_ez_bar_biceps_curl" => Some(CurlExerciseName::WideGripEzBarBicepsCurl),
14480            "one_arm_concentration_curl" => Some(CurlExerciseName::OneArmConcentrationCurl),
14481            "standing_zottman_biceps_curl" => Some(CurlExerciseName::StandingZottmanBicepsCurl),
14482            "dumbbell_biceps_curl" => Some(CurlExerciseName::DumbbellBicepsCurl),
14483            "drag_curl_wheelchair" => Some(CurlExerciseName::DragCurlWheelchair),
14484            "dumbbell_biceps_curl_wheelchair" => {
14485                Some(CurlExerciseName::DumbbellBicepsCurlWheelchair)
14486            }
14487            "bottle_curl" => Some(CurlExerciseName::BottleCurl),
14488            "seated_bottle_curl" => Some(CurlExerciseName::SeatedBottleCurl),
14489            _ => None,
14490        }
14491    }
14492}
14493
14494#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
14495#[repr(u16)]
14496#[non_exhaustive]
14497pub enum DeadliftExerciseName {
14498    BarbellDeadlift = 0,
14499    BarbellStraightLegDeadlift = 1,
14500    DumbbellDeadlift = 2,
14501    DumbbellSingleLegDeadliftToRow = 3,
14502    DumbbellStraightLegDeadlift = 4,
14503    KettlebellFloorToShelf = 5,
14504    OneArmOneLegDeadlift = 6,
14505    RackPull = 7,
14506    RotationalDumbbellStraightLegDeadlift = 8,
14507    SingleArmDeadlift = 9,
14508    SingleLegBarbellDeadlift = 10,
14509    SingleLegBarbellStraightLegDeadlift = 11,
14510    SingleLegDeadliftWithBarbell = 12,
14511    SingleLegRdlCircuit = 13,
14512    SingleLegRomanianDeadliftWithDumbbell = 14,
14513    SumoDeadlift = 15,
14514    SumoDeadliftHighPull = 16,
14515    TrapBarDeadlift = 17,
14516    WideGripBarbellDeadlift = 18,
14517    KettlebellDeadlift = 20,
14518    KettlebellSumoDeadlift = 21,
14519    RomanianDeadlift = 23,
14520    SingleLegRomanianDeadliftCircuit = 24,
14521    StraightLegDeadlift = 25,
14522}
14523
14524impl DeadliftExerciseName {
14525    /// Snake-case canonical name from Profile.xlsx.
14526    pub fn as_str(&self) -> &'static str {
14527        match self {
14528            DeadliftExerciseName::BarbellDeadlift => "barbell_deadlift",
14529            DeadliftExerciseName::BarbellStraightLegDeadlift => "barbell_straight_leg_deadlift",
14530            DeadliftExerciseName::DumbbellDeadlift => "dumbbell_deadlift",
14531            DeadliftExerciseName::DumbbellSingleLegDeadliftToRow => {
14532                "dumbbell_single_leg_deadlift_to_row"
14533            }
14534            DeadliftExerciseName::DumbbellStraightLegDeadlift => "dumbbell_straight_leg_deadlift",
14535            DeadliftExerciseName::KettlebellFloorToShelf => "kettlebell_floor_to_shelf",
14536            DeadliftExerciseName::OneArmOneLegDeadlift => "one_arm_one_leg_deadlift",
14537            DeadliftExerciseName::RackPull => "rack_pull",
14538            DeadliftExerciseName::RotationalDumbbellStraightLegDeadlift => {
14539                "rotational_dumbbell_straight_leg_deadlift"
14540            }
14541            DeadliftExerciseName::SingleArmDeadlift => "single_arm_deadlift",
14542            DeadliftExerciseName::SingleLegBarbellDeadlift => "single_leg_barbell_deadlift",
14543            DeadliftExerciseName::SingleLegBarbellStraightLegDeadlift => {
14544                "single_leg_barbell_straight_leg_deadlift"
14545            }
14546            DeadliftExerciseName::SingleLegDeadliftWithBarbell => {
14547                "single_leg_deadlift_with_barbell"
14548            }
14549            DeadliftExerciseName::SingleLegRdlCircuit => "single_leg_rdl_circuit",
14550            DeadliftExerciseName::SingleLegRomanianDeadliftWithDumbbell => {
14551                "single_leg_romanian_deadlift_with_dumbbell"
14552            }
14553            DeadliftExerciseName::SumoDeadlift => "sumo_deadlift",
14554            DeadliftExerciseName::SumoDeadliftHighPull => "sumo_deadlift_high_pull",
14555            DeadliftExerciseName::TrapBarDeadlift => "trap_bar_deadlift",
14556            DeadliftExerciseName::WideGripBarbellDeadlift => "wide_grip_barbell_deadlift",
14557            DeadliftExerciseName::KettlebellDeadlift => "kettlebell_deadlift",
14558            DeadliftExerciseName::KettlebellSumoDeadlift => "kettlebell_sumo_deadlift",
14559            DeadliftExerciseName::RomanianDeadlift => "romanian_deadlift",
14560            DeadliftExerciseName::SingleLegRomanianDeadliftCircuit => {
14561                "single_leg_romanian_deadlift_circuit"
14562            }
14563            DeadliftExerciseName::StraightLegDeadlift => "straight_leg_deadlift",
14564        }
14565    }
14566
14567    /// Try to construct from the underlying numeric value.
14568    pub fn from_value(value: u16) -> Option<Self> {
14569        match value {
14570            0 => Some(DeadliftExerciseName::BarbellDeadlift),
14571            1 => Some(DeadliftExerciseName::BarbellStraightLegDeadlift),
14572            2 => Some(DeadliftExerciseName::DumbbellDeadlift),
14573            3 => Some(DeadliftExerciseName::DumbbellSingleLegDeadliftToRow),
14574            4 => Some(DeadliftExerciseName::DumbbellStraightLegDeadlift),
14575            5 => Some(DeadliftExerciseName::KettlebellFloorToShelf),
14576            6 => Some(DeadliftExerciseName::OneArmOneLegDeadlift),
14577            7 => Some(DeadliftExerciseName::RackPull),
14578            8 => Some(DeadliftExerciseName::RotationalDumbbellStraightLegDeadlift),
14579            9 => Some(DeadliftExerciseName::SingleArmDeadlift),
14580            10 => Some(DeadliftExerciseName::SingleLegBarbellDeadlift),
14581            11 => Some(DeadliftExerciseName::SingleLegBarbellStraightLegDeadlift),
14582            12 => Some(DeadliftExerciseName::SingleLegDeadliftWithBarbell),
14583            13 => Some(DeadliftExerciseName::SingleLegRdlCircuit),
14584            14 => Some(DeadliftExerciseName::SingleLegRomanianDeadliftWithDumbbell),
14585            15 => Some(DeadliftExerciseName::SumoDeadlift),
14586            16 => Some(DeadliftExerciseName::SumoDeadliftHighPull),
14587            17 => Some(DeadliftExerciseName::TrapBarDeadlift),
14588            18 => Some(DeadliftExerciseName::WideGripBarbellDeadlift),
14589            20 => Some(DeadliftExerciseName::KettlebellDeadlift),
14590            21 => Some(DeadliftExerciseName::KettlebellSumoDeadlift),
14591            23 => Some(DeadliftExerciseName::RomanianDeadlift),
14592            24 => Some(DeadliftExerciseName::SingleLegRomanianDeadliftCircuit),
14593            25 => Some(DeadliftExerciseName::StraightLegDeadlift),
14594            _ => None,
14595        }
14596    }
14597
14598    /// Try to construct from the snake-case canonical name.
14599    pub fn from_str(name: &str) -> Option<Self> {
14600        match name {
14601            "barbell_deadlift" => Some(DeadliftExerciseName::BarbellDeadlift),
14602            "barbell_straight_leg_deadlift" => {
14603                Some(DeadliftExerciseName::BarbellStraightLegDeadlift)
14604            }
14605            "dumbbell_deadlift" => Some(DeadliftExerciseName::DumbbellDeadlift),
14606            "dumbbell_single_leg_deadlift_to_row" => {
14607                Some(DeadliftExerciseName::DumbbellSingleLegDeadliftToRow)
14608            }
14609            "dumbbell_straight_leg_deadlift" => {
14610                Some(DeadliftExerciseName::DumbbellStraightLegDeadlift)
14611            }
14612            "kettlebell_floor_to_shelf" => Some(DeadliftExerciseName::KettlebellFloorToShelf),
14613            "one_arm_one_leg_deadlift" => Some(DeadliftExerciseName::OneArmOneLegDeadlift),
14614            "rack_pull" => Some(DeadliftExerciseName::RackPull),
14615            "rotational_dumbbell_straight_leg_deadlift" => {
14616                Some(DeadliftExerciseName::RotationalDumbbellStraightLegDeadlift)
14617            }
14618            "single_arm_deadlift" => Some(DeadliftExerciseName::SingleArmDeadlift),
14619            "single_leg_barbell_deadlift" => Some(DeadliftExerciseName::SingleLegBarbellDeadlift),
14620            "single_leg_barbell_straight_leg_deadlift" => {
14621                Some(DeadliftExerciseName::SingleLegBarbellStraightLegDeadlift)
14622            }
14623            "single_leg_deadlift_with_barbell" => {
14624                Some(DeadliftExerciseName::SingleLegDeadliftWithBarbell)
14625            }
14626            "single_leg_rdl_circuit" => Some(DeadliftExerciseName::SingleLegRdlCircuit),
14627            "single_leg_romanian_deadlift_with_dumbbell" => {
14628                Some(DeadliftExerciseName::SingleLegRomanianDeadliftWithDumbbell)
14629            }
14630            "sumo_deadlift" => Some(DeadliftExerciseName::SumoDeadlift),
14631            "sumo_deadlift_high_pull" => Some(DeadliftExerciseName::SumoDeadliftHighPull),
14632            "trap_bar_deadlift" => Some(DeadliftExerciseName::TrapBarDeadlift),
14633            "wide_grip_barbell_deadlift" => Some(DeadliftExerciseName::WideGripBarbellDeadlift),
14634            "kettlebell_deadlift" => Some(DeadliftExerciseName::KettlebellDeadlift),
14635            "kettlebell_sumo_deadlift" => Some(DeadliftExerciseName::KettlebellSumoDeadlift),
14636            "romanian_deadlift" => Some(DeadliftExerciseName::RomanianDeadlift),
14637            "single_leg_romanian_deadlift_circuit" => {
14638                Some(DeadliftExerciseName::SingleLegRomanianDeadliftCircuit)
14639            }
14640            "straight_leg_deadlift" => Some(DeadliftExerciseName::StraightLegDeadlift),
14641            _ => None,
14642        }
14643    }
14644}
14645
14646#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
14647#[repr(u16)]
14648#[non_exhaustive]
14649pub enum FlyeExerciseName {
14650    CableCrossover = 0,
14651    DeclineDumbbellFlye = 1,
14652    DumbbellFlye = 2,
14653    InclineDumbbellFlye = 3,
14654    KettlebellFlye = 4,
14655    KneelingRearFlye = 5,
14656    SingleArmStandingCableReverseFlye = 6,
14657    SwissBallDumbbellFlye = 7,
14658    ArmRotations = 8,
14659    HugATree = 9,
14660    FaceDownInclineReverseFlye = 10,
14661    InclineReverseFlye = 11,
14662    RearDeltFlyWheelchair = 12,
14663}
14664
14665impl FlyeExerciseName {
14666    /// Snake-case canonical name from Profile.xlsx.
14667    pub fn as_str(&self) -> &'static str {
14668        match self {
14669            FlyeExerciseName::CableCrossover => "cable_crossover",
14670            FlyeExerciseName::DeclineDumbbellFlye => "decline_dumbbell_flye",
14671            FlyeExerciseName::DumbbellFlye => "dumbbell_flye",
14672            FlyeExerciseName::InclineDumbbellFlye => "incline_dumbbell_flye",
14673            FlyeExerciseName::KettlebellFlye => "kettlebell_flye",
14674            FlyeExerciseName::KneelingRearFlye => "kneeling_rear_flye",
14675            FlyeExerciseName::SingleArmStandingCableReverseFlye => {
14676                "single_arm_standing_cable_reverse_flye"
14677            }
14678            FlyeExerciseName::SwissBallDumbbellFlye => "swiss_ball_dumbbell_flye",
14679            FlyeExerciseName::ArmRotations => "arm_rotations",
14680            FlyeExerciseName::HugATree => "hug_a_tree",
14681            FlyeExerciseName::FaceDownInclineReverseFlye => "face_down_incline_reverse_flye",
14682            FlyeExerciseName::InclineReverseFlye => "incline_reverse_flye",
14683            FlyeExerciseName::RearDeltFlyWheelchair => "rear_delt_fly_wheelchair",
14684        }
14685    }
14686
14687    /// Try to construct from the underlying numeric value.
14688    pub fn from_value(value: u16) -> Option<Self> {
14689        match value {
14690            0 => Some(FlyeExerciseName::CableCrossover),
14691            1 => Some(FlyeExerciseName::DeclineDumbbellFlye),
14692            2 => Some(FlyeExerciseName::DumbbellFlye),
14693            3 => Some(FlyeExerciseName::InclineDumbbellFlye),
14694            4 => Some(FlyeExerciseName::KettlebellFlye),
14695            5 => Some(FlyeExerciseName::KneelingRearFlye),
14696            6 => Some(FlyeExerciseName::SingleArmStandingCableReverseFlye),
14697            7 => Some(FlyeExerciseName::SwissBallDumbbellFlye),
14698            8 => Some(FlyeExerciseName::ArmRotations),
14699            9 => Some(FlyeExerciseName::HugATree),
14700            10 => Some(FlyeExerciseName::FaceDownInclineReverseFlye),
14701            11 => Some(FlyeExerciseName::InclineReverseFlye),
14702            12 => Some(FlyeExerciseName::RearDeltFlyWheelchair),
14703            _ => None,
14704        }
14705    }
14706
14707    /// Try to construct from the snake-case canonical name.
14708    pub fn from_str(name: &str) -> Option<Self> {
14709        match name {
14710            "cable_crossover" => Some(FlyeExerciseName::CableCrossover),
14711            "decline_dumbbell_flye" => Some(FlyeExerciseName::DeclineDumbbellFlye),
14712            "dumbbell_flye" => Some(FlyeExerciseName::DumbbellFlye),
14713            "incline_dumbbell_flye" => Some(FlyeExerciseName::InclineDumbbellFlye),
14714            "kettlebell_flye" => Some(FlyeExerciseName::KettlebellFlye),
14715            "kneeling_rear_flye" => Some(FlyeExerciseName::KneelingRearFlye),
14716            "single_arm_standing_cable_reverse_flye" => {
14717                Some(FlyeExerciseName::SingleArmStandingCableReverseFlye)
14718            }
14719            "swiss_ball_dumbbell_flye" => Some(FlyeExerciseName::SwissBallDumbbellFlye),
14720            "arm_rotations" => Some(FlyeExerciseName::ArmRotations),
14721            "hug_a_tree" => Some(FlyeExerciseName::HugATree),
14722            "face_down_incline_reverse_flye" => Some(FlyeExerciseName::FaceDownInclineReverseFlye),
14723            "incline_reverse_flye" => Some(FlyeExerciseName::InclineReverseFlye),
14724            "rear_delt_fly_wheelchair" => Some(FlyeExerciseName::RearDeltFlyWheelchair),
14725            _ => None,
14726        }
14727    }
14728}
14729
14730#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
14731#[repr(u16)]
14732#[non_exhaustive]
14733pub enum HipRaiseExerciseName {
14734    BarbellHipThrustOnFloor = 0,
14735    BarbellHipThrustWithBench = 1,
14736    BentKneeSwissBallReverseHipRaise = 2,
14737    WeightedBentKneeSwissBallReverseHipRaise = 3,
14738    BridgeWithLegExtension = 4,
14739    WeightedBridgeWithLegExtension = 5,
14740    ClamBridge = 6,
14741    FrontKickTabletop = 7,
14742    WeightedFrontKickTabletop = 8,
14743    HipExtensionAndCross = 9,
14744    WeightedHipExtensionAndCross = 10,
14745    HipRaise = 11,
14746    WeightedHipRaise = 12,
14747    HipRaiseWithFeetOnSwissBall = 13,
14748    WeightedHipRaiseWithFeetOnSwissBall = 14,
14749    HipRaiseWithHeadOnBosuBall = 15,
14750    WeightedHipRaiseWithHeadOnBosuBall = 16,
14751    HipRaiseWithHeadOnSwissBall = 17,
14752    WeightedHipRaiseWithHeadOnSwissBall = 18,
14753    HipRaiseWithKneeSqueeze = 19,
14754    WeightedHipRaiseWithKneeSqueeze = 20,
14755    InclineRearLegExtension = 21,
14756    WeightedInclineRearLegExtension = 22,
14757    KettlebellSwing = 23,
14758    MarchingHipRaise = 24,
14759    WeightedMarchingHipRaise = 25,
14760    MarchingHipRaiseWithFeetOnASwissBall = 26,
14761    WeightedMarchingHipRaiseWithFeetOnASwissBall = 27,
14762    ReverseHipRaise = 28,
14763    WeightedReverseHipRaise = 29,
14764    SingleLegHipRaise = 30,
14765    WeightedSingleLegHipRaise = 31,
14766    SingleLegHipRaiseWithFootOnBench = 32,
14767    WeightedSingleLegHipRaiseWithFootOnBench = 33,
14768    SingleLegHipRaiseWithFootOnBosuBall = 34,
14769    WeightedSingleLegHipRaiseWithFootOnBosuBall = 35,
14770    SingleLegHipRaiseWithFootOnFoamRoller = 36,
14771    WeightedSingleLegHipRaiseWithFootOnFoamRoller = 37,
14772    SingleLegHipRaiseWithFootOnMedicineBall = 38,
14773    WeightedSingleLegHipRaiseWithFootOnMedicineBall = 39,
14774    SingleLegHipRaiseWithHeadOnBosuBall = 40,
14775    WeightedSingleLegHipRaiseWithHeadOnBosuBall = 41,
14776    WeightedClamBridge = 42,
14777    SingleLegSwissBallHipRaiseAndLegCurl = 43,
14778    Clams = 44,
14779    InnerThighCircles = 45,
14780    InnerThighSideLift = 46,
14781    LegCircles = 47,
14782    LegLift = 48,
14783    LegLiftInExternalRotation = 49,
14784}
14785
14786impl HipRaiseExerciseName {
14787    /// Snake-case canonical name from Profile.xlsx.
14788    pub fn as_str(&self) -> &'static str {
14789        match self {
14790            HipRaiseExerciseName::BarbellHipThrustOnFloor => "barbell_hip_thrust_on_floor",
14791            HipRaiseExerciseName::BarbellHipThrustWithBench => "barbell_hip_thrust_with_bench",
14792            HipRaiseExerciseName::BentKneeSwissBallReverseHipRaise => {
14793                "bent_knee_swiss_ball_reverse_hip_raise"
14794            }
14795            HipRaiseExerciseName::WeightedBentKneeSwissBallReverseHipRaise => {
14796                "weighted_bent_knee_swiss_ball_reverse_hip_raise"
14797            }
14798            HipRaiseExerciseName::BridgeWithLegExtension => "bridge_with_leg_extension",
14799            HipRaiseExerciseName::WeightedBridgeWithLegExtension => {
14800                "weighted_bridge_with_leg_extension"
14801            }
14802            HipRaiseExerciseName::ClamBridge => "clam_bridge",
14803            HipRaiseExerciseName::FrontKickTabletop => "front_kick_tabletop",
14804            HipRaiseExerciseName::WeightedFrontKickTabletop => "weighted_front_kick_tabletop",
14805            HipRaiseExerciseName::HipExtensionAndCross => "hip_extension_and_cross",
14806            HipRaiseExerciseName::WeightedHipExtensionAndCross => {
14807                "weighted_hip_extension_and_cross"
14808            }
14809            HipRaiseExerciseName::HipRaise => "hip_raise",
14810            HipRaiseExerciseName::WeightedHipRaise => "weighted_hip_raise",
14811            HipRaiseExerciseName::HipRaiseWithFeetOnSwissBall => {
14812                "hip_raise_with_feet_on_swiss_ball"
14813            }
14814            HipRaiseExerciseName::WeightedHipRaiseWithFeetOnSwissBall => {
14815                "weighted_hip_raise_with_feet_on_swiss_ball"
14816            }
14817            HipRaiseExerciseName::HipRaiseWithHeadOnBosuBall => "hip_raise_with_head_on_bosu_ball",
14818            HipRaiseExerciseName::WeightedHipRaiseWithHeadOnBosuBall => {
14819                "weighted_hip_raise_with_head_on_bosu_ball"
14820            }
14821            HipRaiseExerciseName::HipRaiseWithHeadOnSwissBall => {
14822                "hip_raise_with_head_on_swiss_ball"
14823            }
14824            HipRaiseExerciseName::WeightedHipRaiseWithHeadOnSwissBall => {
14825                "weighted_hip_raise_with_head_on_swiss_ball"
14826            }
14827            HipRaiseExerciseName::HipRaiseWithKneeSqueeze => "hip_raise_with_knee_squeeze",
14828            HipRaiseExerciseName::WeightedHipRaiseWithKneeSqueeze => {
14829                "weighted_hip_raise_with_knee_squeeze"
14830            }
14831            HipRaiseExerciseName::InclineRearLegExtension => "incline_rear_leg_extension",
14832            HipRaiseExerciseName::WeightedInclineRearLegExtension => {
14833                "weighted_incline_rear_leg_extension"
14834            }
14835            HipRaiseExerciseName::KettlebellSwing => "kettlebell_swing",
14836            HipRaiseExerciseName::MarchingHipRaise => "marching_hip_raise",
14837            HipRaiseExerciseName::WeightedMarchingHipRaise => "weighted_marching_hip_raise",
14838            HipRaiseExerciseName::MarchingHipRaiseWithFeetOnASwissBall => {
14839                "marching_hip_raise_with_feet_on_a_swiss_ball"
14840            }
14841            HipRaiseExerciseName::WeightedMarchingHipRaiseWithFeetOnASwissBall => {
14842                "weighted_marching_hip_raise_with_feet_on_a_swiss_ball"
14843            }
14844            HipRaiseExerciseName::ReverseHipRaise => "reverse_hip_raise",
14845            HipRaiseExerciseName::WeightedReverseHipRaise => "weighted_reverse_hip_raise",
14846            HipRaiseExerciseName::SingleLegHipRaise => "single_leg_hip_raise",
14847            HipRaiseExerciseName::WeightedSingleLegHipRaise => "weighted_single_leg_hip_raise",
14848            HipRaiseExerciseName::SingleLegHipRaiseWithFootOnBench => {
14849                "single_leg_hip_raise_with_foot_on_bench"
14850            }
14851            HipRaiseExerciseName::WeightedSingleLegHipRaiseWithFootOnBench => {
14852                "weighted_single_leg_hip_raise_with_foot_on_bench"
14853            }
14854            HipRaiseExerciseName::SingleLegHipRaiseWithFootOnBosuBall => {
14855                "single_leg_hip_raise_with_foot_on_bosu_ball"
14856            }
14857            HipRaiseExerciseName::WeightedSingleLegHipRaiseWithFootOnBosuBall => {
14858                "weighted_single_leg_hip_raise_with_foot_on_bosu_ball"
14859            }
14860            HipRaiseExerciseName::SingleLegHipRaiseWithFootOnFoamRoller => {
14861                "single_leg_hip_raise_with_foot_on_foam_roller"
14862            }
14863            HipRaiseExerciseName::WeightedSingleLegHipRaiseWithFootOnFoamRoller => {
14864                "weighted_single_leg_hip_raise_with_foot_on_foam_roller"
14865            }
14866            HipRaiseExerciseName::SingleLegHipRaiseWithFootOnMedicineBall => {
14867                "single_leg_hip_raise_with_foot_on_medicine_ball"
14868            }
14869            HipRaiseExerciseName::WeightedSingleLegHipRaiseWithFootOnMedicineBall => {
14870                "weighted_single_leg_hip_raise_with_foot_on_medicine_ball"
14871            }
14872            HipRaiseExerciseName::SingleLegHipRaiseWithHeadOnBosuBall => {
14873                "single_leg_hip_raise_with_head_on_bosu_ball"
14874            }
14875            HipRaiseExerciseName::WeightedSingleLegHipRaiseWithHeadOnBosuBall => {
14876                "weighted_single_leg_hip_raise_with_head_on_bosu_ball"
14877            }
14878            HipRaiseExerciseName::WeightedClamBridge => "weighted_clam_bridge",
14879            HipRaiseExerciseName::SingleLegSwissBallHipRaiseAndLegCurl => {
14880                "single_leg_swiss_ball_hip_raise_and_leg_curl"
14881            }
14882            HipRaiseExerciseName::Clams => "clams",
14883            HipRaiseExerciseName::InnerThighCircles => "inner_thigh_circles",
14884            HipRaiseExerciseName::InnerThighSideLift => "inner_thigh_side_lift",
14885            HipRaiseExerciseName::LegCircles => "leg_circles",
14886            HipRaiseExerciseName::LegLift => "leg_lift",
14887            HipRaiseExerciseName::LegLiftInExternalRotation => "leg_lift_in_external_rotation",
14888        }
14889    }
14890
14891    /// Try to construct from the underlying numeric value.
14892    pub fn from_value(value: u16) -> Option<Self> {
14893        match value {
14894            0 => Some(HipRaiseExerciseName::BarbellHipThrustOnFloor),
14895            1 => Some(HipRaiseExerciseName::BarbellHipThrustWithBench),
14896            2 => Some(HipRaiseExerciseName::BentKneeSwissBallReverseHipRaise),
14897            3 => Some(HipRaiseExerciseName::WeightedBentKneeSwissBallReverseHipRaise),
14898            4 => Some(HipRaiseExerciseName::BridgeWithLegExtension),
14899            5 => Some(HipRaiseExerciseName::WeightedBridgeWithLegExtension),
14900            6 => Some(HipRaiseExerciseName::ClamBridge),
14901            7 => Some(HipRaiseExerciseName::FrontKickTabletop),
14902            8 => Some(HipRaiseExerciseName::WeightedFrontKickTabletop),
14903            9 => Some(HipRaiseExerciseName::HipExtensionAndCross),
14904            10 => Some(HipRaiseExerciseName::WeightedHipExtensionAndCross),
14905            11 => Some(HipRaiseExerciseName::HipRaise),
14906            12 => Some(HipRaiseExerciseName::WeightedHipRaise),
14907            13 => Some(HipRaiseExerciseName::HipRaiseWithFeetOnSwissBall),
14908            14 => Some(HipRaiseExerciseName::WeightedHipRaiseWithFeetOnSwissBall),
14909            15 => Some(HipRaiseExerciseName::HipRaiseWithHeadOnBosuBall),
14910            16 => Some(HipRaiseExerciseName::WeightedHipRaiseWithHeadOnBosuBall),
14911            17 => Some(HipRaiseExerciseName::HipRaiseWithHeadOnSwissBall),
14912            18 => Some(HipRaiseExerciseName::WeightedHipRaiseWithHeadOnSwissBall),
14913            19 => Some(HipRaiseExerciseName::HipRaiseWithKneeSqueeze),
14914            20 => Some(HipRaiseExerciseName::WeightedHipRaiseWithKneeSqueeze),
14915            21 => Some(HipRaiseExerciseName::InclineRearLegExtension),
14916            22 => Some(HipRaiseExerciseName::WeightedInclineRearLegExtension),
14917            23 => Some(HipRaiseExerciseName::KettlebellSwing),
14918            24 => Some(HipRaiseExerciseName::MarchingHipRaise),
14919            25 => Some(HipRaiseExerciseName::WeightedMarchingHipRaise),
14920            26 => Some(HipRaiseExerciseName::MarchingHipRaiseWithFeetOnASwissBall),
14921            27 => Some(HipRaiseExerciseName::WeightedMarchingHipRaiseWithFeetOnASwissBall),
14922            28 => Some(HipRaiseExerciseName::ReverseHipRaise),
14923            29 => Some(HipRaiseExerciseName::WeightedReverseHipRaise),
14924            30 => Some(HipRaiseExerciseName::SingleLegHipRaise),
14925            31 => Some(HipRaiseExerciseName::WeightedSingleLegHipRaise),
14926            32 => Some(HipRaiseExerciseName::SingleLegHipRaiseWithFootOnBench),
14927            33 => Some(HipRaiseExerciseName::WeightedSingleLegHipRaiseWithFootOnBench),
14928            34 => Some(HipRaiseExerciseName::SingleLegHipRaiseWithFootOnBosuBall),
14929            35 => Some(HipRaiseExerciseName::WeightedSingleLegHipRaiseWithFootOnBosuBall),
14930            36 => Some(HipRaiseExerciseName::SingleLegHipRaiseWithFootOnFoamRoller),
14931            37 => Some(HipRaiseExerciseName::WeightedSingleLegHipRaiseWithFootOnFoamRoller),
14932            38 => Some(HipRaiseExerciseName::SingleLegHipRaiseWithFootOnMedicineBall),
14933            39 => Some(HipRaiseExerciseName::WeightedSingleLegHipRaiseWithFootOnMedicineBall),
14934            40 => Some(HipRaiseExerciseName::SingleLegHipRaiseWithHeadOnBosuBall),
14935            41 => Some(HipRaiseExerciseName::WeightedSingleLegHipRaiseWithHeadOnBosuBall),
14936            42 => Some(HipRaiseExerciseName::WeightedClamBridge),
14937            43 => Some(HipRaiseExerciseName::SingleLegSwissBallHipRaiseAndLegCurl),
14938            44 => Some(HipRaiseExerciseName::Clams),
14939            45 => Some(HipRaiseExerciseName::InnerThighCircles),
14940            46 => Some(HipRaiseExerciseName::InnerThighSideLift),
14941            47 => Some(HipRaiseExerciseName::LegCircles),
14942            48 => Some(HipRaiseExerciseName::LegLift),
14943            49 => Some(HipRaiseExerciseName::LegLiftInExternalRotation),
14944            _ => None,
14945        }
14946    }
14947
14948    /// Try to construct from the snake-case canonical name.
14949    pub fn from_str(name: &str) -> Option<Self> {
14950        match name {
14951            "barbell_hip_thrust_on_floor" => Some(HipRaiseExerciseName::BarbellHipThrustOnFloor),
14952            "barbell_hip_thrust_with_bench" => {
14953                Some(HipRaiseExerciseName::BarbellHipThrustWithBench)
14954            }
14955            "bent_knee_swiss_ball_reverse_hip_raise" => {
14956                Some(HipRaiseExerciseName::BentKneeSwissBallReverseHipRaise)
14957            }
14958            "weighted_bent_knee_swiss_ball_reverse_hip_raise" => {
14959                Some(HipRaiseExerciseName::WeightedBentKneeSwissBallReverseHipRaise)
14960            }
14961            "bridge_with_leg_extension" => Some(HipRaiseExerciseName::BridgeWithLegExtension),
14962            "weighted_bridge_with_leg_extension" => {
14963                Some(HipRaiseExerciseName::WeightedBridgeWithLegExtension)
14964            }
14965            "clam_bridge" => Some(HipRaiseExerciseName::ClamBridge),
14966            "front_kick_tabletop" => Some(HipRaiseExerciseName::FrontKickTabletop),
14967            "weighted_front_kick_tabletop" => Some(HipRaiseExerciseName::WeightedFrontKickTabletop),
14968            "hip_extension_and_cross" => Some(HipRaiseExerciseName::HipExtensionAndCross),
14969            "weighted_hip_extension_and_cross" => {
14970                Some(HipRaiseExerciseName::WeightedHipExtensionAndCross)
14971            }
14972            "hip_raise" => Some(HipRaiseExerciseName::HipRaise),
14973            "weighted_hip_raise" => Some(HipRaiseExerciseName::WeightedHipRaise),
14974            "hip_raise_with_feet_on_swiss_ball" => {
14975                Some(HipRaiseExerciseName::HipRaiseWithFeetOnSwissBall)
14976            }
14977            "weighted_hip_raise_with_feet_on_swiss_ball" => {
14978                Some(HipRaiseExerciseName::WeightedHipRaiseWithFeetOnSwissBall)
14979            }
14980            "hip_raise_with_head_on_bosu_ball" => {
14981                Some(HipRaiseExerciseName::HipRaiseWithHeadOnBosuBall)
14982            }
14983            "weighted_hip_raise_with_head_on_bosu_ball" => {
14984                Some(HipRaiseExerciseName::WeightedHipRaiseWithHeadOnBosuBall)
14985            }
14986            "hip_raise_with_head_on_swiss_ball" => {
14987                Some(HipRaiseExerciseName::HipRaiseWithHeadOnSwissBall)
14988            }
14989            "weighted_hip_raise_with_head_on_swiss_ball" => {
14990                Some(HipRaiseExerciseName::WeightedHipRaiseWithHeadOnSwissBall)
14991            }
14992            "hip_raise_with_knee_squeeze" => Some(HipRaiseExerciseName::HipRaiseWithKneeSqueeze),
14993            "weighted_hip_raise_with_knee_squeeze" => {
14994                Some(HipRaiseExerciseName::WeightedHipRaiseWithKneeSqueeze)
14995            }
14996            "incline_rear_leg_extension" => Some(HipRaiseExerciseName::InclineRearLegExtension),
14997            "weighted_incline_rear_leg_extension" => {
14998                Some(HipRaiseExerciseName::WeightedInclineRearLegExtension)
14999            }
15000            "kettlebell_swing" => Some(HipRaiseExerciseName::KettlebellSwing),
15001            "marching_hip_raise" => Some(HipRaiseExerciseName::MarchingHipRaise),
15002            "weighted_marching_hip_raise" => Some(HipRaiseExerciseName::WeightedMarchingHipRaise),
15003            "marching_hip_raise_with_feet_on_a_swiss_ball" => {
15004                Some(HipRaiseExerciseName::MarchingHipRaiseWithFeetOnASwissBall)
15005            }
15006            "weighted_marching_hip_raise_with_feet_on_a_swiss_ball" => {
15007                Some(HipRaiseExerciseName::WeightedMarchingHipRaiseWithFeetOnASwissBall)
15008            }
15009            "reverse_hip_raise" => Some(HipRaiseExerciseName::ReverseHipRaise),
15010            "weighted_reverse_hip_raise" => Some(HipRaiseExerciseName::WeightedReverseHipRaise),
15011            "single_leg_hip_raise" => Some(HipRaiseExerciseName::SingleLegHipRaise),
15012            "weighted_single_leg_hip_raise" => {
15013                Some(HipRaiseExerciseName::WeightedSingleLegHipRaise)
15014            }
15015            "single_leg_hip_raise_with_foot_on_bench" => {
15016                Some(HipRaiseExerciseName::SingleLegHipRaiseWithFootOnBench)
15017            }
15018            "weighted_single_leg_hip_raise_with_foot_on_bench" => {
15019                Some(HipRaiseExerciseName::WeightedSingleLegHipRaiseWithFootOnBench)
15020            }
15021            "single_leg_hip_raise_with_foot_on_bosu_ball" => {
15022                Some(HipRaiseExerciseName::SingleLegHipRaiseWithFootOnBosuBall)
15023            }
15024            "weighted_single_leg_hip_raise_with_foot_on_bosu_ball" => {
15025                Some(HipRaiseExerciseName::WeightedSingleLegHipRaiseWithFootOnBosuBall)
15026            }
15027            "single_leg_hip_raise_with_foot_on_foam_roller" => {
15028                Some(HipRaiseExerciseName::SingleLegHipRaiseWithFootOnFoamRoller)
15029            }
15030            "weighted_single_leg_hip_raise_with_foot_on_foam_roller" => {
15031                Some(HipRaiseExerciseName::WeightedSingleLegHipRaiseWithFootOnFoamRoller)
15032            }
15033            "single_leg_hip_raise_with_foot_on_medicine_ball" => {
15034                Some(HipRaiseExerciseName::SingleLegHipRaiseWithFootOnMedicineBall)
15035            }
15036            "weighted_single_leg_hip_raise_with_foot_on_medicine_ball" => {
15037                Some(HipRaiseExerciseName::WeightedSingleLegHipRaiseWithFootOnMedicineBall)
15038            }
15039            "single_leg_hip_raise_with_head_on_bosu_ball" => {
15040                Some(HipRaiseExerciseName::SingleLegHipRaiseWithHeadOnBosuBall)
15041            }
15042            "weighted_single_leg_hip_raise_with_head_on_bosu_ball" => {
15043                Some(HipRaiseExerciseName::WeightedSingleLegHipRaiseWithHeadOnBosuBall)
15044            }
15045            "weighted_clam_bridge" => Some(HipRaiseExerciseName::WeightedClamBridge),
15046            "single_leg_swiss_ball_hip_raise_and_leg_curl" => {
15047                Some(HipRaiseExerciseName::SingleLegSwissBallHipRaiseAndLegCurl)
15048            }
15049            "clams" => Some(HipRaiseExerciseName::Clams),
15050            "inner_thigh_circles" => Some(HipRaiseExerciseName::InnerThighCircles),
15051            "inner_thigh_side_lift" => Some(HipRaiseExerciseName::InnerThighSideLift),
15052            "leg_circles" => Some(HipRaiseExerciseName::LegCircles),
15053            "leg_lift" => Some(HipRaiseExerciseName::LegLift),
15054            "leg_lift_in_external_rotation" => {
15055                Some(HipRaiseExerciseName::LegLiftInExternalRotation)
15056            }
15057            _ => None,
15058        }
15059    }
15060}
15061
15062#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
15063#[repr(u16)]
15064#[non_exhaustive]
15065pub enum HipStabilityExerciseName {
15066    BandSideLyingLegRaise = 0,
15067    DeadBug = 1,
15068    WeightedDeadBug = 2,
15069    ExternalHipRaise = 3,
15070    WeightedExternalHipRaise = 4,
15071    FireHydrantKicks = 5,
15072    WeightedFireHydrantKicks = 6,
15073    HipCircles = 7,
15074    WeightedHipCircles = 8,
15075    InnerThighLift = 9,
15076    WeightedInnerThighLift = 10,
15077    LateralWalksWithBandAtAnkles = 11,
15078    PretzelSideKick = 12,
15079    WeightedPretzelSideKick = 13,
15080    ProneHipInternalRotation = 14,
15081    WeightedProneHipInternalRotation = 15,
15082    Quadruped = 16,
15083    QuadrupedHipExtension = 17,
15084    WeightedQuadrupedHipExtension = 18,
15085    QuadrupedWithLegLift = 19,
15086    WeightedQuadrupedWithLegLift = 20,
15087    SideLyingLegRaise = 21,
15088    WeightedSideLyingLegRaise = 22,
15089    SlidingHipAdduction = 23,
15090    WeightedSlidingHipAdduction = 24,
15091    StandingAdduction = 25,
15092    WeightedStandingAdduction = 26,
15093    StandingCableHipAbduction = 27,
15094    StandingHipAbduction = 28,
15095    WeightedStandingHipAbduction = 29,
15096    StandingRearLegRaise = 30,
15097    WeightedStandingRearLegRaise = 31,
15098    SupineHipInternalRotation = 32,
15099    WeightedSupineHipInternalRotation = 33,
15100    LyingAbductionStretch = 34,
15101}
15102
15103impl HipStabilityExerciseName {
15104    /// Snake-case canonical name from Profile.xlsx.
15105    pub fn as_str(&self) -> &'static str {
15106        match self {
15107            HipStabilityExerciseName::BandSideLyingLegRaise => "band_side_lying_leg_raise",
15108            HipStabilityExerciseName::DeadBug => "dead_bug",
15109            HipStabilityExerciseName::WeightedDeadBug => "weighted_dead_bug",
15110            HipStabilityExerciseName::ExternalHipRaise => "external_hip_raise",
15111            HipStabilityExerciseName::WeightedExternalHipRaise => "weighted_external_hip_raise",
15112            HipStabilityExerciseName::FireHydrantKicks => "fire_hydrant_kicks",
15113            HipStabilityExerciseName::WeightedFireHydrantKicks => "weighted_fire_hydrant_kicks",
15114            HipStabilityExerciseName::HipCircles => "hip_circles",
15115            HipStabilityExerciseName::WeightedHipCircles => "weighted_hip_circles",
15116            HipStabilityExerciseName::InnerThighLift => "inner_thigh_lift",
15117            HipStabilityExerciseName::WeightedInnerThighLift => "weighted_inner_thigh_lift",
15118            HipStabilityExerciseName::LateralWalksWithBandAtAnkles => {
15119                "lateral_walks_with_band_at_ankles"
15120            }
15121            HipStabilityExerciseName::PretzelSideKick => "pretzel_side_kick",
15122            HipStabilityExerciseName::WeightedPretzelSideKick => "weighted_pretzel_side_kick",
15123            HipStabilityExerciseName::ProneHipInternalRotation => "prone_hip_internal_rotation",
15124            HipStabilityExerciseName::WeightedProneHipInternalRotation => {
15125                "weighted_prone_hip_internal_rotation"
15126            }
15127            HipStabilityExerciseName::Quadruped => "quadruped",
15128            HipStabilityExerciseName::QuadrupedHipExtension => "quadruped_hip_extension",
15129            HipStabilityExerciseName::WeightedQuadrupedHipExtension => {
15130                "weighted_quadruped_hip_extension"
15131            }
15132            HipStabilityExerciseName::QuadrupedWithLegLift => "quadruped_with_leg_lift",
15133            HipStabilityExerciseName::WeightedQuadrupedWithLegLift => {
15134                "weighted_quadruped_with_leg_lift"
15135            }
15136            HipStabilityExerciseName::SideLyingLegRaise => "side_lying_leg_raise",
15137            HipStabilityExerciseName::WeightedSideLyingLegRaise => "weighted_side_lying_leg_raise",
15138            HipStabilityExerciseName::SlidingHipAdduction => "sliding_hip_adduction",
15139            HipStabilityExerciseName::WeightedSlidingHipAdduction => {
15140                "weighted_sliding_hip_adduction"
15141            }
15142            HipStabilityExerciseName::StandingAdduction => "standing_adduction",
15143            HipStabilityExerciseName::WeightedStandingAdduction => "weighted_standing_adduction",
15144            HipStabilityExerciseName::StandingCableHipAbduction => "standing_cable_hip_abduction",
15145            HipStabilityExerciseName::StandingHipAbduction => "standing_hip_abduction",
15146            HipStabilityExerciseName::WeightedStandingHipAbduction => {
15147                "weighted_standing_hip_abduction"
15148            }
15149            HipStabilityExerciseName::StandingRearLegRaise => "standing_rear_leg_raise",
15150            HipStabilityExerciseName::WeightedStandingRearLegRaise => {
15151                "weighted_standing_rear_leg_raise"
15152            }
15153            HipStabilityExerciseName::SupineHipInternalRotation => "supine_hip_internal_rotation",
15154            HipStabilityExerciseName::WeightedSupineHipInternalRotation => {
15155                "weighted_supine_hip_internal_rotation"
15156            }
15157            HipStabilityExerciseName::LyingAbductionStretch => "lying_abduction_stretch",
15158        }
15159    }
15160
15161    /// Try to construct from the underlying numeric value.
15162    pub fn from_value(value: u16) -> Option<Self> {
15163        match value {
15164            0 => Some(HipStabilityExerciseName::BandSideLyingLegRaise),
15165            1 => Some(HipStabilityExerciseName::DeadBug),
15166            2 => Some(HipStabilityExerciseName::WeightedDeadBug),
15167            3 => Some(HipStabilityExerciseName::ExternalHipRaise),
15168            4 => Some(HipStabilityExerciseName::WeightedExternalHipRaise),
15169            5 => Some(HipStabilityExerciseName::FireHydrantKicks),
15170            6 => Some(HipStabilityExerciseName::WeightedFireHydrantKicks),
15171            7 => Some(HipStabilityExerciseName::HipCircles),
15172            8 => Some(HipStabilityExerciseName::WeightedHipCircles),
15173            9 => Some(HipStabilityExerciseName::InnerThighLift),
15174            10 => Some(HipStabilityExerciseName::WeightedInnerThighLift),
15175            11 => Some(HipStabilityExerciseName::LateralWalksWithBandAtAnkles),
15176            12 => Some(HipStabilityExerciseName::PretzelSideKick),
15177            13 => Some(HipStabilityExerciseName::WeightedPretzelSideKick),
15178            14 => Some(HipStabilityExerciseName::ProneHipInternalRotation),
15179            15 => Some(HipStabilityExerciseName::WeightedProneHipInternalRotation),
15180            16 => Some(HipStabilityExerciseName::Quadruped),
15181            17 => Some(HipStabilityExerciseName::QuadrupedHipExtension),
15182            18 => Some(HipStabilityExerciseName::WeightedQuadrupedHipExtension),
15183            19 => Some(HipStabilityExerciseName::QuadrupedWithLegLift),
15184            20 => Some(HipStabilityExerciseName::WeightedQuadrupedWithLegLift),
15185            21 => Some(HipStabilityExerciseName::SideLyingLegRaise),
15186            22 => Some(HipStabilityExerciseName::WeightedSideLyingLegRaise),
15187            23 => Some(HipStabilityExerciseName::SlidingHipAdduction),
15188            24 => Some(HipStabilityExerciseName::WeightedSlidingHipAdduction),
15189            25 => Some(HipStabilityExerciseName::StandingAdduction),
15190            26 => Some(HipStabilityExerciseName::WeightedStandingAdduction),
15191            27 => Some(HipStabilityExerciseName::StandingCableHipAbduction),
15192            28 => Some(HipStabilityExerciseName::StandingHipAbduction),
15193            29 => Some(HipStabilityExerciseName::WeightedStandingHipAbduction),
15194            30 => Some(HipStabilityExerciseName::StandingRearLegRaise),
15195            31 => Some(HipStabilityExerciseName::WeightedStandingRearLegRaise),
15196            32 => Some(HipStabilityExerciseName::SupineHipInternalRotation),
15197            33 => Some(HipStabilityExerciseName::WeightedSupineHipInternalRotation),
15198            34 => Some(HipStabilityExerciseName::LyingAbductionStretch),
15199            _ => None,
15200        }
15201    }
15202
15203    /// Try to construct from the snake-case canonical name.
15204    pub fn from_str(name: &str) -> Option<Self> {
15205        match name {
15206            "band_side_lying_leg_raise" => Some(HipStabilityExerciseName::BandSideLyingLegRaise),
15207            "dead_bug" => Some(HipStabilityExerciseName::DeadBug),
15208            "weighted_dead_bug" => Some(HipStabilityExerciseName::WeightedDeadBug),
15209            "external_hip_raise" => Some(HipStabilityExerciseName::ExternalHipRaise),
15210            "weighted_external_hip_raise" => {
15211                Some(HipStabilityExerciseName::WeightedExternalHipRaise)
15212            }
15213            "fire_hydrant_kicks" => Some(HipStabilityExerciseName::FireHydrantKicks),
15214            "weighted_fire_hydrant_kicks" => {
15215                Some(HipStabilityExerciseName::WeightedFireHydrantKicks)
15216            }
15217            "hip_circles" => Some(HipStabilityExerciseName::HipCircles),
15218            "weighted_hip_circles" => Some(HipStabilityExerciseName::WeightedHipCircles),
15219            "inner_thigh_lift" => Some(HipStabilityExerciseName::InnerThighLift),
15220            "weighted_inner_thigh_lift" => Some(HipStabilityExerciseName::WeightedInnerThighLift),
15221            "lateral_walks_with_band_at_ankles" => {
15222                Some(HipStabilityExerciseName::LateralWalksWithBandAtAnkles)
15223            }
15224            "pretzel_side_kick" => Some(HipStabilityExerciseName::PretzelSideKick),
15225            "weighted_pretzel_side_kick" => Some(HipStabilityExerciseName::WeightedPretzelSideKick),
15226            "prone_hip_internal_rotation" => {
15227                Some(HipStabilityExerciseName::ProneHipInternalRotation)
15228            }
15229            "weighted_prone_hip_internal_rotation" => {
15230                Some(HipStabilityExerciseName::WeightedProneHipInternalRotation)
15231            }
15232            "quadruped" => Some(HipStabilityExerciseName::Quadruped),
15233            "quadruped_hip_extension" => Some(HipStabilityExerciseName::QuadrupedHipExtension),
15234            "weighted_quadruped_hip_extension" => {
15235                Some(HipStabilityExerciseName::WeightedQuadrupedHipExtension)
15236            }
15237            "quadruped_with_leg_lift" => Some(HipStabilityExerciseName::QuadrupedWithLegLift),
15238            "weighted_quadruped_with_leg_lift" => {
15239                Some(HipStabilityExerciseName::WeightedQuadrupedWithLegLift)
15240            }
15241            "side_lying_leg_raise" => Some(HipStabilityExerciseName::SideLyingLegRaise),
15242            "weighted_side_lying_leg_raise" => {
15243                Some(HipStabilityExerciseName::WeightedSideLyingLegRaise)
15244            }
15245            "sliding_hip_adduction" => Some(HipStabilityExerciseName::SlidingHipAdduction),
15246            "weighted_sliding_hip_adduction" => {
15247                Some(HipStabilityExerciseName::WeightedSlidingHipAdduction)
15248            }
15249            "standing_adduction" => Some(HipStabilityExerciseName::StandingAdduction),
15250            "weighted_standing_adduction" => {
15251                Some(HipStabilityExerciseName::WeightedStandingAdduction)
15252            }
15253            "standing_cable_hip_abduction" => {
15254                Some(HipStabilityExerciseName::StandingCableHipAbduction)
15255            }
15256            "standing_hip_abduction" => Some(HipStabilityExerciseName::StandingHipAbduction),
15257            "weighted_standing_hip_abduction" => {
15258                Some(HipStabilityExerciseName::WeightedStandingHipAbduction)
15259            }
15260            "standing_rear_leg_raise" => Some(HipStabilityExerciseName::StandingRearLegRaise),
15261            "weighted_standing_rear_leg_raise" => {
15262                Some(HipStabilityExerciseName::WeightedStandingRearLegRaise)
15263            }
15264            "supine_hip_internal_rotation" => {
15265                Some(HipStabilityExerciseName::SupineHipInternalRotation)
15266            }
15267            "weighted_supine_hip_internal_rotation" => {
15268                Some(HipStabilityExerciseName::WeightedSupineHipInternalRotation)
15269            }
15270            "lying_abduction_stretch" => Some(HipStabilityExerciseName::LyingAbductionStretch),
15271            _ => None,
15272        }
15273    }
15274}
15275
15276#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
15277#[repr(u16)]
15278#[non_exhaustive]
15279pub enum HipSwingExerciseName {
15280    SingleArmKettlebellSwing = 0,
15281    SingleArmDumbbellSwing = 1,
15282    StepOutSwing = 2,
15283    OneArmSwing = 3,
15284}
15285
15286impl HipSwingExerciseName {
15287    /// Snake-case canonical name from Profile.xlsx.
15288    pub fn as_str(&self) -> &'static str {
15289        match self {
15290            HipSwingExerciseName::SingleArmKettlebellSwing => "single_arm_kettlebell_swing",
15291            HipSwingExerciseName::SingleArmDumbbellSwing => "single_arm_dumbbell_swing",
15292            HipSwingExerciseName::StepOutSwing => "step_out_swing",
15293            HipSwingExerciseName::OneArmSwing => "one_arm_swing",
15294        }
15295    }
15296
15297    /// Try to construct from the underlying numeric value.
15298    pub fn from_value(value: u16) -> Option<Self> {
15299        match value {
15300            0 => Some(HipSwingExerciseName::SingleArmKettlebellSwing),
15301            1 => Some(HipSwingExerciseName::SingleArmDumbbellSwing),
15302            2 => Some(HipSwingExerciseName::StepOutSwing),
15303            3 => Some(HipSwingExerciseName::OneArmSwing),
15304            _ => None,
15305        }
15306    }
15307
15308    /// Try to construct from the snake-case canonical name.
15309    pub fn from_str(name: &str) -> Option<Self> {
15310        match name {
15311            "single_arm_kettlebell_swing" => Some(HipSwingExerciseName::SingleArmKettlebellSwing),
15312            "single_arm_dumbbell_swing" => Some(HipSwingExerciseName::SingleArmDumbbellSwing),
15313            "step_out_swing" => Some(HipSwingExerciseName::StepOutSwing),
15314            "one_arm_swing" => Some(HipSwingExerciseName::OneArmSwing),
15315            _ => None,
15316        }
15317    }
15318}
15319
15320#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
15321#[repr(u16)]
15322#[non_exhaustive]
15323pub enum HyperextensionExerciseName {
15324    BackExtensionWithOppositeArmAndLegReach = 0,
15325    WeightedBackExtensionWithOppositeArmAndLegReach = 1,
15326    BaseRotations = 2,
15327    WeightedBaseRotations = 3,
15328    BentKneeReverseHyperextension = 4,
15329    WeightedBentKneeReverseHyperextension = 5,
15330    HollowHoldAndRoll = 6,
15331    WeightedHollowHoldAndRoll = 7,
15332    Kicks = 8,
15333    WeightedKicks = 9,
15334    KneeRaises = 10,
15335    WeightedKneeRaises = 11,
15336    KneelingSuperman = 12,
15337    WeightedKneelingSuperman = 13,
15338    LatPullDownWithRow = 14,
15339    MedicineBallDeadliftToReach = 15,
15340    OneArmOneLegRow = 16,
15341    OneArmRowWithBand = 17,
15342    OverheadLungeWithMedicineBall = 18,
15343    PlankKneeTucks = 19,
15344    WeightedPlankKneeTucks = 20,
15345    SideStep = 21,
15346    WeightedSideStep = 22,
15347    SingleLegBackExtension = 23,
15348    WeightedSingleLegBackExtension = 24,
15349    SpineExtension = 25,
15350    WeightedSpineExtension = 26,
15351    StaticBackExtension = 27,
15352    WeightedStaticBackExtension = 28,
15353    SupermanFromFloor = 29,
15354    WeightedSupermanFromFloor = 30,
15355    SwissBallBackExtension = 31,
15356    WeightedSwissBallBackExtension = 32,
15357    SwissBallHyperextension = 33,
15358    WeightedSwissBallHyperextension = 34,
15359    SwissBallOppositeArmAndLegLift = 35,
15360    WeightedSwissBallOppositeArmAndLegLift = 36,
15361    SupermanOnSwissBall = 37,
15362    Cobra = 38,
15363    SupineFloorBarre = 39,
15364}
15365
15366impl HyperextensionExerciseName {
15367    /// Snake-case canonical name from Profile.xlsx.
15368    pub fn as_str(&self) -> &'static str {
15369        match self {
15370            HyperextensionExerciseName::BackExtensionWithOppositeArmAndLegReach => {
15371                "back_extension_with_opposite_arm_and_leg_reach"
15372            }
15373            HyperextensionExerciseName::WeightedBackExtensionWithOppositeArmAndLegReach => {
15374                "weighted_back_extension_with_opposite_arm_and_leg_reach"
15375            }
15376            HyperextensionExerciseName::BaseRotations => "base_rotations",
15377            HyperextensionExerciseName::WeightedBaseRotations => "weighted_base_rotations",
15378            HyperextensionExerciseName::BentKneeReverseHyperextension => {
15379                "bent_knee_reverse_hyperextension"
15380            }
15381            HyperextensionExerciseName::WeightedBentKneeReverseHyperextension => {
15382                "weighted_bent_knee_reverse_hyperextension"
15383            }
15384            HyperextensionExerciseName::HollowHoldAndRoll => "hollow_hold_and_roll",
15385            HyperextensionExerciseName::WeightedHollowHoldAndRoll => {
15386                "weighted_hollow_hold_and_roll"
15387            }
15388            HyperextensionExerciseName::Kicks => "kicks",
15389            HyperextensionExerciseName::WeightedKicks => "weighted_kicks",
15390            HyperextensionExerciseName::KneeRaises => "knee_raises",
15391            HyperextensionExerciseName::WeightedKneeRaises => "weighted_knee_raises",
15392            HyperextensionExerciseName::KneelingSuperman => "kneeling_superman",
15393            HyperextensionExerciseName::WeightedKneelingSuperman => "weighted_kneeling_superman",
15394            HyperextensionExerciseName::LatPullDownWithRow => "lat_pull_down_with_row",
15395            HyperextensionExerciseName::MedicineBallDeadliftToReach => {
15396                "medicine_ball_deadlift_to_reach"
15397            }
15398            HyperextensionExerciseName::OneArmOneLegRow => "one_arm_one_leg_row",
15399            HyperextensionExerciseName::OneArmRowWithBand => "one_arm_row_with_band",
15400            HyperextensionExerciseName::OverheadLungeWithMedicineBall => {
15401                "overhead_lunge_with_medicine_ball"
15402            }
15403            HyperextensionExerciseName::PlankKneeTucks => "plank_knee_tucks",
15404            HyperextensionExerciseName::WeightedPlankKneeTucks => "weighted_plank_knee_tucks",
15405            HyperextensionExerciseName::SideStep => "side_step",
15406            HyperextensionExerciseName::WeightedSideStep => "weighted_side_step",
15407            HyperextensionExerciseName::SingleLegBackExtension => "single_leg_back_extension",
15408            HyperextensionExerciseName::WeightedSingleLegBackExtension => {
15409                "weighted_single_leg_back_extension"
15410            }
15411            HyperextensionExerciseName::SpineExtension => "spine_extension",
15412            HyperextensionExerciseName::WeightedSpineExtension => "weighted_spine_extension",
15413            HyperextensionExerciseName::StaticBackExtension => "static_back_extension",
15414            HyperextensionExerciseName::WeightedStaticBackExtension => {
15415                "weighted_static_back_extension"
15416            }
15417            HyperextensionExerciseName::SupermanFromFloor => "superman_from_floor",
15418            HyperextensionExerciseName::WeightedSupermanFromFloor => "weighted_superman_from_floor",
15419            HyperextensionExerciseName::SwissBallBackExtension => "swiss_ball_back_extension",
15420            HyperextensionExerciseName::WeightedSwissBallBackExtension => {
15421                "weighted_swiss_ball_back_extension"
15422            }
15423            HyperextensionExerciseName::SwissBallHyperextension => "swiss_ball_hyperextension",
15424            HyperextensionExerciseName::WeightedSwissBallHyperextension => {
15425                "weighted_swiss_ball_hyperextension"
15426            }
15427            HyperextensionExerciseName::SwissBallOppositeArmAndLegLift => {
15428                "swiss_ball_opposite_arm_and_leg_lift"
15429            }
15430            HyperextensionExerciseName::WeightedSwissBallOppositeArmAndLegLift => {
15431                "weighted_swiss_ball_opposite_arm_and_leg_lift"
15432            }
15433            HyperextensionExerciseName::SupermanOnSwissBall => "superman_on_swiss_ball",
15434            HyperextensionExerciseName::Cobra => "cobra",
15435            HyperextensionExerciseName::SupineFloorBarre => "supine_floor_barre",
15436        }
15437    }
15438
15439    /// Try to construct from the underlying numeric value.
15440    pub fn from_value(value: u16) -> Option<Self> {
15441        match value {
15442            0 => Some(HyperextensionExerciseName::BackExtensionWithOppositeArmAndLegReach),
15443            1 => Some(HyperextensionExerciseName::WeightedBackExtensionWithOppositeArmAndLegReach),
15444            2 => Some(HyperextensionExerciseName::BaseRotations),
15445            3 => Some(HyperextensionExerciseName::WeightedBaseRotations),
15446            4 => Some(HyperextensionExerciseName::BentKneeReverseHyperextension),
15447            5 => Some(HyperextensionExerciseName::WeightedBentKneeReverseHyperextension),
15448            6 => Some(HyperextensionExerciseName::HollowHoldAndRoll),
15449            7 => Some(HyperextensionExerciseName::WeightedHollowHoldAndRoll),
15450            8 => Some(HyperextensionExerciseName::Kicks),
15451            9 => Some(HyperextensionExerciseName::WeightedKicks),
15452            10 => Some(HyperextensionExerciseName::KneeRaises),
15453            11 => Some(HyperextensionExerciseName::WeightedKneeRaises),
15454            12 => Some(HyperextensionExerciseName::KneelingSuperman),
15455            13 => Some(HyperextensionExerciseName::WeightedKneelingSuperman),
15456            14 => Some(HyperextensionExerciseName::LatPullDownWithRow),
15457            15 => Some(HyperextensionExerciseName::MedicineBallDeadliftToReach),
15458            16 => Some(HyperextensionExerciseName::OneArmOneLegRow),
15459            17 => Some(HyperextensionExerciseName::OneArmRowWithBand),
15460            18 => Some(HyperextensionExerciseName::OverheadLungeWithMedicineBall),
15461            19 => Some(HyperextensionExerciseName::PlankKneeTucks),
15462            20 => Some(HyperextensionExerciseName::WeightedPlankKneeTucks),
15463            21 => Some(HyperextensionExerciseName::SideStep),
15464            22 => Some(HyperextensionExerciseName::WeightedSideStep),
15465            23 => Some(HyperextensionExerciseName::SingleLegBackExtension),
15466            24 => Some(HyperextensionExerciseName::WeightedSingleLegBackExtension),
15467            25 => Some(HyperextensionExerciseName::SpineExtension),
15468            26 => Some(HyperextensionExerciseName::WeightedSpineExtension),
15469            27 => Some(HyperextensionExerciseName::StaticBackExtension),
15470            28 => Some(HyperextensionExerciseName::WeightedStaticBackExtension),
15471            29 => Some(HyperextensionExerciseName::SupermanFromFloor),
15472            30 => Some(HyperextensionExerciseName::WeightedSupermanFromFloor),
15473            31 => Some(HyperextensionExerciseName::SwissBallBackExtension),
15474            32 => Some(HyperextensionExerciseName::WeightedSwissBallBackExtension),
15475            33 => Some(HyperextensionExerciseName::SwissBallHyperextension),
15476            34 => Some(HyperextensionExerciseName::WeightedSwissBallHyperextension),
15477            35 => Some(HyperextensionExerciseName::SwissBallOppositeArmAndLegLift),
15478            36 => Some(HyperextensionExerciseName::WeightedSwissBallOppositeArmAndLegLift),
15479            37 => Some(HyperextensionExerciseName::SupermanOnSwissBall),
15480            38 => Some(HyperextensionExerciseName::Cobra),
15481            39 => Some(HyperextensionExerciseName::SupineFloorBarre),
15482            _ => None,
15483        }
15484    }
15485
15486    /// Try to construct from the snake-case canonical name.
15487    pub fn from_str(name: &str) -> Option<Self> {
15488        match name {
15489            "back_extension_with_opposite_arm_and_leg_reach" => {
15490                Some(HyperextensionExerciseName::BackExtensionWithOppositeArmAndLegReach)
15491            }
15492            "weighted_back_extension_with_opposite_arm_and_leg_reach" => {
15493                Some(HyperextensionExerciseName::WeightedBackExtensionWithOppositeArmAndLegReach)
15494            }
15495            "base_rotations" => Some(HyperextensionExerciseName::BaseRotations),
15496            "weighted_base_rotations" => Some(HyperextensionExerciseName::WeightedBaseRotations),
15497            "bent_knee_reverse_hyperextension" => {
15498                Some(HyperextensionExerciseName::BentKneeReverseHyperextension)
15499            }
15500            "weighted_bent_knee_reverse_hyperextension" => {
15501                Some(HyperextensionExerciseName::WeightedBentKneeReverseHyperextension)
15502            }
15503            "hollow_hold_and_roll" => Some(HyperextensionExerciseName::HollowHoldAndRoll),
15504            "weighted_hollow_hold_and_roll" => {
15505                Some(HyperextensionExerciseName::WeightedHollowHoldAndRoll)
15506            }
15507            "kicks" => Some(HyperextensionExerciseName::Kicks),
15508            "weighted_kicks" => Some(HyperextensionExerciseName::WeightedKicks),
15509            "knee_raises" => Some(HyperextensionExerciseName::KneeRaises),
15510            "weighted_knee_raises" => Some(HyperextensionExerciseName::WeightedKneeRaises),
15511            "kneeling_superman" => Some(HyperextensionExerciseName::KneelingSuperman),
15512            "weighted_kneeling_superman" => {
15513                Some(HyperextensionExerciseName::WeightedKneelingSuperman)
15514            }
15515            "lat_pull_down_with_row" => Some(HyperextensionExerciseName::LatPullDownWithRow),
15516            "medicine_ball_deadlift_to_reach" => {
15517                Some(HyperextensionExerciseName::MedicineBallDeadliftToReach)
15518            }
15519            "one_arm_one_leg_row" => Some(HyperextensionExerciseName::OneArmOneLegRow),
15520            "one_arm_row_with_band" => Some(HyperextensionExerciseName::OneArmRowWithBand),
15521            "overhead_lunge_with_medicine_ball" => {
15522                Some(HyperextensionExerciseName::OverheadLungeWithMedicineBall)
15523            }
15524            "plank_knee_tucks" => Some(HyperextensionExerciseName::PlankKneeTucks),
15525            "weighted_plank_knee_tucks" => Some(HyperextensionExerciseName::WeightedPlankKneeTucks),
15526            "side_step" => Some(HyperextensionExerciseName::SideStep),
15527            "weighted_side_step" => Some(HyperextensionExerciseName::WeightedSideStep),
15528            "single_leg_back_extension" => Some(HyperextensionExerciseName::SingleLegBackExtension),
15529            "weighted_single_leg_back_extension" => {
15530                Some(HyperextensionExerciseName::WeightedSingleLegBackExtension)
15531            }
15532            "spine_extension" => Some(HyperextensionExerciseName::SpineExtension),
15533            "weighted_spine_extension" => Some(HyperextensionExerciseName::WeightedSpineExtension),
15534            "static_back_extension" => Some(HyperextensionExerciseName::StaticBackExtension),
15535            "weighted_static_back_extension" => {
15536                Some(HyperextensionExerciseName::WeightedStaticBackExtension)
15537            }
15538            "superman_from_floor" => Some(HyperextensionExerciseName::SupermanFromFloor),
15539            "weighted_superman_from_floor" => {
15540                Some(HyperextensionExerciseName::WeightedSupermanFromFloor)
15541            }
15542            "swiss_ball_back_extension" => Some(HyperextensionExerciseName::SwissBallBackExtension),
15543            "weighted_swiss_ball_back_extension" => {
15544                Some(HyperextensionExerciseName::WeightedSwissBallBackExtension)
15545            }
15546            "swiss_ball_hyperextension" => {
15547                Some(HyperextensionExerciseName::SwissBallHyperextension)
15548            }
15549            "weighted_swiss_ball_hyperextension" => {
15550                Some(HyperextensionExerciseName::WeightedSwissBallHyperextension)
15551            }
15552            "swiss_ball_opposite_arm_and_leg_lift" => {
15553                Some(HyperextensionExerciseName::SwissBallOppositeArmAndLegLift)
15554            }
15555            "weighted_swiss_ball_opposite_arm_and_leg_lift" => {
15556                Some(HyperextensionExerciseName::WeightedSwissBallOppositeArmAndLegLift)
15557            }
15558            "superman_on_swiss_ball" => Some(HyperextensionExerciseName::SupermanOnSwissBall),
15559            "cobra" => Some(HyperextensionExerciseName::Cobra),
15560            "supine_floor_barre" => Some(HyperextensionExerciseName::SupineFloorBarre),
15561            _ => None,
15562        }
15563    }
15564}
15565
15566#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
15567#[repr(u16)]
15568#[non_exhaustive]
15569pub enum LateralRaiseExerciseName {
15570    _45DegreeCableExternalRotation = 0,
15571    AlternatingLateralRaiseWithStaticHold = 1,
15572    BarMuscleUp = 2,
15573    BentOverLateralRaise = 3,
15574    CableDiagonalRaise = 4,
15575    CableFrontRaise = 5,
15576    CalorieRow = 6,
15577    ComboShoulderRaise = 7,
15578    DumbbellDiagonalRaise = 8,
15579    DumbbellVRaise = 9,
15580    FrontRaise = 10,
15581    LeaningDumbbellLateralRaise = 11,
15582    LyingDumbbellRaise = 12,
15583    MuscleUp = 13,
15584    OneArmCableLateralRaise = 14,
15585    OverhandGripRearLateralRaise = 15,
15586    PlateRaises = 16,
15587    RingDip = 17,
15588    WeightedRingDip = 18,
15589    RingMuscleUp = 19,
15590    WeightedRingMuscleUp = 20,
15591    RopeClimb = 21,
15592    WeightedRopeClimb = 22,
15593    Scaption = 23,
15594    SeatedLateralRaise = 24,
15595    SeatedRearLateralRaise = 25,
15596    SideLyingLateralRaise = 26,
15597    StandingLift = 27,
15598    SuspendedRow = 28,
15599    UnderhandGripRearLateralRaise = 29,
15600    WallSlide = 30,
15601    WeightedWallSlide = 31,
15602    ArmCircles = 32,
15603    ShavingTheHead = 33,
15604    DumbbellLateralRaise = 34,
15605    RingDipKipping = 36,
15606    WallWalk = 37,
15607    DumbbellFrontRaiseWheelchair = 38,
15608    DumbbellLateralRaiseWheelchair = 39,
15609    PoleDoubleArmOverheadAndForwardWheelchair = 40,
15610    PoleStraightArmOverheadWheelchair = 41,
15611}
15612
15613impl LateralRaiseExerciseName {
15614    /// Snake-case canonical name from Profile.xlsx.
15615    pub fn as_str(&self) -> &'static str {
15616        match self {
15617            LateralRaiseExerciseName::_45DegreeCableExternalRotation => {
15618                "45_degree_cable_external_rotation"
15619            }
15620            LateralRaiseExerciseName::AlternatingLateralRaiseWithStaticHold => {
15621                "alternating_lateral_raise_with_static_hold"
15622            }
15623            LateralRaiseExerciseName::BarMuscleUp => "bar_muscle_up",
15624            LateralRaiseExerciseName::BentOverLateralRaise => "bent_over_lateral_raise",
15625            LateralRaiseExerciseName::CableDiagonalRaise => "cable_diagonal_raise",
15626            LateralRaiseExerciseName::CableFrontRaise => "cable_front_raise",
15627            LateralRaiseExerciseName::CalorieRow => "calorie_row",
15628            LateralRaiseExerciseName::ComboShoulderRaise => "combo_shoulder_raise",
15629            LateralRaiseExerciseName::DumbbellDiagonalRaise => "dumbbell_diagonal_raise",
15630            LateralRaiseExerciseName::DumbbellVRaise => "dumbbell_v_raise",
15631            LateralRaiseExerciseName::FrontRaise => "front_raise",
15632            LateralRaiseExerciseName::LeaningDumbbellLateralRaise => {
15633                "leaning_dumbbell_lateral_raise"
15634            }
15635            LateralRaiseExerciseName::LyingDumbbellRaise => "lying_dumbbell_raise",
15636            LateralRaiseExerciseName::MuscleUp => "muscle_up",
15637            LateralRaiseExerciseName::OneArmCableLateralRaise => "one_arm_cable_lateral_raise",
15638            LateralRaiseExerciseName::OverhandGripRearLateralRaise => {
15639                "overhand_grip_rear_lateral_raise"
15640            }
15641            LateralRaiseExerciseName::PlateRaises => "plate_raises",
15642            LateralRaiseExerciseName::RingDip => "ring_dip",
15643            LateralRaiseExerciseName::WeightedRingDip => "weighted_ring_dip",
15644            LateralRaiseExerciseName::RingMuscleUp => "ring_muscle_up",
15645            LateralRaiseExerciseName::WeightedRingMuscleUp => "weighted_ring_muscle_up",
15646            LateralRaiseExerciseName::RopeClimb => "rope_climb",
15647            LateralRaiseExerciseName::WeightedRopeClimb => "weighted_rope_climb",
15648            LateralRaiseExerciseName::Scaption => "scaption",
15649            LateralRaiseExerciseName::SeatedLateralRaise => "seated_lateral_raise",
15650            LateralRaiseExerciseName::SeatedRearLateralRaise => "seated_rear_lateral_raise",
15651            LateralRaiseExerciseName::SideLyingLateralRaise => "side_lying_lateral_raise",
15652            LateralRaiseExerciseName::StandingLift => "standing_lift",
15653            LateralRaiseExerciseName::SuspendedRow => "suspended_row",
15654            LateralRaiseExerciseName::UnderhandGripRearLateralRaise => {
15655                "underhand_grip_rear_lateral_raise"
15656            }
15657            LateralRaiseExerciseName::WallSlide => "wall_slide",
15658            LateralRaiseExerciseName::WeightedWallSlide => "weighted_wall_slide",
15659            LateralRaiseExerciseName::ArmCircles => "arm_circles",
15660            LateralRaiseExerciseName::ShavingTheHead => "shaving_the_head",
15661            LateralRaiseExerciseName::DumbbellLateralRaise => "dumbbell_lateral_raise",
15662            LateralRaiseExerciseName::RingDipKipping => "ring_dip_kipping",
15663            LateralRaiseExerciseName::WallWalk => "wall_walk",
15664            LateralRaiseExerciseName::DumbbellFrontRaiseWheelchair => {
15665                "dumbbell_front_raise_wheelchair"
15666            }
15667            LateralRaiseExerciseName::DumbbellLateralRaiseWheelchair => {
15668                "dumbbell_lateral_raise_wheelchair"
15669            }
15670            LateralRaiseExerciseName::PoleDoubleArmOverheadAndForwardWheelchair => {
15671                "pole_double_arm_overhead_and_forward_wheelchair"
15672            }
15673            LateralRaiseExerciseName::PoleStraightArmOverheadWheelchair => {
15674                "pole_straight_arm_overhead_wheelchair"
15675            }
15676        }
15677    }
15678
15679    /// Try to construct from the underlying numeric value.
15680    pub fn from_value(value: u16) -> Option<Self> {
15681        match value {
15682            0 => Some(LateralRaiseExerciseName::_45DegreeCableExternalRotation),
15683            1 => Some(LateralRaiseExerciseName::AlternatingLateralRaiseWithStaticHold),
15684            2 => Some(LateralRaiseExerciseName::BarMuscleUp),
15685            3 => Some(LateralRaiseExerciseName::BentOverLateralRaise),
15686            4 => Some(LateralRaiseExerciseName::CableDiagonalRaise),
15687            5 => Some(LateralRaiseExerciseName::CableFrontRaise),
15688            6 => Some(LateralRaiseExerciseName::CalorieRow),
15689            7 => Some(LateralRaiseExerciseName::ComboShoulderRaise),
15690            8 => Some(LateralRaiseExerciseName::DumbbellDiagonalRaise),
15691            9 => Some(LateralRaiseExerciseName::DumbbellVRaise),
15692            10 => Some(LateralRaiseExerciseName::FrontRaise),
15693            11 => Some(LateralRaiseExerciseName::LeaningDumbbellLateralRaise),
15694            12 => Some(LateralRaiseExerciseName::LyingDumbbellRaise),
15695            13 => Some(LateralRaiseExerciseName::MuscleUp),
15696            14 => Some(LateralRaiseExerciseName::OneArmCableLateralRaise),
15697            15 => Some(LateralRaiseExerciseName::OverhandGripRearLateralRaise),
15698            16 => Some(LateralRaiseExerciseName::PlateRaises),
15699            17 => Some(LateralRaiseExerciseName::RingDip),
15700            18 => Some(LateralRaiseExerciseName::WeightedRingDip),
15701            19 => Some(LateralRaiseExerciseName::RingMuscleUp),
15702            20 => Some(LateralRaiseExerciseName::WeightedRingMuscleUp),
15703            21 => Some(LateralRaiseExerciseName::RopeClimb),
15704            22 => Some(LateralRaiseExerciseName::WeightedRopeClimb),
15705            23 => Some(LateralRaiseExerciseName::Scaption),
15706            24 => Some(LateralRaiseExerciseName::SeatedLateralRaise),
15707            25 => Some(LateralRaiseExerciseName::SeatedRearLateralRaise),
15708            26 => Some(LateralRaiseExerciseName::SideLyingLateralRaise),
15709            27 => Some(LateralRaiseExerciseName::StandingLift),
15710            28 => Some(LateralRaiseExerciseName::SuspendedRow),
15711            29 => Some(LateralRaiseExerciseName::UnderhandGripRearLateralRaise),
15712            30 => Some(LateralRaiseExerciseName::WallSlide),
15713            31 => Some(LateralRaiseExerciseName::WeightedWallSlide),
15714            32 => Some(LateralRaiseExerciseName::ArmCircles),
15715            33 => Some(LateralRaiseExerciseName::ShavingTheHead),
15716            34 => Some(LateralRaiseExerciseName::DumbbellLateralRaise),
15717            36 => Some(LateralRaiseExerciseName::RingDipKipping),
15718            37 => Some(LateralRaiseExerciseName::WallWalk),
15719            38 => Some(LateralRaiseExerciseName::DumbbellFrontRaiseWheelchair),
15720            39 => Some(LateralRaiseExerciseName::DumbbellLateralRaiseWheelchair),
15721            40 => Some(LateralRaiseExerciseName::PoleDoubleArmOverheadAndForwardWheelchair),
15722            41 => Some(LateralRaiseExerciseName::PoleStraightArmOverheadWheelchair),
15723            _ => None,
15724        }
15725    }
15726
15727    /// Try to construct from the snake-case canonical name.
15728    pub fn from_str(name: &str) -> Option<Self> {
15729        match name {
15730            "45_degree_cable_external_rotation" => {
15731                Some(LateralRaiseExerciseName::_45DegreeCableExternalRotation)
15732            }
15733            "alternating_lateral_raise_with_static_hold" => {
15734                Some(LateralRaiseExerciseName::AlternatingLateralRaiseWithStaticHold)
15735            }
15736            "bar_muscle_up" => Some(LateralRaiseExerciseName::BarMuscleUp),
15737            "bent_over_lateral_raise" => Some(LateralRaiseExerciseName::BentOverLateralRaise),
15738            "cable_diagonal_raise" => Some(LateralRaiseExerciseName::CableDiagonalRaise),
15739            "cable_front_raise" => Some(LateralRaiseExerciseName::CableFrontRaise),
15740            "calorie_row" => Some(LateralRaiseExerciseName::CalorieRow),
15741            "combo_shoulder_raise" => Some(LateralRaiseExerciseName::ComboShoulderRaise),
15742            "dumbbell_diagonal_raise" => Some(LateralRaiseExerciseName::DumbbellDiagonalRaise),
15743            "dumbbell_v_raise" => Some(LateralRaiseExerciseName::DumbbellVRaise),
15744            "front_raise" => Some(LateralRaiseExerciseName::FrontRaise),
15745            "leaning_dumbbell_lateral_raise" => {
15746                Some(LateralRaiseExerciseName::LeaningDumbbellLateralRaise)
15747            }
15748            "lying_dumbbell_raise" => Some(LateralRaiseExerciseName::LyingDumbbellRaise),
15749            "muscle_up" => Some(LateralRaiseExerciseName::MuscleUp),
15750            "one_arm_cable_lateral_raise" => {
15751                Some(LateralRaiseExerciseName::OneArmCableLateralRaise)
15752            }
15753            "overhand_grip_rear_lateral_raise" => {
15754                Some(LateralRaiseExerciseName::OverhandGripRearLateralRaise)
15755            }
15756            "plate_raises" => Some(LateralRaiseExerciseName::PlateRaises),
15757            "ring_dip" => Some(LateralRaiseExerciseName::RingDip),
15758            "weighted_ring_dip" => Some(LateralRaiseExerciseName::WeightedRingDip),
15759            "ring_muscle_up" => Some(LateralRaiseExerciseName::RingMuscleUp),
15760            "weighted_ring_muscle_up" => Some(LateralRaiseExerciseName::WeightedRingMuscleUp),
15761            "rope_climb" => Some(LateralRaiseExerciseName::RopeClimb),
15762            "weighted_rope_climb" => Some(LateralRaiseExerciseName::WeightedRopeClimb),
15763            "scaption" => Some(LateralRaiseExerciseName::Scaption),
15764            "seated_lateral_raise" => Some(LateralRaiseExerciseName::SeatedLateralRaise),
15765            "seated_rear_lateral_raise" => Some(LateralRaiseExerciseName::SeatedRearLateralRaise),
15766            "side_lying_lateral_raise" => Some(LateralRaiseExerciseName::SideLyingLateralRaise),
15767            "standing_lift" => Some(LateralRaiseExerciseName::StandingLift),
15768            "suspended_row" => Some(LateralRaiseExerciseName::SuspendedRow),
15769            "underhand_grip_rear_lateral_raise" => {
15770                Some(LateralRaiseExerciseName::UnderhandGripRearLateralRaise)
15771            }
15772            "wall_slide" => Some(LateralRaiseExerciseName::WallSlide),
15773            "weighted_wall_slide" => Some(LateralRaiseExerciseName::WeightedWallSlide),
15774            "arm_circles" => Some(LateralRaiseExerciseName::ArmCircles),
15775            "shaving_the_head" => Some(LateralRaiseExerciseName::ShavingTheHead),
15776            "dumbbell_lateral_raise" => Some(LateralRaiseExerciseName::DumbbellLateralRaise),
15777            "ring_dip_kipping" => Some(LateralRaiseExerciseName::RingDipKipping),
15778            "wall_walk" => Some(LateralRaiseExerciseName::WallWalk),
15779            "dumbbell_front_raise_wheelchair" => {
15780                Some(LateralRaiseExerciseName::DumbbellFrontRaiseWheelchair)
15781            }
15782            "dumbbell_lateral_raise_wheelchair" => {
15783                Some(LateralRaiseExerciseName::DumbbellLateralRaiseWheelchair)
15784            }
15785            "pole_double_arm_overhead_and_forward_wheelchair" => {
15786                Some(LateralRaiseExerciseName::PoleDoubleArmOverheadAndForwardWheelchair)
15787            }
15788            "pole_straight_arm_overhead_wheelchair" => {
15789                Some(LateralRaiseExerciseName::PoleStraightArmOverheadWheelchair)
15790            }
15791            _ => None,
15792        }
15793    }
15794}
15795
15796#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
15797#[repr(u16)]
15798#[non_exhaustive]
15799pub enum LegCurlExerciseName {
15800    LegCurl = 0,
15801    WeightedLegCurl = 1,
15802    GoodMorning = 2,
15803    SeatedBarbellGoodMorning = 3,
15804    SingleLegBarbellGoodMorning = 4,
15805    SingleLegSlidingLegCurl = 5,
15806    SlidingLegCurl = 6,
15807    SplitBarbellGoodMorning = 7,
15808    SplitStanceExtension = 8,
15809    StaggeredStanceGoodMorning = 9,
15810    SwissBallHipRaiseAndLegCurl = 10,
15811    ZercherGoodMorning = 11,
15812    BandGoodMorning = 12,
15813    BarGoodMorning = 13,
15814}
15815
15816impl LegCurlExerciseName {
15817    /// Snake-case canonical name from Profile.xlsx.
15818    pub fn as_str(&self) -> &'static str {
15819        match self {
15820            LegCurlExerciseName::LegCurl => "leg_curl",
15821            LegCurlExerciseName::WeightedLegCurl => "weighted_leg_curl",
15822            LegCurlExerciseName::GoodMorning => "good_morning",
15823            LegCurlExerciseName::SeatedBarbellGoodMorning => "seated_barbell_good_morning",
15824            LegCurlExerciseName::SingleLegBarbellGoodMorning => "single_leg_barbell_good_morning",
15825            LegCurlExerciseName::SingleLegSlidingLegCurl => "single_leg_sliding_leg_curl",
15826            LegCurlExerciseName::SlidingLegCurl => "sliding_leg_curl",
15827            LegCurlExerciseName::SplitBarbellGoodMorning => "split_barbell_good_morning",
15828            LegCurlExerciseName::SplitStanceExtension => "split_stance_extension",
15829            LegCurlExerciseName::StaggeredStanceGoodMorning => "staggered_stance_good_morning",
15830            LegCurlExerciseName::SwissBallHipRaiseAndLegCurl => "swiss_ball_hip_raise_and_leg_curl",
15831            LegCurlExerciseName::ZercherGoodMorning => "zercher_good_morning",
15832            LegCurlExerciseName::BandGoodMorning => "band_good_morning",
15833            LegCurlExerciseName::BarGoodMorning => "bar_good_morning",
15834        }
15835    }
15836
15837    /// Try to construct from the underlying numeric value.
15838    pub fn from_value(value: u16) -> Option<Self> {
15839        match value {
15840            0 => Some(LegCurlExerciseName::LegCurl),
15841            1 => Some(LegCurlExerciseName::WeightedLegCurl),
15842            2 => Some(LegCurlExerciseName::GoodMorning),
15843            3 => Some(LegCurlExerciseName::SeatedBarbellGoodMorning),
15844            4 => Some(LegCurlExerciseName::SingleLegBarbellGoodMorning),
15845            5 => Some(LegCurlExerciseName::SingleLegSlidingLegCurl),
15846            6 => Some(LegCurlExerciseName::SlidingLegCurl),
15847            7 => Some(LegCurlExerciseName::SplitBarbellGoodMorning),
15848            8 => Some(LegCurlExerciseName::SplitStanceExtension),
15849            9 => Some(LegCurlExerciseName::StaggeredStanceGoodMorning),
15850            10 => Some(LegCurlExerciseName::SwissBallHipRaiseAndLegCurl),
15851            11 => Some(LegCurlExerciseName::ZercherGoodMorning),
15852            12 => Some(LegCurlExerciseName::BandGoodMorning),
15853            13 => Some(LegCurlExerciseName::BarGoodMorning),
15854            _ => None,
15855        }
15856    }
15857
15858    /// Try to construct from the snake-case canonical name.
15859    pub fn from_str(name: &str) -> Option<Self> {
15860        match name {
15861            "leg_curl" => Some(LegCurlExerciseName::LegCurl),
15862            "weighted_leg_curl" => Some(LegCurlExerciseName::WeightedLegCurl),
15863            "good_morning" => Some(LegCurlExerciseName::GoodMorning),
15864            "seated_barbell_good_morning" => Some(LegCurlExerciseName::SeatedBarbellGoodMorning),
15865            "single_leg_barbell_good_morning" => {
15866                Some(LegCurlExerciseName::SingleLegBarbellGoodMorning)
15867            }
15868            "single_leg_sliding_leg_curl" => Some(LegCurlExerciseName::SingleLegSlidingLegCurl),
15869            "sliding_leg_curl" => Some(LegCurlExerciseName::SlidingLegCurl),
15870            "split_barbell_good_morning" => Some(LegCurlExerciseName::SplitBarbellGoodMorning),
15871            "split_stance_extension" => Some(LegCurlExerciseName::SplitStanceExtension),
15872            "staggered_stance_good_morning" => {
15873                Some(LegCurlExerciseName::StaggeredStanceGoodMorning)
15874            }
15875            "swiss_ball_hip_raise_and_leg_curl" => {
15876                Some(LegCurlExerciseName::SwissBallHipRaiseAndLegCurl)
15877            }
15878            "zercher_good_morning" => Some(LegCurlExerciseName::ZercherGoodMorning),
15879            "band_good_morning" => Some(LegCurlExerciseName::BandGoodMorning),
15880            "bar_good_morning" => Some(LegCurlExerciseName::BarGoodMorning),
15881            _ => None,
15882        }
15883    }
15884}
15885
15886#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
15887#[repr(u16)]
15888#[non_exhaustive]
15889pub enum LegRaiseExerciseName {
15890    HangingKneeRaise = 0,
15891    HangingLegRaise = 1,
15892    WeightedHangingLegRaise = 2,
15893    HangingSingleLegRaise = 3,
15894    WeightedHangingSingleLegRaise = 4,
15895    KettlebellLegRaises = 5,
15896    LegLoweringDrill = 6,
15897    WeightedLegLoweringDrill = 7,
15898    LyingStraightLegRaise = 8,
15899    WeightedLyingStraightLegRaise = 9,
15900    MedicineBallLegDrops = 10,
15901    QuadrupedLegRaise = 11,
15902    WeightedQuadrupedLegRaise = 12,
15903    ReverseLegRaise = 13,
15904    WeightedReverseLegRaise = 14,
15905    ReverseLegRaiseOnSwissBall = 15,
15906    WeightedReverseLegRaiseOnSwissBall = 16,
15907    SingleLegLoweringDrill = 17,
15908    WeightedSingleLegLoweringDrill = 18,
15909    WeightedHangingKneeRaise = 19,
15910    LateralStepover = 20,
15911    WeightedLateralStepover = 21,
15912}
15913
15914impl LegRaiseExerciseName {
15915    /// Snake-case canonical name from Profile.xlsx.
15916    pub fn as_str(&self) -> &'static str {
15917        match self {
15918            LegRaiseExerciseName::HangingKneeRaise => "hanging_knee_raise",
15919            LegRaiseExerciseName::HangingLegRaise => "hanging_leg_raise",
15920            LegRaiseExerciseName::WeightedHangingLegRaise => "weighted_hanging_leg_raise",
15921            LegRaiseExerciseName::HangingSingleLegRaise => "hanging_single_leg_raise",
15922            LegRaiseExerciseName::WeightedHangingSingleLegRaise => {
15923                "weighted_hanging_single_leg_raise"
15924            }
15925            LegRaiseExerciseName::KettlebellLegRaises => "kettlebell_leg_raises",
15926            LegRaiseExerciseName::LegLoweringDrill => "leg_lowering_drill",
15927            LegRaiseExerciseName::WeightedLegLoweringDrill => "weighted_leg_lowering_drill",
15928            LegRaiseExerciseName::LyingStraightLegRaise => "lying_straight_leg_raise",
15929            LegRaiseExerciseName::WeightedLyingStraightLegRaise => {
15930                "weighted_lying_straight_leg_raise"
15931            }
15932            LegRaiseExerciseName::MedicineBallLegDrops => "medicine_ball_leg_drops",
15933            LegRaiseExerciseName::QuadrupedLegRaise => "quadruped_leg_raise",
15934            LegRaiseExerciseName::WeightedQuadrupedLegRaise => "weighted_quadruped_leg_raise",
15935            LegRaiseExerciseName::ReverseLegRaise => "reverse_leg_raise",
15936            LegRaiseExerciseName::WeightedReverseLegRaise => "weighted_reverse_leg_raise",
15937            LegRaiseExerciseName::ReverseLegRaiseOnSwissBall => "reverse_leg_raise_on_swiss_ball",
15938            LegRaiseExerciseName::WeightedReverseLegRaiseOnSwissBall => {
15939                "weighted_reverse_leg_raise_on_swiss_ball"
15940            }
15941            LegRaiseExerciseName::SingleLegLoweringDrill => "single_leg_lowering_drill",
15942            LegRaiseExerciseName::WeightedSingleLegLoweringDrill => {
15943                "weighted_single_leg_lowering_drill"
15944            }
15945            LegRaiseExerciseName::WeightedHangingKneeRaise => "weighted_hanging_knee_raise",
15946            LegRaiseExerciseName::LateralStepover => "lateral_stepover",
15947            LegRaiseExerciseName::WeightedLateralStepover => "weighted_lateral_stepover",
15948        }
15949    }
15950
15951    /// Try to construct from the underlying numeric value.
15952    pub fn from_value(value: u16) -> Option<Self> {
15953        match value {
15954            0 => Some(LegRaiseExerciseName::HangingKneeRaise),
15955            1 => Some(LegRaiseExerciseName::HangingLegRaise),
15956            2 => Some(LegRaiseExerciseName::WeightedHangingLegRaise),
15957            3 => Some(LegRaiseExerciseName::HangingSingleLegRaise),
15958            4 => Some(LegRaiseExerciseName::WeightedHangingSingleLegRaise),
15959            5 => Some(LegRaiseExerciseName::KettlebellLegRaises),
15960            6 => Some(LegRaiseExerciseName::LegLoweringDrill),
15961            7 => Some(LegRaiseExerciseName::WeightedLegLoweringDrill),
15962            8 => Some(LegRaiseExerciseName::LyingStraightLegRaise),
15963            9 => Some(LegRaiseExerciseName::WeightedLyingStraightLegRaise),
15964            10 => Some(LegRaiseExerciseName::MedicineBallLegDrops),
15965            11 => Some(LegRaiseExerciseName::QuadrupedLegRaise),
15966            12 => Some(LegRaiseExerciseName::WeightedQuadrupedLegRaise),
15967            13 => Some(LegRaiseExerciseName::ReverseLegRaise),
15968            14 => Some(LegRaiseExerciseName::WeightedReverseLegRaise),
15969            15 => Some(LegRaiseExerciseName::ReverseLegRaiseOnSwissBall),
15970            16 => Some(LegRaiseExerciseName::WeightedReverseLegRaiseOnSwissBall),
15971            17 => Some(LegRaiseExerciseName::SingleLegLoweringDrill),
15972            18 => Some(LegRaiseExerciseName::WeightedSingleLegLoweringDrill),
15973            19 => Some(LegRaiseExerciseName::WeightedHangingKneeRaise),
15974            20 => Some(LegRaiseExerciseName::LateralStepover),
15975            21 => Some(LegRaiseExerciseName::WeightedLateralStepover),
15976            _ => None,
15977        }
15978    }
15979
15980    /// Try to construct from the snake-case canonical name.
15981    pub fn from_str(name: &str) -> Option<Self> {
15982        match name {
15983            "hanging_knee_raise" => Some(LegRaiseExerciseName::HangingKneeRaise),
15984            "hanging_leg_raise" => Some(LegRaiseExerciseName::HangingLegRaise),
15985            "weighted_hanging_leg_raise" => Some(LegRaiseExerciseName::WeightedHangingLegRaise),
15986            "hanging_single_leg_raise" => Some(LegRaiseExerciseName::HangingSingleLegRaise),
15987            "weighted_hanging_single_leg_raise" => {
15988                Some(LegRaiseExerciseName::WeightedHangingSingleLegRaise)
15989            }
15990            "kettlebell_leg_raises" => Some(LegRaiseExerciseName::KettlebellLegRaises),
15991            "leg_lowering_drill" => Some(LegRaiseExerciseName::LegLoweringDrill),
15992            "weighted_leg_lowering_drill" => Some(LegRaiseExerciseName::WeightedLegLoweringDrill),
15993            "lying_straight_leg_raise" => Some(LegRaiseExerciseName::LyingStraightLegRaise),
15994            "weighted_lying_straight_leg_raise" => {
15995                Some(LegRaiseExerciseName::WeightedLyingStraightLegRaise)
15996            }
15997            "medicine_ball_leg_drops" => Some(LegRaiseExerciseName::MedicineBallLegDrops),
15998            "quadruped_leg_raise" => Some(LegRaiseExerciseName::QuadrupedLegRaise),
15999            "weighted_quadruped_leg_raise" => Some(LegRaiseExerciseName::WeightedQuadrupedLegRaise),
16000            "reverse_leg_raise" => Some(LegRaiseExerciseName::ReverseLegRaise),
16001            "weighted_reverse_leg_raise" => Some(LegRaiseExerciseName::WeightedReverseLegRaise),
16002            "reverse_leg_raise_on_swiss_ball" => {
16003                Some(LegRaiseExerciseName::ReverseLegRaiseOnSwissBall)
16004            }
16005            "weighted_reverse_leg_raise_on_swiss_ball" => {
16006                Some(LegRaiseExerciseName::WeightedReverseLegRaiseOnSwissBall)
16007            }
16008            "single_leg_lowering_drill" => Some(LegRaiseExerciseName::SingleLegLoweringDrill),
16009            "weighted_single_leg_lowering_drill" => {
16010                Some(LegRaiseExerciseName::WeightedSingleLegLoweringDrill)
16011            }
16012            "weighted_hanging_knee_raise" => Some(LegRaiseExerciseName::WeightedHangingKneeRaise),
16013            "lateral_stepover" => Some(LegRaiseExerciseName::LateralStepover),
16014            "weighted_lateral_stepover" => Some(LegRaiseExerciseName::WeightedLateralStepover),
16015            _ => None,
16016        }
16017    }
16018}
16019
16020#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
16021#[repr(u16)]
16022#[non_exhaustive]
16023pub enum LungeExerciseName {
16024    OverheadLunge = 0,
16025    LungeMatrix = 1,
16026    WeightedLungeMatrix = 2,
16027    AlternatingBarbellForwardLunge = 3,
16028    AlternatingDumbbellLungeWithReach = 4,
16029    BackFootElevatedDumbbellSplitSquat = 5,
16030    BarbellBoxLunge = 6,
16031    BarbellBulgarianSplitSquat = 7,
16032    BarbellCrossoverLunge = 8,
16033    BarbellFrontSplitSquat = 9,
16034    BarbellLunge = 10,
16035    BarbellReverseLunge = 11,
16036    BarbellSideLunge = 12,
16037    BarbellSplitSquat = 13,
16038    CoreControlRearLunge = 14,
16039    DiagonalLunge = 15,
16040    DropLunge = 16,
16041    DumbbellBoxLunge = 17,
16042    DumbbellBulgarianSplitSquat = 18,
16043    DumbbellCrossoverLunge = 19,
16044    DumbbellDiagonalLunge = 20,
16045    DumbbellLunge = 21,
16046    DumbbellLungeAndRotation = 22,
16047    DumbbellOverheadBulgarianSplitSquat = 23,
16048    DumbbellReverseLungeToHighKneeAndPress = 24,
16049    DumbbellSideLunge = 25,
16050    ElevatedFrontFootBarbellSplitSquat = 26,
16051    FrontFootElevatedDumbbellSplitSquat = 27,
16052    GunslingerLunge = 28,
16053    LawnmowerLunge = 29,
16054    LowLungeWithIsometricAdduction = 30,
16055    LowSideToSideLunge = 31,
16056    Lunge = 32,
16057    WeightedLunge = 33,
16058    LungeWithArmReach = 34,
16059    LungeWithDiagonalReach = 35,
16060    LungeWithSideBend = 36,
16061    OffsetDumbbellLunge = 37,
16062    OffsetDumbbellReverseLunge = 38,
16063    OverheadBulgarianSplitSquat = 39,
16064    OverheadDumbbellReverseLunge = 40,
16065    OverheadDumbbellSplitSquat = 41,
16066    OverheadLungeWithRotation = 42,
16067    ReverseBarbellBoxLunge = 43,
16068    ReverseBoxLunge = 44,
16069    ReverseDumbbellBoxLunge = 45,
16070    ReverseDumbbellCrossoverLunge = 46,
16071    ReverseDumbbellDiagonalLunge = 47,
16072    ReverseLungeWithReachBack = 48,
16073    WeightedReverseLungeWithReachBack = 49,
16074    ReverseLungeWithTwistAndOverheadReach = 50,
16075    WeightedReverseLungeWithTwistAndOverheadReach = 51,
16076    ReverseSlidingBoxLunge = 52,
16077    WeightedReverseSlidingBoxLunge = 53,
16078    ReverseSlidingLunge = 54,
16079    WeightedReverseSlidingLunge = 55,
16080    RunnersLungeToBalance = 56,
16081    WeightedRunnersLungeToBalance = 57,
16082    ShiftingSideLunge = 58,
16083    SideAndCrossoverLunge = 59,
16084    WeightedSideAndCrossoverLunge = 60,
16085    SideLunge = 61,
16086    WeightedSideLunge = 62,
16087    SideLungeAndPress = 63,
16088    SideLungeJumpOff = 64,
16089    SideLungeSweep = 65,
16090    WeightedSideLungeSweep = 66,
16091    SideLungeToCrossoverTap = 67,
16092    WeightedSideLungeToCrossoverTap = 68,
16093    SideToSideLungeChops = 69,
16094    WeightedSideToSideLungeChops = 70,
16095    SiffJumpLunge = 71,
16096    WeightedSiffJumpLunge = 72,
16097    SingleArmReverseLungeAndPress = 73,
16098    SlidingLateralLunge = 74,
16099    WeightedSlidingLateralLunge = 75,
16100    WalkingBarbellLunge = 76,
16101    WalkingDumbbellLunge = 77,
16102    WalkingLunge = 78,
16103    WeightedWalkingLunge = 79,
16104    WideGripOverheadBarbellSplitSquat = 80,
16105    AlternatingDumbbellLunge = 81,
16106    DumbbellReverseLunge = 82,
16107    OverheadDumbbellLunge = 83,
16108    ScissorPowerSwitch = 84,
16109    DumbbellOverheadWalkingLunge = 85,
16110    CurtsyLunge = 86,
16111    WeightedCurtsyLunge = 87,
16112    WeightedShiftingSideLunge = 88,
16113    WeightedSideLungeAndPress = 89,
16114    WeightedSideLungeJumpOff = 90,
16115}
16116
16117impl LungeExerciseName {
16118    /// Snake-case canonical name from Profile.xlsx.
16119    pub fn as_str(&self) -> &'static str {
16120        match self {
16121            LungeExerciseName::OverheadLunge => "overhead_lunge",
16122            LungeExerciseName::LungeMatrix => "lunge_matrix",
16123            LungeExerciseName::WeightedLungeMatrix => "weighted_lunge_matrix",
16124            LungeExerciseName::AlternatingBarbellForwardLunge => {
16125                "alternating_barbell_forward_lunge"
16126            }
16127            LungeExerciseName::AlternatingDumbbellLungeWithReach => {
16128                "alternating_dumbbell_lunge_with_reach"
16129            }
16130            LungeExerciseName::BackFootElevatedDumbbellSplitSquat => {
16131                "back_foot_elevated_dumbbell_split_squat"
16132            }
16133            LungeExerciseName::BarbellBoxLunge => "barbell_box_lunge",
16134            LungeExerciseName::BarbellBulgarianSplitSquat => "barbell_bulgarian_split_squat",
16135            LungeExerciseName::BarbellCrossoverLunge => "barbell_crossover_lunge",
16136            LungeExerciseName::BarbellFrontSplitSquat => "barbell_front_split_squat",
16137            LungeExerciseName::BarbellLunge => "barbell_lunge",
16138            LungeExerciseName::BarbellReverseLunge => "barbell_reverse_lunge",
16139            LungeExerciseName::BarbellSideLunge => "barbell_side_lunge",
16140            LungeExerciseName::BarbellSplitSquat => "barbell_split_squat",
16141            LungeExerciseName::CoreControlRearLunge => "core_control_rear_lunge",
16142            LungeExerciseName::DiagonalLunge => "diagonal_lunge",
16143            LungeExerciseName::DropLunge => "drop_lunge",
16144            LungeExerciseName::DumbbellBoxLunge => "dumbbell_box_lunge",
16145            LungeExerciseName::DumbbellBulgarianSplitSquat => "dumbbell_bulgarian_split_squat",
16146            LungeExerciseName::DumbbellCrossoverLunge => "dumbbell_crossover_lunge",
16147            LungeExerciseName::DumbbellDiagonalLunge => "dumbbell_diagonal_lunge",
16148            LungeExerciseName::DumbbellLunge => "dumbbell_lunge",
16149            LungeExerciseName::DumbbellLungeAndRotation => "dumbbell_lunge_and_rotation",
16150            LungeExerciseName::DumbbellOverheadBulgarianSplitSquat => {
16151                "dumbbell_overhead_bulgarian_split_squat"
16152            }
16153            LungeExerciseName::DumbbellReverseLungeToHighKneeAndPress => {
16154                "dumbbell_reverse_lunge_to_high_knee_and_press"
16155            }
16156            LungeExerciseName::DumbbellSideLunge => "dumbbell_side_lunge",
16157            LungeExerciseName::ElevatedFrontFootBarbellSplitSquat => {
16158                "elevated_front_foot_barbell_split_squat"
16159            }
16160            LungeExerciseName::FrontFootElevatedDumbbellSplitSquat => {
16161                "front_foot_elevated_dumbbell_split_squat"
16162            }
16163            LungeExerciseName::GunslingerLunge => "gunslinger_lunge",
16164            LungeExerciseName::LawnmowerLunge => "lawnmower_lunge",
16165            LungeExerciseName::LowLungeWithIsometricAdduction => {
16166                "low_lunge_with_isometric_adduction"
16167            }
16168            LungeExerciseName::LowSideToSideLunge => "low_side_to_side_lunge",
16169            LungeExerciseName::Lunge => "lunge",
16170            LungeExerciseName::WeightedLunge => "weighted_lunge",
16171            LungeExerciseName::LungeWithArmReach => "lunge_with_arm_reach",
16172            LungeExerciseName::LungeWithDiagonalReach => "lunge_with_diagonal_reach",
16173            LungeExerciseName::LungeWithSideBend => "lunge_with_side_bend",
16174            LungeExerciseName::OffsetDumbbellLunge => "offset_dumbbell_lunge",
16175            LungeExerciseName::OffsetDumbbellReverseLunge => "offset_dumbbell_reverse_lunge",
16176            LungeExerciseName::OverheadBulgarianSplitSquat => "overhead_bulgarian_split_squat",
16177            LungeExerciseName::OverheadDumbbellReverseLunge => "overhead_dumbbell_reverse_lunge",
16178            LungeExerciseName::OverheadDumbbellSplitSquat => "overhead_dumbbell_split_squat",
16179            LungeExerciseName::OverheadLungeWithRotation => "overhead_lunge_with_rotation",
16180            LungeExerciseName::ReverseBarbellBoxLunge => "reverse_barbell_box_lunge",
16181            LungeExerciseName::ReverseBoxLunge => "reverse_box_lunge",
16182            LungeExerciseName::ReverseDumbbellBoxLunge => "reverse_dumbbell_box_lunge",
16183            LungeExerciseName::ReverseDumbbellCrossoverLunge => "reverse_dumbbell_crossover_lunge",
16184            LungeExerciseName::ReverseDumbbellDiagonalLunge => "reverse_dumbbell_diagonal_lunge",
16185            LungeExerciseName::ReverseLungeWithReachBack => "reverse_lunge_with_reach_back",
16186            LungeExerciseName::WeightedReverseLungeWithReachBack => {
16187                "weighted_reverse_lunge_with_reach_back"
16188            }
16189            LungeExerciseName::ReverseLungeWithTwistAndOverheadReach => {
16190                "reverse_lunge_with_twist_and_overhead_reach"
16191            }
16192            LungeExerciseName::WeightedReverseLungeWithTwistAndOverheadReach => {
16193                "weighted_reverse_lunge_with_twist_and_overhead_reach"
16194            }
16195            LungeExerciseName::ReverseSlidingBoxLunge => "reverse_sliding_box_lunge",
16196            LungeExerciseName::WeightedReverseSlidingBoxLunge => {
16197                "weighted_reverse_sliding_box_lunge"
16198            }
16199            LungeExerciseName::ReverseSlidingLunge => "reverse_sliding_lunge",
16200            LungeExerciseName::WeightedReverseSlidingLunge => "weighted_reverse_sliding_lunge",
16201            LungeExerciseName::RunnersLungeToBalance => "runners_lunge_to_balance",
16202            LungeExerciseName::WeightedRunnersLungeToBalance => "weighted_runners_lunge_to_balance",
16203            LungeExerciseName::ShiftingSideLunge => "shifting_side_lunge",
16204            LungeExerciseName::SideAndCrossoverLunge => "side_and_crossover_lunge",
16205            LungeExerciseName::WeightedSideAndCrossoverLunge => "weighted_side_and_crossover_lunge",
16206            LungeExerciseName::SideLunge => "side_lunge",
16207            LungeExerciseName::WeightedSideLunge => "weighted_side_lunge",
16208            LungeExerciseName::SideLungeAndPress => "side_lunge_and_press",
16209            LungeExerciseName::SideLungeJumpOff => "side_lunge_jump_off",
16210            LungeExerciseName::SideLungeSweep => "side_lunge_sweep",
16211            LungeExerciseName::WeightedSideLungeSweep => "weighted_side_lunge_sweep",
16212            LungeExerciseName::SideLungeToCrossoverTap => "side_lunge_to_crossover_tap",
16213            LungeExerciseName::WeightedSideLungeToCrossoverTap => {
16214                "weighted_side_lunge_to_crossover_tap"
16215            }
16216            LungeExerciseName::SideToSideLungeChops => "side_to_side_lunge_chops",
16217            LungeExerciseName::WeightedSideToSideLungeChops => "weighted_side_to_side_lunge_chops",
16218            LungeExerciseName::SiffJumpLunge => "siff_jump_lunge",
16219            LungeExerciseName::WeightedSiffJumpLunge => "weighted_siff_jump_lunge",
16220            LungeExerciseName::SingleArmReverseLungeAndPress => {
16221                "single_arm_reverse_lunge_and_press"
16222            }
16223            LungeExerciseName::SlidingLateralLunge => "sliding_lateral_lunge",
16224            LungeExerciseName::WeightedSlidingLateralLunge => "weighted_sliding_lateral_lunge",
16225            LungeExerciseName::WalkingBarbellLunge => "walking_barbell_lunge",
16226            LungeExerciseName::WalkingDumbbellLunge => "walking_dumbbell_lunge",
16227            LungeExerciseName::WalkingLunge => "walking_lunge",
16228            LungeExerciseName::WeightedWalkingLunge => "weighted_walking_lunge",
16229            LungeExerciseName::WideGripOverheadBarbellSplitSquat => {
16230                "wide_grip_overhead_barbell_split_squat"
16231            }
16232            LungeExerciseName::AlternatingDumbbellLunge => "alternating_dumbbell_lunge",
16233            LungeExerciseName::DumbbellReverseLunge => "dumbbell_reverse_lunge",
16234            LungeExerciseName::OverheadDumbbellLunge => "overhead_dumbbell_lunge",
16235            LungeExerciseName::ScissorPowerSwitch => "scissor_power_switch",
16236            LungeExerciseName::DumbbellOverheadWalkingLunge => "dumbbell_overhead_walking_lunge",
16237            LungeExerciseName::CurtsyLunge => "curtsy_lunge",
16238            LungeExerciseName::WeightedCurtsyLunge => "weighted_curtsy_lunge",
16239            LungeExerciseName::WeightedShiftingSideLunge => "weighted_shifting_side_lunge",
16240            LungeExerciseName::WeightedSideLungeAndPress => "weighted_side_lunge_and_press",
16241            LungeExerciseName::WeightedSideLungeJumpOff => "weighted_side_lunge_jump_off",
16242        }
16243    }
16244
16245    /// Try to construct from the underlying numeric value.
16246    pub fn from_value(value: u16) -> Option<Self> {
16247        match value {
16248            0 => Some(LungeExerciseName::OverheadLunge),
16249            1 => Some(LungeExerciseName::LungeMatrix),
16250            2 => Some(LungeExerciseName::WeightedLungeMatrix),
16251            3 => Some(LungeExerciseName::AlternatingBarbellForwardLunge),
16252            4 => Some(LungeExerciseName::AlternatingDumbbellLungeWithReach),
16253            5 => Some(LungeExerciseName::BackFootElevatedDumbbellSplitSquat),
16254            6 => Some(LungeExerciseName::BarbellBoxLunge),
16255            7 => Some(LungeExerciseName::BarbellBulgarianSplitSquat),
16256            8 => Some(LungeExerciseName::BarbellCrossoverLunge),
16257            9 => Some(LungeExerciseName::BarbellFrontSplitSquat),
16258            10 => Some(LungeExerciseName::BarbellLunge),
16259            11 => Some(LungeExerciseName::BarbellReverseLunge),
16260            12 => Some(LungeExerciseName::BarbellSideLunge),
16261            13 => Some(LungeExerciseName::BarbellSplitSquat),
16262            14 => Some(LungeExerciseName::CoreControlRearLunge),
16263            15 => Some(LungeExerciseName::DiagonalLunge),
16264            16 => Some(LungeExerciseName::DropLunge),
16265            17 => Some(LungeExerciseName::DumbbellBoxLunge),
16266            18 => Some(LungeExerciseName::DumbbellBulgarianSplitSquat),
16267            19 => Some(LungeExerciseName::DumbbellCrossoverLunge),
16268            20 => Some(LungeExerciseName::DumbbellDiagonalLunge),
16269            21 => Some(LungeExerciseName::DumbbellLunge),
16270            22 => Some(LungeExerciseName::DumbbellLungeAndRotation),
16271            23 => Some(LungeExerciseName::DumbbellOverheadBulgarianSplitSquat),
16272            24 => Some(LungeExerciseName::DumbbellReverseLungeToHighKneeAndPress),
16273            25 => Some(LungeExerciseName::DumbbellSideLunge),
16274            26 => Some(LungeExerciseName::ElevatedFrontFootBarbellSplitSquat),
16275            27 => Some(LungeExerciseName::FrontFootElevatedDumbbellSplitSquat),
16276            28 => Some(LungeExerciseName::GunslingerLunge),
16277            29 => Some(LungeExerciseName::LawnmowerLunge),
16278            30 => Some(LungeExerciseName::LowLungeWithIsometricAdduction),
16279            31 => Some(LungeExerciseName::LowSideToSideLunge),
16280            32 => Some(LungeExerciseName::Lunge),
16281            33 => Some(LungeExerciseName::WeightedLunge),
16282            34 => Some(LungeExerciseName::LungeWithArmReach),
16283            35 => Some(LungeExerciseName::LungeWithDiagonalReach),
16284            36 => Some(LungeExerciseName::LungeWithSideBend),
16285            37 => Some(LungeExerciseName::OffsetDumbbellLunge),
16286            38 => Some(LungeExerciseName::OffsetDumbbellReverseLunge),
16287            39 => Some(LungeExerciseName::OverheadBulgarianSplitSquat),
16288            40 => Some(LungeExerciseName::OverheadDumbbellReverseLunge),
16289            41 => Some(LungeExerciseName::OverheadDumbbellSplitSquat),
16290            42 => Some(LungeExerciseName::OverheadLungeWithRotation),
16291            43 => Some(LungeExerciseName::ReverseBarbellBoxLunge),
16292            44 => Some(LungeExerciseName::ReverseBoxLunge),
16293            45 => Some(LungeExerciseName::ReverseDumbbellBoxLunge),
16294            46 => Some(LungeExerciseName::ReverseDumbbellCrossoverLunge),
16295            47 => Some(LungeExerciseName::ReverseDumbbellDiagonalLunge),
16296            48 => Some(LungeExerciseName::ReverseLungeWithReachBack),
16297            49 => Some(LungeExerciseName::WeightedReverseLungeWithReachBack),
16298            50 => Some(LungeExerciseName::ReverseLungeWithTwistAndOverheadReach),
16299            51 => Some(LungeExerciseName::WeightedReverseLungeWithTwistAndOverheadReach),
16300            52 => Some(LungeExerciseName::ReverseSlidingBoxLunge),
16301            53 => Some(LungeExerciseName::WeightedReverseSlidingBoxLunge),
16302            54 => Some(LungeExerciseName::ReverseSlidingLunge),
16303            55 => Some(LungeExerciseName::WeightedReverseSlidingLunge),
16304            56 => Some(LungeExerciseName::RunnersLungeToBalance),
16305            57 => Some(LungeExerciseName::WeightedRunnersLungeToBalance),
16306            58 => Some(LungeExerciseName::ShiftingSideLunge),
16307            59 => Some(LungeExerciseName::SideAndCrossoverLunge),
16308            60 => Some(LungeExerciseName::WeightedSideAndCrossoverLunge),
16309            61 => Some(LungeExerciseName::SideLunge),
16310            62 => Some(LungeExerciseName::WeightedSideLunge),
16311            63 => Some(LungeExerciseName::SideLungeAndPress),
16312            64 => Some(LungeExerciseName::SideLungeJumpOff),
16313            65 => Some(LungeExerciseName::SideLungeSweep),
16314            66 => Some(LungeExerciseName::WeightedSideLungeSweep),
16315            67 => Some(LungeExerciseName::SideLungeToCrossoverTap),
16316            68 => Some(LungeExerciseName::WeightedSideLungeToCrossoverTap),
16317            69 => Some(LungeExerciseName::SideToSideLungeChops),
16318            70 => Some(LungeExerciseName::WeightedSideToSideLungeChops),
16319            71 => Some(LungeExerciseName::SiffJumpLunge),
16320            72 => Some(LungeExerciseName::WeightedSiffJumpLunge),
16321            73 => Some(LungeExerciseName::SingleArmReverseLungeAndPress),
16322            74 => Some(LungeExerciseName::SlidingLateralLunge),
16323            75 => Some(LungeExerciseName::WeightedSlidingLateralLunge),
16324            76 => Some(LungeExerciseName::WalkingBarbellLunge),
16325            77 => Some(LungeExerciseName::WalkingDumbbellLunge),
16326            78 => Some(LungeExerciseName::WalkingLunge),
16327            79 => Some(LungeExerciseName::WeightedWalkingLunge),
16328            80 => Some(LungeExerciseName::WideGripOverheadBarbellSplitSquat),
16329            81 => Some(LungeExerciseName::AlternatingDumbbellLunge),
16330            82 => Some(LungeExerciseName::DumbbellReverseLunge),
16331            83 => Some(LungeExerciseName::OverheadDumbbellLunge),
16332            84 => Some(LungeExerciseName::ScissorPowerSwitch),
16333            85 => Some(LungeExerciseName::DumbbellOverheadWalkingLunge),
16334            86 => Some(LungeExerciseName::CurtsyLunge),
16335            87 => Some(LungeExerciseName::WeightedCurtsyLunge),
16336            88 => Some(LungeExerciseName::WeightedShiftingSideLunge),
16337            89 => Some(LungeExerciseName::WeightedSideLungeAndPress),
16338            90 => Some(LungeExerciseName::WeightedSideLungeJumpOff),
16339            _ => None,
16340        }
16341    }
16342
16343    /// Try to construct from the snake-case canonical name.
16344    pub fn from_str(name: &str) -> Option<Self> {
16345        match name {
16346            "overhead_lunge" => Some(LungeExerciseName::OverheadLunge),
16347            "lunge_matrix" => Some(LungeExerciseName::LungeMatrix),
16348            "weighted_lunge_matrix" => Some(LungeExerciseName::WeightedLungeMatrix),
16349            "alternating_barbell_forward_lunge" => {
16350                Some(LungeExerciseName::AlternatingBarbellForwardLunge)
16351            }
16352            "alternating_dumbbell_lunge_with_reach" => {
16353                Some(LungeExerciseName::AlternatingDumbbellLungeWithReach)
16354            }
16355            "back_foot_elevated_dumbbell_split_squat" => {
16356                Some(LungeExerciseName::BackFootElevatedDumbbellSplitSquat)
16357            }
16358            "barbell_box_lunge" => Some(LungeExerciseName::BarbellBoxLunge),
16359            "barbell_bulgarian_split_squat" => Some(LungeExerciseName::BarbellBulgarianSplitSquat),
16360            "barbell_crossover_lunge" => Some(LungeExerciseName::BarbellCrossoverLunge),
16361            "barbell_front_split_squat" => Some(LungeExerciseName::BarbellFrontSplitSquat),
16362            "barbell_lunge" => Some(LungeExerciseName::BarbellLunge),
16363            "barbell_reverse_lunge" => Some(LungeExerciseName::BarbellReverseLunge),
16364            "barbell_side_lunge" => Some(LungeExerciseName::BarbellSideLunge),
16365            "barbell_split_squat" => Some(LungeExerciseName::BarbellSplitSquat),
16366            "core_control_rear_lunge" => Some(LungeExerciseName::CoreControlRearLunge),
16367            "diagonal_lunge" => Some(LungeExerciseName::DiagonalLunge),
16368            "drop_lunge" => Some(LungeExerciseName::DropLunge),
16369            "dumbbell_box_lunge" => Some(LungeExerciseName::DumbbellBoxLunge),
16370            "dumbbell_bulgarian_split_squat" => {
16371                Some(LungeExerciseName::DumbbellBulgarianSplitSquat)
16372            }
16373            "dumbbell_crossover_lunge" => Some(LungeExerciseName::DumbbellCrossoverLunge),
16374            "dumbbell_diagonal_lunge" => Some(LungeExerciseName::DumbbellDiagonalLunge),
16375            "dumbbell_lunge" => Some(LungeExerciseName::DumbbellLunge),
16376            "dumbbell_lunge_and_rotation" => Some(LungeExerciseName::DumbbellLungeAndRotation),
16377            "dumbbell_overhead_bulgarian_split_squat" => {
16378                Some(LungeExerciseName::DumbbellOverheadBulgarianSplitSquat)
16379            }
16380            "dumbbell_reverse_lunge_to_high_knee_and_press" => {
16381                Some(LungeExerciseName::DumbbellReverseLungeToHighKneeAndPress)
16382            }
16383            "dumbbell_side_lunge" => Some(LungeExerciseName::DumbbellSideLunge),
16384            "elevated_front_foot_barbell_split_squat" => {
16385                Some(LungeExerciseName::ElevatedFrontFootBarbellSplitSquat)
16386            }
16387            "front_foot_elevated_dumbbell_split_squat" => {
16388                Some(LungeExerciseName::FrontFootElevatedDumbbellSplitSquat)
16389            }
16390            "gunslinger_lunge" => Some(LungeExerciseName::GunslingerLunge),
16391            "lawnmower_lunge" => Some(LungeExerciseName::LawnmowerLunge),
16392            "low_lunge_with_isometric_adduction" => {
16393                Some(LungeExerciseName::LowLungeWithIsometricAdduction)
16394            }
16395            "low_side_to_side_lunge" => Some(LungeExerciseName::LowSideToSideLunge),
16396            "lunge" => Some(LungeExerciseName::Lunge),
16397            "weighted_lunge" => Some(LungeExerciseName::WeightedLunge),
16398            "lunge_with_arm_reach" => Some(LungeExerciseName::LungeWithArmReach),
16399            "lunge_with_diagonal_reach" => Some(LungeExerciseName::LungeWithDiagonalReach),
16400            "lunge_with_side_bend" => Some(LungeExerciseName::LungeWithSideBend),
16401            "offset_dumbbell_lunge" => Some(LungeExerciseName::OffsetDumbbellLunge),
16402            "offset_dumbbell_reverse_lunge" => Some(LungeExerciseName::OffsetDumbbellReverseLunge),
16403            "overhead_bulgarian_split_squat" => {
16404                Some(LungeExerciseName::OverheadBulgarianSplitSquat)
16405            }
16406            "overhead_dumbbell_reverse_lunge" => {
16407                Some(LungeExerciseName::OverheadDumbbellReverseLunge)
16408            }
16409            "overhead_dumbbell_split_squat" => Some(LungeExerciseName::OverheadDumbbellSplitSquat),
16410            "overhead_lunge_with_rotation" => Some(LungeExerciseName::OverheadLungeWithRotation),
16411            "reverse_barbell_box_lunge" => Some(LungeExerciseName::ReverseBarbellBoxLunge),
16412            "reverse_box_lunge" => Some(LungeExerciseName::ReverseBoxLunge),
16413            "reverse_dumbbell_box_lunge" => Some(LungeExerciseName::ReverseDumbbellBoxLunge),
16414            "reverse_dumbbell_crossover_lunge" => {
16415                Some(LungeExerciseName::ReverseDumbbellCrossoverLunge)
16416            }
16417            "reverse_dumbbell_diagonal_lunge" => {
16418                Some(LungeExerciseName::ReverseDumbbellDiagonalLunge)
16419            }
16420            "reverse_lunge_with_reach_back" => Some(LungeExerciseName::ReverseLungeWithReachBack),
16421            "weighted_reverse_lunge_with_reach_back" => {
16422                Some(LungeExerciseName::WeightedReverseLungeWithReachBack)
16423            }
16424            "reverse_lunge_with_twist_and_overhead_reach" => {
16425                Some(LungeExerciseName::ReverseLungeWithTwistAndOverheadReach)
16426            }
16427            "weighted_reverse_lunge_with_twist_and_overhead_reach" => {
16428                Some(LungeExerciseName::WeightedReverseLungeWithTwistAndOverheadReach)
16429            }
16430            "reverse_sliding_box_lunge" => Some(LungeExerciseName::ReverseSlidingBoxLunge),
16431            "weighted_reverse_sliding_box_lunge" => {
16432                Some(LungeExerciseName::WeightedReverseSlidingBoxLunge)
16433            }
16434            "reverse_sliding_lunge" => Some(LungeExerciseName::ReverseSlidingLunge),
16435            "weighted_reverse_sliding_lunge" => {
16436                Some(LungeExerciseName::WeightedReverseSlidingLunge)
16437            }
16438            "runners_lunge_to_balance" => Some(LungeExerciseName::RunnersLungeToBalance),
16439            "weighted_runners_lunge_to_balance" => {
16440                Some(LungeExerciseName::WeightedRunnersLungeToBalance)
16441            }
16442            "shifting_side_lunge" => Some(LungeExerciseName::ShiftingSideLunge),
16443            "side_and_crossover_lunge" => Some(LungeExerciseName::SideAndCrossoverLunge),
16444            "weighted_side_and_crossover_lunge" => {
16445                Some(LungeExerciseName::WeightedSideAndCrossoverLunge)
16446            }
16447            "side_lunge" => Some(LungeExerciseName::SideLunge),
16448            "weighted_side_lunge" => Some(LungeExerciseName::WeightedSideLunge),
16449            "side_lunge_and_press" => Some(LungeExerciseName::SideLungeAndPress),
16450            "side_lunge_jump_off" => Some(LungeExerciseName::SideLungeJumpOff),
16451            "side_lunge_sweep" => Some(LungeExerciseName::SideLungeSweep),
16452            "weighted_side_lunge_sweep" => Some(LungeExerciseName::WeightedSideLungeSweep),
16453            "side_lunge_to_crossover_tap" => Some(LungeExerciseName::SideLungeToCrossoverTap),
16454            "weighted_side_lunge_to_crossover_tap" => {
16455                Some(LungeExerciseName::WeightedSideLungeToCrossoverTap)
16456            }
16457            "side_to_side_lunge_chops" => Some(LungeExerciseName::SideToSideLungeChops),
16458            "weighted_side_to_side_lunge_chops" => {
16459                Some(LungeExerciseName::WeightedSideToSideLungeChops)
16460            }
16461            "siff_jump_lunge" => Some(LungeExerciseName::SiffJumpLunge),
16462            "weighted_siff_jump_lunge" => Some(LungeExerciseName::WeightedSiffJumpLunge),
16463            "single_arm_reverse_lunge_and_press" => {
16464                Some(LungeExerciseName::SingleArmReverseLungeAndPress)
16465            }
16466            "sliding_lateral_lunge" => Some(LungeExerciseName::SlidingLateralLunge),
16467            "weighted_sliding_lateral_lunge" => {
16468                Some(LungeExerciseName::WeightedSlidingLateralLunge)
16469            }
16470            "walking_barbell_lunge" => Some(LungeExerciseName::WalkingBarbellLunge),
16471            "walking_dumbbell_lunge" => Some(LungeExerciseName::WalkingDumbbellLunge),
16472            "walking_lunge" => Some(LungeExerciseName::WalkingLunge),
16473            "weighted_walking_lunge" => Some(LungeExerciseName::WeightedWalkingLunge),
16474            "wide_grip_overhead_barbell_split_squat" => {
16475                Some(LungeExerciseName::WideGripOverheadBarbellSplitSquat)
16476            }
16477            "alternating_dumbbell_lunge" => Some(LungeExerciseName::AlternatingDumbbellLunge),
16478            "dumbbell_reverse_lunge" => Some(LungeExerciseName::DumbbellReverseLunge),
16479            "overhead_dumbbell_lunge" => Some(LungeExerciseName::OverheadDumbbellLunge),
16480            "scissor_power_switch" => Some(LungeExerciseName::ScissorPowerSwitch),
16481            "dumbbell_overhead_walking_lunge" => {
16482                Some(LungeExerciseName::DumbbellOverheadWalkingLunge)
16483            }
16484            "curtsy_lunge" => Some(LungeExerciseName::CurtsyLunge),
16485            "weighted_curtsy_lunge" => Some(LungeExerciseName::WeightedCurtsyLunge),
16486            "weighted_shifting_side_lunge" => Some(LungeExerciseName::WeightedShiftingSideLunge),
16487            "weighted_side_lunge_and_press" => Some(LungeExerciseName::WeightedSideLungeAndPress),
16488            "weighted_side_lunge_jump_off" => Some(LungeExerciseName::WeightedSideLungeJumpOff),
16489            _ => None,
16490        }
16491    }
16492}
16493
16494#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
16495#[repr(u16)]
16496#[non_exhaustive]
16497pub enum OlympicLiftExerciseName {
16498    BarbellHangPowerClean = 0,
16499    BarbellHangSquatClean = 1,
16500    BarbellPowerClean = 2,
16501    BarbellPowerSnatch = 3,
16502    BarbellSquatClean = 4,
16503    CleanAndJerk = 5,
16504    BarbellHangPowerSnatch = 6,
16505    BarbellHangPull = 7,
16506    BarbellHighPull = 8,
16507    BarbellSnatch = 9,
16508    BarbellSplitJerk = 10,
16509    Clean = 11,
16510    DumbbellClean = 12,
16511    DumbbellHangPull = 13,
16512    OneHandDumbbellSplitSnatch = 14,
16513    PushJerk = 15,
16514    SingleArmDumbbellSnatch = 16,
16515    SingleArmHangSnatch = 17,
16516    SingleArmKettlebellSnatch = 18,
16517    SplitJerk = 19,
16518    SquatCleanAndJerk = 20,
16519    DumbbellHangSnatch = 21,
16520    DumbbellPowerCleanAndJerk = 22,
16521    DumbbellPowerCleanAndPushPress = 23,
16522    DumbbellPowerCleanAndStrictPress = 24,
16523    DumbbellSnatch = 25,
16524    MedicineBallClean = 26,
16525    CleanAndPress = 27,
16526    Snatch = 28,
16527}
16528
16529impl OlympicLiftExerciseName {
16530    /// Snake-case canonical name from Profile.xlsx.
16531    pub fn as_str(&self) -> &'static str {
16532        match self {
16533            OlympicLiftExerciseName::BarbellHangPowerClean => "barbell_hang_power_clean",
16534            OlympicLiftExerciseName::BarbellHangSquatClean => "barbell_hang_squat_clean",
16535            OlympicLiftExerciseName::BarbellPowerClean => "barbell_power_clean",
16536            OlympicLiftExerciseName::BarbellPowerSnatch => "barbell_power_snatch",
16537            OlympicLiftExerciseName::BarbellSquatClean => "barbell_squat_clean",
16538            OlympicLiftExerciseName::CleanAndJerk => "clean_and_jerk",
16539            OlympicLiftExerciseName::BarbellHangPowerSnatch => "barbell_hang_power_snatch",
16540            OlympicLiftExerciseName::BarbellHangPull => "barbell_hang_pull",
16541            OlympicLiftExerciseName::BarbellHighPull => "barbell_high_pull",
16542            OlympicLiftExerciseName::BarbellSnatch => "barbell_snatch",
16543            OlympicLiftExerciseName::BarbellSplitJerk => "barbell_split_jerk",
16544            OlympicLiftExerciseName::Clean => "clean",
16545            OlympicLiftExerciseName::DumbbellClean => "dumbbell_clean",
16546            OlympicLiftExerciseName::DumbbellHangPull => "dumbbell_hang_pull",
16547            OlympicLiftExerciseName::OneHandDumbbellSplitSnatch => "one_hand_dumbbell_split_snatch",
16548            OlympicLiftExerciseName::PushJerk => "push_jerk",
16549            OlympicLiftExerciseName::SingleArmDumbbellSnatch => "single_arm_dumbbell_snatch",
16550            OlympicLiftExerciseName::SingleArmHangSnatch => "single_arm_hang_snatch",
16551            OlympicLiftExerciseName::SingleArmKettlebellSnatch => "single_arm_kettlebell_snatch",
16552            OlympicLiftExerciseName::SplitJerk => "split_jerk",
16553            OlympicLiftExerciseName::SquatCleanAndJerk => "squat_clean_and_jerk",
16554            OlympicLiftExerciseName::DumbbellHangSnatch => "dumbbell_hang_snatch",
16555            OlympicLiftExerciseName::DumbbellPowerCleanAndJerk => "dumbbell_power_clean_and_jerk",
16556            OlympicLiftExerciseName::DumbbellPowerCleanAndPushPress => {
16557                "dumbbell_power_clean_and_push_press"
16558            }
16559            OlympicLiftExerciseName::DumbbellPowerCleanAndStrictPress => {
16560                "dumbbell_power_clean_and_strict_press"
16561            }
16562            OlympicLiftExerciseName::DumbbellSnatch => "dumbbell_snatch",
16563            OlympicLiftExerciseName::MedicineBallClean => "medicine_ball_clean",
16564            OlympicLiftExerciseName::CleanAndPress => "clean_and_press",
16565            OlympicLiftExerciseName::Snatch => "snatch",
16566        }
16567    }
16568
16569    /// Try to construct from the underlying numeric value.
16570    pub fn from_value(value: u16) -> Option<Self> {
16571        match value {
16572            0 => Some(OlympicLiftExerciseName::BarbellHangPowerClean),
16573            1 => Some(OlympicLiftExerciseName::BarbellHangSquatClean),
16574            2 => Some(OlympicLiftExerciseName::BarbellPowerClean),
16575            3 => Some(OlympicLiftExerciseName::BarbellPowerSnatch),
16576            4 => Some(OlympicLiftExerciseName::BarbellSquatClean),
16577            5 => Some(OlympicLiftExerciseName::CleanAndJerk),
16578            6 => Some(OlympicLiftExerciseName::BarbellHangPowerSnatch),
16579            7 => Some(OlympicLiftExerciseName::BarbellHangPull),
16580            8 => Some(OlympicLiftExerciseName::BarbellHighPull),
16581            9 => Some(OlympicLiftExerciseName::BarbellSnatch),
16582            10 => Some(OlympicLiftExerciseName::BarbellSplitJerk),
16583            11 => Some(OlympicLiftExerciseName::Clean),
16584            12 => Some(OlympicLiftExerciseName::DumbbellClean),
16585            13 => Some(OlympicLiftExerciseName::DumbbellHangPull),
16586            14 => Some(OlympicLiftExerciseName::OneHandDumbbellSplitSnatch),
16587            15 => Some(OlympicLiftExerciseName::PushJerk),
16588            16 => Some(OlympicLiftExerciseName::SingleArmDumbbellSnatch),
16589            17 => Some(OlympicLiftExerciseName::SingleArmHangSnatch),
16590            18 => Some(OlympicLiftExerciseName::SingleArmKettlebellSnatch),
16591            19 => Some(OlympicLiftExerciseName::SplitJerk),
16592            20 => Some(OlympicLiftExerciseName::SquatCleanAndJerk),
16593            21 => Some(OlympicLiftExerciseName::DumbbellHangSnatch),
16594            22 => Some(OlympicLiftExerciseName::DumbbellPowerCleanAndJerk),
16595            23 => Some(OlympicLiftExerciseName::DumbbellPowerCleanAndPushPress),
16596            24 => Some(OlympicLiftExerciseName::DumbbellPowerCleanAndStrictPress),
16597            25 => Some(OlympicLiftExerciseName::DumbbellSnatch),
16598            26 => Some(OlympicLiftExerciseName::MedicineBallClean),
16599            27 => Some(OlympicLiftExerciseName::CleanAndPress),
16600            28 => Some(OlympicLiftExerciseName::Snatch),
16601            _ => None,
16602        }
16603    }
16604
16605    /// Try to construct from the snake-case canonical name.
16606    pub fn from_str(name: &str) -> Option<Self> {
16607        match name {
16608            "barbell_hang_power_clean" => Some(OlympicLiftExerciseName::BarbellHangPowerClean),
16609            "barbell_hang_squat_clean" => Some(OlympicLiftExerciseName::BarbellHangSquatClean),
16610            "barbell_power_clean" => Some(OlympicLiftExerciseName::BarbellPowerClean),
16611            "barbell_power_snatch" => Some(OlympicLiftExerciseName::BarbellPowerSnatch),
16612            "barbell_squat_clean" => Some(OlympicLiftExerciseName::BarbellSquatClean),
16613            "clean_and_jerk" => Some(OlympicLiftExerciseName::CleanAndJerk),
16614            "barbell_hang_power_snatch" => Some(OlympicLiftExerciseName::BarbellHangPowerSnatch),
16615            "barbell_hang_pull" => Some(OlympicLiftExerciseName::BarbellHangPull),
16616            "barbell_high_pull" => Some(OlympicLiftExerciseName::BarbellHighPull),
16617            "barbell_snatch" => Some(OlympicLiftExerciseName::BarbellSnatch),
16618            "barbell_split_jerk" => Some(OlympicLiftExerciseName::BarbellSplitJerk),
16619            "clean" => Some(OlympicLiftExerciseName::Clean),
16620            "dumbbell_clean" => Some(OlympicLiftExerciseName::DumbbellClean),
16621            "dumbbell_hang_pull" => Some(OlympicLiftExerciseName::DumbbellHangPull),
16622            "one_hand_dumbbell_split_snatch" => {
16623                Some(OlympicLiftExerciseName::OneHandDumbbellSplitSnatch)
16624            }
16625            "push_jerk" => Some(OlympicLiftExerciseName::PushJerk),
16626            "single_arm_dumbbell_snatch" => Some(OlympicLiftExerciseName::SingleArmDumbbellSnatch),
16627            "single_arm_hang_snatch" => Some(OlympicLiftExerciseName::SingleArmHangSnatch),
16628            "single_arm_kettlebell_snatch" => {
16629                Some(OlympicLiftExerciseName::SingleArmKettlebellSnatch)
16630            }
16631            "split_jerk" => Some(OlympicLiftExerciseName::SplitJerk),
16632            "squat_clean_and_jerk" => Some(OlympicLiftExerciseName::SquatCleanAndJerk),
16633            "dumbbell_hang_snatch" => Some(OlympicLiftExerciseName::DumbbellHangSnatch),
16634            "dumbbell_power_clean_and_jerk" => {
16635                Some(OlympicLiftExerciseName::DumbbellPowerCleanAndJerk)
16636            }
16637            "dumbbell_power_clean_and_push_press" => {
16638                Some(OlympicLiftExerciseName::DumbbellPowerCleanAndPushPress)
16639            }
16640            "dumbbell_power_clean_and_strict_press" => {
16641                Some(OlympicLiftExerciseName::DumbbellPowerCleanAndStrictPress)
16642            }
16643            "dumbbell_snatch" => Some(OlympicLiftExerciseName::DumbbellSnatch),
16644            "medicine_ball_clean" => Some(OlympicLiftExerciseName::MedicineBallClean),
16645            "clean_and_press" => Some(OlympicLiftExerciseName::CleanAndPress),
16646            "snatch" => Some(OlympicLiftExerciseName::Snatch),
16647            _ => None,
16648        }
16649    }
16650}
16651
16652#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
16653#[repr(u16)]
16654#[non_exhaustive]
16655pub enum PlankExerciseName {
16656    _45DegreePlank = 0,
16657    Weighted45DegreePlank = 1,
16658    _90DegreeStaticHold = 2,
16659    Weighted90DegreeStaticHold = 3,
16660    BearCrawl = 4,
16661    WeightedBearCrawl = 5,
16662    CrossBodyMountainClimber = 6,
16663    WeightedCrossBodyMountainClimber = 7,
16664    ElbowPlankPikeJacks = 8,
16665    WeightedElbowPlankPikeJacks = 9,
16666    ElevatedFeetPlank = 10,
16667    WeightedElevatedFeetPlank = 11,
16668    ElevatorAbs = 12,
16669    WeightedElevatorAbs = 13,
16670    ExtendedPlank = 14,
16671    WeightedExtendedPlank = 15,
16672    FullPlankPasseTwist = 16,
16673    WeightedFullPlankPasseTwist = 17,
16674    InchingElbowPlank = 18,
16675    WeightedInchingElbowPlank = 19,
16676    InchwormToSidePlank = 20,
16677    WeightedInchwormToSidePlank = 21,
16678    KneelingPlank = 22,
16679    WeightedKneelingPlank = 23,
16680    KneelingSidePlankWithLegLift = 24,
16681    WeightedKneelingSidePlankWithLegLift = 25,
16682    LateralRoll = 26,
16683    WeightedLateralRoll = 27,
16684    LyingReversePlank = 28,
16685    WeightedLyingReversePlank = 29,
16686    MedicineBallMountainClimber = 30,
16687    WeightedMedicineBallMountainClimber = 31,
16688    ModifiedMountainClimberAndExtension = 32,
16689    WeightedModifiedMountainClimberAndExtension = 33,
16690    MountainClimber = 34,
16691    WeightedMountainClimber = 35,
16692    MountainClimberOnSlidingDiscs = 36,
16693    WeightedMountainClimberOnSlidingDiscs = 37,
16694    MountainClimberWithFeetOnBosuBall = 38,
16695    WeightedMountainClimberWithFeetOnBosuBall = 39,
16696    MountainClimberWithHandsOnBench = 40,
16697    MountainClimberWithHandsOnSwissBall = 41,
16698    WeightedMountainClimberWithHandsOnSwissBall = 42,
16699    Plank = 43,
16700    PlankJacksWithFeetOnSlidingDiscs = 44,
16701    WeightedPlankJacksWithFeetOnSlidingDiscs = 45,
16702    PlankKneeTwist = 46,
16703    WeightedPlankKneeTwist = 47,
16704    PlankPikeJumps = 48,
16705    WeightedPlankPikeJumps = 49,
16706    PlankPikes = 50,
16707    WeightedPlankPikes = 51,
16708    PlankToStandUp = 52,
16709    WeightedPlankToStandUp = 53,
16710    PlankWithArmRaise = 54,
16711    WeightedPlankWithArmRaise = 55,
16712    PlankWithKneeToElbow = 56,
16713    WeightedPlankWithKneeToElbow = 57,
16714    PlankWithObliqueCrunch = 58,
16715    WeightedPlankWithObliqueCrunch = 59,
16716    PlyometricSidePlank = 60,
16717    WeightedPlyometricSidePlank = 61,
16718    RollingSidePlank = 62,
16719    WeightedRollingSidePlank = 63,
16720    SideKickPlank = 64,
16721    WeightedSideKickPlank = 65,
16722    SidePlank = 66,
16723    WeightedSidePlank = 67,
16724    SidePlankAndRow = 68,
16725    WeightedSidePlankAndRow = 69,
16726    SidePlankLift = 70,
16727    WeightedSidePlankLift = 71,
16728    SidePlankWithElbowOnBosuBall = 72,
16729    WeightedSidePlankWithElbowOnBosuBall = 73,
16730    SidePlankWithFeetOnBench = 74,
16731    WeightedSidePlankWithFeetOnBench = 75,
16732    SidePlankWithKneeCircle = 76,
16733    WeightedSidePlankWithKneeCircle = 77,
16734    SidePlankWithKneeTuck = 78,
16735    WeightedSidePlankWithKneeTuck = 79,
16736    SidePlankWithLegLift = 80,
16737    WeightedSidePlankWithLegLift = 81,
16738    SidePlankWithReachUnder = 82,
16739    WeightedSidePlankWithReachUnder = 83,
16740    SingleLegElevatedFeetPlank = 84,
16741    WeightedSingleLegElevatedFeetPlank = 85,
16742    SingleLegFlexAndExtend = 86,
16743    WeightedSingleLegFlexAndExtend = 87,
16744    SingleLegSidePlank = 88,
16745    WeightedSingleLegSidePlank = 89,
16746    SpidermanPlank = 90,
16747    WeightedSpidermanPlank = 91,
16748    StraightArmPlank = 92,
16749    WeightedStraightArmPlank = 93,
16750    StraightArmPlankWithShoulderTouch = 94,
16751    WeightedStraightArmPlankWithShoulderTouch = 95,
16752    SwissBallPlank = 96,
16753    WeightedSwissBallPlank = 97,
16754    SwissBallPlankLegLift = 98,
16755    WeightedSwissBallPlankLegLift = 99,
16756    SwissBallPlankLegLiftAndHold = 100,
16757    SwissBallPlankWithFeetOnBench = 101,
16758    WeightedSwissBallPlankWithFeetOnBench = 102,
16759    SwissBallProneJackknife = 103,
16760    WeightedSwissBallProneJackknife = 104,
16761    SwissBallSidePlank = 105,
16762    WeightedSwissBallSidePlank = 106,
16763    ThreeWayPlank = 107,
16764    WeightedThreeWayPlank = 108,
16765    TowelPlankAndKneeIn = 109,
16766    WeightedTowelPlankAndKneeIn = 110,
16767    TStabilization = 111,
16768    WeightedTStabilization = 112,
16769    TurkishGetUpToSidePlank = 113,
16770    WeightedTurkishGetUpToSidePlank = 114,
16771    TwoPointPlank = 115,
16772    WeightedTwoPointPlank = 116,
16773    WeightedPlank = 117,
16774    WideStancePlankWithDiagonalArmLift = 118,
16775    WeightedWideStancePlankWithDiagonalArmLift = 119,
16776    WideStancePlankWithDiagonalLegLift = 120,
16777    WeightedWideStancePlankWithDiagonalLegLift = 121,
16778    WideStancePlankWithLegLift = 122,
16779    WeightedWideStancePlankWithLegLift = 123,
16780    WideStancePlankWithOppositeArmAndLegLift = 124,
16781    WeightedMountainClimberWithHandsOnBench = 125,
16782    WeightedSwissBallPlankLegLiftAndHold = 126,
16783    WeightedWideStancePlankWithOppositeArmAndLegLift = 127,
16784    PlankWithFeetOnSwissBall = 128,
16785    SidePlankToPlankWithReachUnder = 129,
16786    BridgeWithGluteLowerLift = 130,
16787    BridgeOneLegBridge = 131,
16788    PlankWithArmVariations = 132,
16789    PlankWithLegLift = 133,
16790    ReversePlankWithLegPull = 134,
16791    RingPlankSprawls = 135,
16792}
16793
16794impl PlankExerciseName {
16795    /// Snake-case canonical name from Profile.xlsx.
16796    pub fn as_str(&self) -> &'static str {
16797        match self {
16798            PlankExerciseName::_45DegreePlank => "45_degree_plank",
16799            PlankExerciseName::Weighted45DegreePlank => "weighted_45_degree_plank",
16800            PlankExerciseName::_90DegreeStaticHold => "90_degree_static_hold",
16801            PlankExerciseName::Weighted90DegreeStaticHold => "weighted_90_degree_static_hold",
16802            PlankExerciseName::BearCrawl => "bear_crawl",
16803            PlankExerciseName::WeightedBearCrawl => "weighted_bear_crawl",
16804            PlankExerciseName::CrossBodyMountainClimber => "cross_body_mountain_climber",
16805            PlankExerciseName::WeightedCrossBodyMountainClimber => {
16806                "weighted_cross_body_mountain_climber"
16807            }
16808            PlankExerciseName::ElbowPlankPikeJacks => "elbow_plank_pike_jacks",
16809            PlankExerciseName::WeightedElbowPlankPikeJacks => "weighted_elbow_plank_pike_jacks",
16810            PlankExerciseName::ElevatedFeetPlank => "elevated_feet_plank",
16811            PlankExerciseName::WeightedElevatedFeetPlank => "weighted_elevated_feet_plank",
16812            PlankExerciseName::ElevatorAbs => "elevator_abs",
16813            PlankExerciseName::WeightedElevatorAbs => "weighted_elevator_abs",
16814            PlankExerciseName::ExtendedPlank => "extended_plank",
16815            PlankExerciseName::WeightedExtendedPlank => "weighted_extended_plank",
16816            PlankExerciseName::FullPlankPasseTwist => "full_plank_passe_twist",
16817            PlankExerciseName::WeightedFullPlankPasseTwist => "weighted_full_plank_passe_twist",
16818            PlankExerciseName::InchingElbowPlank => "inching_elbow_plank",
16819            PlankExerciseName::WeightedInchingElbowPlank => "weighted_inching_elbow_plank",
16820            PlankExerciseName::InchwormToSidePlank => "inchworm_to_side_plank",
16821            PlankExerciseName::WeightedInchwormToSidePlank => "weighted_inchworm_to_side_plank",
16822            PlankExerciseName::KneelingPlank => "kneeling_plank",
16823            PlankExerciseName::WeightedKneelingPlank => "weighted_kneeling_plank",
16824            PlankExerciseName::KneelingSidePlankWithLegLift => "kneeling_side_plank_with_leg_lift",
16825            PlankExerciseName::WeightedKneelingSidePlankWithLegLift => {
16826                "weighted_kneeling_side_plank_with_leg_lift"
16827            }
16828            PlankExerciseName::LateralRoll => "lateral_roll",
16829            PlankExerciseName::WeightedLateralRoll => "weighted_lateral_roll",
16830            PlankExerciseName::LyingReversePlank => "lying_reverse_plank",
16831            PlankExerciseName::WeightedLyingReversePlank => "weighted_lying_reverse_plank",
16832            PlankExerciseName::MedicineBallMountainClimber => "medicine_ball_mountain_climber",
16833            PlankExerciseName::WeightedMedicineBallMountainClimber => {
16834                "weighted_medicine_ball_mountain_climber"
16835            }
16836            PlankExerciseName::ModifiedMountainClimberAndExtension => {
16837                "modified_mountain_climber_and_extension"
16838            }
16839            PlankExerciseName::WeightedModifiedMountainClimberAndExtension => {
16840                "weighted_modified_mountain_climber_and_extension"
16841            }
16842            PlankExerciseName::MountainClimber => "mountain_climber",
16843            PlankExerciseName::WeightedMountainClimber => "weighted_mountain_climber",
16844            PlankExerciseName::MountainClimberOnSlidingDiscs => "mountain_climber_on_sliding_discs",
16845            PlankExerciseName::WeightedMountainClimberOnSlidingDiscs => {
16846                "weighted_mountain_climber_on_sliding_discs"
16847            }
16848            PlankExerciseName::MountainClimberWithFeetOnBosuBall => {
16849                "mountain_climber_with_feet_on_bosu_ball"
16850            }
16851            PlankExerciseName::WeightedMountainClimberWithFeetOnBosuBall => {
16852                "weighted_mountain_climber_with_feet_on_bosu_ball"
16853            }
16854            PlankExerciseName::MountainClimberWithHandsOnBench => {
16855                "mountain_climber_with_hands_on_bench"
16856            }
16857            PlankExerciseName::MountainClimberWithHandsOnSwissBall => {
16858                "mountain_climber_with_hands_on_swiss_ball"
16859            }
16860            PlankExerciseName::WeightedMountainClimberWithHandsOnSwissBall => {
16861                "weighted_mountain_climber_with_hands_on_swiss_ball"
16862            }
16863            PlankExerciseName::Plank => "plank",
16864            PlankExerciseName::PlankJacksWithFeetOnSlidingDiscs => {
16865                "plank_jacks_with_feet_on_sliding_discs"
16866            }
16867            PlankExerciseName::WeightedPlankJacksWithFeetOnSlidingDiscs => {
16868                "weighted_plank_jacks_with_feet_on_sliding_discs"
16869            }
16870            PlankExerciseName::PlankKneeTwist => "plank_knee_twist",
16871            PlankExerciseName::WeightedPlankKneeTwist => "weighted_plank_knee_twist",
16872            PlankExerciseName::PlankPikeJumps => "plank_pike_jumps",
16873            PlankExerciseName::WeightedPlankPikeJumps => "weighted_plank_pike_jumps",
16874            PlankExerciseName::PlankPikes => "plank_pikes",
16875            PlankExerciseName::WeightedPlankPikes => "weighted_plank_pikes",
16876            PlankExerciseName::PlankToStandUp => "plank_to_stand_up",
16877            PlankExerciseName::WeightedPlankToStandUp => "weighted_plank_to_stand_up",
16878            PlankExerciseName::PlankWithArmRaise => "plank_with_arm_raise",
16879            PlankExerciseName::WeightedPlankWithArmRaise => "weighted_plank_with_arm_raise",
16880            PlankExerciseName::PlankWithKneeToElbow => "plank_with_knee_to_elbow",
16881            PlankExerciseName::WeightedPlankWithKneeToElbow => "weighted_plank_with_knee_to_elbow",
16882            PlankExerciseName::PlankWithObliqueCrunch => "plank_with_oblique_crunch",
16883            PlankExerciseName::WeightedPlankWithObliqueCrunch => {
16884                "weighted_plank_with_oblique_crunch"
16885            }
16886            PlankExerciseName::PlyometricSidePlank => "plyometric_side_plank",
16887            PlankExerciseName::WeightedPlyometricSidePlank => "weighted_plyometric_side_plank",
16888            PlankExerciseName::RollingSidePlank => "rolling_side_plank",
16889            PlankExerciseName::WeightedRollingSidePlank => "weighted_rolling_side_plank",
16890            PlankExerciseName::SideKickPlank => "side_kick_plank",
16891            PlankExerciseName::WeightedSideKickPlank => "weighted_side_kick_plank",
16892            PlankExerciseName::SidePlank => "side_plank",
16893            PlankExerciseName::WeightedSidePlank => "weighted_side_plank",
16894            PlankExerciseName::SidePlankAndRow => "side_plank_and_row",
16895            PlankExerciseName::WeightedSidePlankAndRow => "weighted_side_plank_and_row",
16896            PlankExerciseName::SidePlankLift => "side_plank_lift",
16897            PlankExerciseName::WeightedSidePlankLift => "weighted_side_plank_lift",
16898            PlankExerciseName::SidePlankWithElbowOnBosuBall => "side_plank_with_elbow_on_bosu_ball",
16899            PlankExerciseName::WeightedSidePlankWithElbowOnBosuBall => {
16900                "weighted_side_plank_with_elbow_on_bosu_ball"
16901            }
16902            PlankExerciseName::SidePlankWithFeetOnBench => "side_plank_with_feet_on_bench",
16903            PlankExerciseName::WeightedSidePlankWithFeetOnBench => {
16904                "weighted_side_plank_with_feet_on_bench"
16905            }
16906            PlankExerciseName::SidePlankWithKneeCircle => "side_plank_with_knee_circle",
16907            PlankExerciseName::WeightedSidePlankWithKneeCircle => {
16908                "weighted_side_plank_with_knee_circle"
16909            }
16910            PlankExerciseName::SidePlankWithKneeTuck => "side_plank_with_knee_tuck",
16911            PlankExerciseName::WeightedSidePlankWithKneeTuck => {
16912                "weighted_side_plank_with_knee_tuck"
16913            }
16914            PlankExerciseName::SidePlankWithLegLift => "side_plank_with_leg_lift",
16915            PlankExerciseName::WeightedSidePlankWithLegLift => "weighted_side_plank_with_leg_lift",
16916            PlankExerciseName::SidePlankWithReachUnder => "side_plank_with_reach_under",
16917            PlankExerciseName::WeightedSidePlankWithReachUnder => {
16918                "weighted_side_plank_with_reach_under"
16919            }
16920            PlankExerciseName::SingleLegElevatedFeetPlank => "single_leg_elevated_feet_plank",
16921            PlankExerciseName::WeightedSingleLegElevatedFeetPlank => {
16922                "weighted_single_leg_elevated_feet_plank"
16923            }
16924            PlankExerciseName::SingleLegFlexAndExtend => "single_leg_flex_and_extend",
16925            PlankExerciseName::WeightedSingleLegFlexAndExtend => {
16926                "weighted_single_leg_flex_and_extend"
16927            }
16928            PlankExerciseName::SingleLegSidePlank => "single_leg_side_plank",
16929            PlankExerciseName::WeightedSingleLegSidePlank => "weighted_single_leg_side_plank",
16930            PlankExerciseName::SpidermanPlank => "spiderman_plank",
16931            PlankExerciseName::WeightedSpidermanPlank => "weighted_spiderman_plank",
16932            PlankExerciseName::StraightArmPlank => "straight_arm_plank",
16933            PlankExerciseName::WeightedStraightArmPlank => "weighted_straight_arm_plank",
16934            PlankExerciseName::StraightArmPlankWithShoulderTouch => {
16935                "straight_arm_plank_with_shoulder_touch"
16936            }
16937            PlankExerciseName::WeightedStraightArmPlankWithShoulderTouch => {
16938                "weighted_straight_arm_plank_with_shoulder_touch"
16939            }
16940            PlankExerciseName::SwissBallPlank => "swiss_ball_plank",
16941            PlankExerciseName::WeightedSwissBallPlank => "weighted_swiss_ball_plank",
16942            PlankExerciseName::SwissBallPlankLegLift => "swiss_ball_plank_leg_lift",
16943            PlankExerciseName::WeightedSwissBallPlankLegLift => {
16944                "weighted_swiss_ball_plank_leg_lift"
16945            }
16946            PlankExerciseName::SwissBallPlankLegLiftAndHold => "swiss_ball_plank_leg_lift_and_hold",
16947            PlankExerciseName::SwissBallPlankWithFeetOnBench => {
16948                "swiss_ball_plank_with_feet_on_bench"
16949            }
16950            PlankExerciseName::WeightedSwissBallPlankWithFeetOnBench => {
16951                "weighted_swiss_ball_plank_with_feet_on_bench"
16952            }
16953            PlankExerciseName::SwissBallProneJackknife => "swiss_ball_prone_jackknife",
16954            PlankExerciseName::WeightedSwissBallProneJackknife => {
16955                "weighted_swiss_ball_prone_jackknife"
16956            }
16957            PlankExerciseName::SwissBallSidePlank => "swiss_ball_side_plank",
16958            PlankExerciseName::WeightedSwissBallSidePlank => "weighted_swiss_ball_side_plank",
16959            PlankExerciseName::ThreeWayPlank => "three_way_plank",
16960            PlankExerciseName::WeightedThreeWayPlank => "weighted_three_way_plank",
16961            PlankExerciseName::TowelPlankAndKneeIn => "towel_plank_and_knee_in",
16962            PlankExerciseName::WeightedTowelPlankAndKneeIn => "weighted_towel_plank_and_knee_in",
16963            PlankExerciseName::TStabilization => "t_stabilization",
16964            PlankExerciseName::WeightedTStabilization => "weighted_t_stabilization",
16965            PlankExerciseName::TurkishGetUpToSidePlank => "turkish_get_up_to_side_plank",
16966            PlankExerciseName::WeightedTurkishGetUpToSidePlank => {
16967                "weighted_turkish_get_up_to_side_plank"
16968            }
16969            PlankExerciseName::TwoPointPlank => "two_point_plank",
16970            PlankExerciseName::WeightedTwoPointPlank => "weighted_two_point_plank",
16971            PlankExerciseName::WeightedPlank => "weighted_plank",
16972            PlankExerciseName::WideStancePlankWithDiagonalArmLift => {
16973                "wide_stance_plank_with_diagonal_arm_lift"
16974            }
16975            PlankExerciseName::WeightedWideStancePlankWithDiagonalArmLift => {
16976                "weighted_wide_stance_plank_with_diagonal_arm_lift"
16977            }
16978            PlankExerciseName::WideStancePlankWithDiagonalLegLift => {
16979                "wide_stance_plank_with_diagonal_leg_lift"
16980            }
16981            PlankExerciseName::WeightedWideStancePlankWithDiagonalLegLift => {
16982                "weighted_wide_stance_plank_with_diagonal_leg_lift"
16983            }
16984            PlankExerciseName::WideStancePlankWithLegLift => "wide_stance_plank_with_leg_lift",
16985            PlankExerciseName::WeightedWideStancePlankWithLegLift => {
16986                "weighted_wide_stance_plank_with_leg_lift"
16987            }
16988            PlankExerciseName::WideStancePlankWithOppositeArmAndLegLift => {
16989                "wide_stance_plank_with_opposite_arm_and_leg_lift"
16990            }
16991            PlankExerciseName::WeightedMountainClimberWithHandsOnBench => {
16992                "weighted_mountain_climber_with_hands_on_bench"
16993            }
16994            PlankExerciseName::WeightedSwissBallPlankLegLiftAndHold => {
16995                "weighted_swiss_ball_plank_leg_lift_and_hold"
16996            }
16997            PlankExerciseName::WeightedWideStancePlankWithOppositeArmAndLegLift => {
16998                "weighted_wide_stance_plank_with_opposite_arm_and_leg_lift"
16999            }
17000            PlankExerciseName::PlankWithFeetOnSwissBall => "plank_with_feet_on_swiss_ball",
17001            PlankExerciseName::SidePlankToPlankWithReachUnder => {
17002                "side_plank_to_plank_with_reach_under"
17003            }
17004            PlankExerciseName::BridgeWithGluteLowerLift => "bridge_with_glute_lower_lift",
17005            PlankExerciseName::BridgeOneLegBridge => "bridge_one_leg_bridge",
17006            PlankExerciseName::PlankWithArmVariations => "plank_with_arm_variations",
17007            PlankExerciseName::PlankWithLegLift => "plank_with_leg_lift",
17008            PlankExerciseName::ReversePlankWithLegPull => "reverse_plank_with_leg_pull",
17009            PlankExerciseName::RingPlankSprawls => "ring_plank_sprawls",
17010        }
17011    }
17012
17013    /// Try to construct from the underlying numeric value.
17014    pub fn from_value(value: u16) -> Option<Self> {
17015        match value {
17016            0 => Some(PlankExerciseName::_45DegreePlank),
17017            1 => Some(PlankExerciseName::Weighted45DegreePlank),
17018            2 => Some(PlankExerciseName::_90DegreeStaticHold),
17019            3 => Some(PlankExerciseName::Weighted90DegreeStaticHold),
17020            4 => Some(PlankExerciseName::BearCrawl),
17021            5 => Some(PlankExerciseName::WeightedBearCrawl),
17022            6 => Some(PlankExerciseName::CrossBodyMountainClimber),
17023            7 => Some(PlankExerciseName::WeightedCrossBodyMountainClimber),
17024            8 => Some(PlankExerciseName::ElbowPlankPikeJacks),
17025            9 => Some(PlankExerciseName::WeightedElbowPlankPikeJacks),
17026            10 => Some(PlankExerciseName::ElevatedFeetPlank),
17027            11 => Some(PlankExerciseName::WeightedElevatedFeetPlank),
17028            12 => Some(PlankExerciseName::ElevatorAbs),
17029            13 => Some(PlankExerciseName::WeightedElevatorAbs),
17030            14 => Some(PlankExerciseName::ExtendedPlank),
17031            15 => Some(PlankExerciseName::WeightedExtendedPlank),
17032            16 => Some(PlankExerciseName::FullPlankPasseTwist),
17033            17 => Some(PlankExerciseName::WeightedFullPlankPasseTwist),
17034            18 => Some(PlankExerciseName::InchingElbowPlank),
17035            19 => Some(PlankExerciseName::WeightedInchingElbowPlank),
17036            20 => Some(PlankExerciseName::InchwormToSidePlank),
17037            21 => Some(PlankExerciseName::WeightedInchwormToSidePlank),
17038            22 => Some(PlankExerciseName::KneelingPlank),
17039            23 => Some(PlankExerciseName::WeightedKneelingPlank),
17040            24 => Some(PlankExerciseName::KneelingSidePlankWithLegLift),
17041            25 => Some(PlankExerciseName::WeightedKneelingSidePlankWithLegLift),
17042            26 => Some(PlankExerciseName::LateralRoll),
17043            27 => Some(PlankExerciseName::WeightedLateralRoll),
17044            28 => Some(PlankExerciseName::LyingReversePlank),
17045            29 => Some(PlankExerciseName::WeightedLyingReversePlank),
17046            30 => Some(PlankExerciseName::MedicineBallMountainClimber),
17047            31 => Some(PlankExerciseName::WeightedMedicineBallMountainClimber),
17048            32 => Some(PlankExerciseName::ModifiedMountainClimberAndExtension),
17049            33 => Some(PlankExerciseName::WeightedModifiedMountainClimberAndExtension),
17050            34 => Some(PlankExerciseName::MountainClimber),
17051            35 => Some(PlankExerciseName::WeightedMountainClimber),
17052            36 => Some(PlankExerciseName::MountainClimberOnSlidingDiscs),
17053            37 => Some(PlankExerciseName::WeightedMountainClimberOnSlidingDiscs),
17054            38 => Some(PlankExerciseName::MountainClimberWithFeetOnBosuBall),
17055            39 => Some(PlankExerciseName::WeightedMountainClimberWithFeetOnBosuBall),
17056            40 => Some(PlankExerciseName::MountainClimberWithHandsOnBench),
17057            41 => Some(PlankExerciseName::MountainClimberWithHandsOnSwissBall),
17058            42 => Some(PlankExerciseName::WeightedMountainClimberWithHandsOnSwissBall),
17059            43 => Some(PlankExerciseName::Plank),
17060            44 => Some(PlankExerciseName::PlankJacksWithFeetOnSlidingDiscs),
17061            45 => Some(PlankExerciseName::WeightedPlankJacksWithFeetOnSlidingDiscs),
17062            46 => Some(PlankExerciseName::PlankKneeTwist),
17063            47 => Some(PlankExerciseName::WeightedPlankKneeTwist),
17064            48 => Some(PlankExerciseName::PlankPikeJumps),
17065            49 => Some(PlankExerciseName::WeightedPlankPikeJumps),
17066            50 => Some(PlankExerciseName::PlankPikes),
17067            51 => Some(PlankExerciseName::WeightedPlankPikes),
17068            52 => Some(PlankExerciseName::PlankToStandUp),
17069            53 => Some(PlankExerciseName::WeightedPlankToStandUp),
17070            54 => Some(PlankExerciseName::PlankWithArmRaise),
17071            55 => Some(PlankExerciseName::WeightedPlankWithArmRaise),
17072            56 => Some(PlankExerciseName::PlankWithKneeToElbow),
17073            57 => Some(PlankExerciseName::WeightedPlankWithKneeToElbow),
17074            58 => Some(PlankExerciseName::PlankWithObliqueCrunch),
17075            59 => Some(PlankExerciseName::WeightedPlankWithObliqueCrunch),
17076            60 => Some(PlankExerciseName::PlyometricSidePlank),
17077            61 => Some(PlankExerciseName::WeightedPlyometricSidePlank),
17078            62 => Some(PlankExerciseName::RollingSidePlank),
17079            63 => Some(PlankExerciseName::WeightedRollingSidePlank),
17080            64 => Some(PlankExerciseName::SideKickPlank),
17081            65 => Some(PlankExerciseName::WeightedSideKickPlank),
17082            66 => Some(PlankExerciseName::SidePlank),
17083            67 => Some(PlankExerciseName::WeightedSidePlank),
17084            68 => Some(PlankExerciseName::SidePlankAndRow),
17085            69 => Some(PlankExerciseName::WeightedSidePlankAndRow),
17086            70 => Some(PlankExerciseName::SidePlankLift),
17087            71 => Some(PlankExerciseName::WeightedSidePlankLift),
17088            72 => Some(PlankExerciseName::SidePlankWithElbowOnBosuBall),
17089            73 => Some(PlankExerciseName::WeightedSidePlankWithElbowOnBosuBall),
17090            74 => Some(PlankExerciseName::SidePlankWithFeetOnBench),
17091            75 => Some(PlankExerciseName::WeightedSidePlankWithFeetOnBench),
17092            76 => Some(PlankExerciseName::SidePlankWithKneeCircle),
17093            77 => Some(PlankExerciseName::WeightedSidePlankWithKneeCircle),
17094            78 => Some(PlankExerciseName::SidePlankWithKneeTuck),
17095            79 => Some(PlankExerciseName::WeightedSidePlankWithKneeTuck),
17096            80 => Some(PlankExerciseName::SidePlankWithLegLift),
17097            81 => Some(PlankExerciseName::WeightedSidePlankWithLegLift),
17098            82 => Some(PlankExerciseName::SidePlankWithReachUnder),
17099            83 => Some(PlankExerciseName::WeightedSidePlankWithReachUnder),
17100            84 => Some(PlankExerciseName::SingleLegElevatedFeetPlank),
17101            85 => Some(PlankExerciseName::WeightedSingleLegElevatedFeetPlank),
17102            86 => Some(PlankExerciseName::SingleLegFlexAndExtend),
17103            87 => Some(PlankExerciseName::WeightedSingleLegFlexAndExtend),
17104            88 => Some(PlankExerciseName::SingleLegSidePlank),
17105            89 => Some(PlankExerciseName::WeightedSingleLegSidePlank),
17106            90 => Some(PlankExerciseName::SpidermanPlank),
17107            91 => Some(PlankExerciseName::WeightedSpidermanPlank),
17108            92 => Some(PlankExerciseName::StraightArmPlank),
17109            93 => Some(PlankExerciseName::WeightedStraightArmPlank),
17110            94 => Some(PlankExerciseName::StraightArmPlankWithShoulderTouch),
17111            95 => Some(PlankExerciseName::WeightedStraightArmPlankWithShoulderTouch),
17112            96 => Some(PlankExerciseName::SwissBallPlank),
17113            97 => Some(PlankExerciseName::WeightedSwissBallPlank),
17114            98 => Some(PlankExerciseName::SwissBallPlankLegLift),
17115            99 => Some(PlankExerciseName::WeightedSwissBallPlankLegLift),
17116            100 => Some(PlankExerciseName::SwissBallPlankLegLiftAndHold),
17117            101 => Some(PlankExerciseName::SwissBallPlankWithFeetOnBench),
17118            102 => Some(PlankExerciseName::WeightedSwissBallPlankWithFeetOnBench),
17119            103 => Some(PlankExerciseName::SwissBallProneJackknife),
17120            104 => Some(PlankExerciseName::WeightedSwissBallProneJackknife),
17121            105 => Some(PlankExerciseName::SwissBallSidePlank),
17122            106 => Some(PlankExerciseName::WeightedSwissBallSidePlank),
17123            107 => Some(PlankExerciseName::ThreeWayPlank),
17124            108 => Some(PlankExerciseName::WeightedThreeWayPlank),
17125            109 => Some(PlankExerciseName::TowelPlankAndKneeIn),
17126            110 => Some(PlankExerciseName::WeightedTowelPlankAndKneeIn),
17127            111 => Some(PlankExerciseName::TStabilization),
17128            112 => Some(PlankExerciseName::WeightedTStabilization),
17129            113 => Some(PlankExerciseName::TurkishGetUpToSidePlank),
17130            114 => Some(PlankExerciseName::WeightedTurkishGetUpToSidePlank),
17131            115 => Some(PlankExerciseName::TwoPointPlank),
17132            116 => Some(PlankExerciseName::WeightedTwoPointPlank),
17133            117 => Some(PlankExerciseName::WeightedPlank),
17134            118 => Some(PlankExerciseName::WideStancePlankWithDiagonalArmLift),
17135            119 => Some(PlankExerciseName::WeightedWideStancePlankWithDiagonalArmLift),
17136            120 => Some(PlankExerciseName::WideStancePlankWithDiagonalLegLift),
17137            121 => Some(PlankExerciseName::WeightedWideStancePlankWithDiagonalLegLift),
17138            122 => Some(PlankExerciseName::WideStancePlankWithLegLift),
17139            123 => Some(PlankExerciseName::WeightedWideStancePlankWithLegLift),
17140            124 => Some(PlankExerciseName::WideStancePlankWithOppositeArmAndLegLift),
17141            125 => Some(PlankExerciseName::WeightedMountainClimberWithHandsOnBench),
17142            126 => Some(PlankExerciseName::WeightedSwissBallPlankLegLiftAndHold),
17143            127 => Some(PlankExerciseName::WeightedWideStancePlankWithOppositeArmAndLegLift),
17144            128 => Some(PlankExerciseName::PlankWithFeetOnSwissBall),
17145            129 => Some(PlankExerciseName::SidePlankToPlankWithReachUnder),
17146            130 => Some(PlankExerciseName::BridgeWithGluteLowerLift),
17147            131 => Some(PlankExerciseName::BridgeOneLegBridge),
17148            132 => Some(PlankExerciseName::PlankWithArmVariations),
17149            133 => Some(PlankExerciseName::PlankWithLegLift),
17150            134 => Some(PlankExerciseName::ReversePlankWithLegPull),
17151            135 => Some(PlankExerciseName::RingPlankSprawls),
17152            _ => None,
17153        }
17154    }
17155
17156    /// Try to construct from the snake-case canonical name.
17157    pub fn from_str(name: &str) -> Option<Self> {
17158        match name {
17159            "45_degree_plank" => Some(PlankExerciseName::_45DegreePlank),
17160            "weighted_45_degree_plank" => Some(PlankExerciseName::Weighted45DegreePlank),
17161            "90_degree_static_hold" => Some(PlankExerciseName::_90DegreeStaticHold),
17162            "weighted_90_degree_static_hold" => Some(PlankExerciseName::Weighted90DegreeStaticHold),
17163            "bear_crawl" => Some(PlankExerciseName::BearCrawl),
17164            "weighted_bear_crawl" => Some(PlankExerciseName::WeightedBearCrawl),
17165            "cross_body_mountain_climber" => Some(PlankExerciseName::CrossBodyMountainClimber),
17166            "weighted_cross_body_mountain_climber" => {
17167                Some(PlankExerciseName::WeightedCrossBodyMountainClimber)
17168            }
17169            "elbow_plank_pike_jacks" => Some(PlankExerciseName::ElbowPlankPikeJacks),
17170            "weighted_elbow_plank_pike_jacks" => {
17171                Some(PlankExerciseName::WeightedElbowPlankPikeJacks)
17172            }
17173            "elevated_feet_plank" => Some(PlankExerciseName::ElevatedFeetPlank),
17174            "weighted_elevated_feet_plank" => Some(PlankExerciseName::WeightedElevatedFeetPlank),
17175            "elevator_abs" => Some(PlankExerciseName::ElevatorAbs),
17176            "weighted_elevator_abs" => Some(PlankExerciseName::WeightedElevatorAbs),
17177            "extended_plank" => Some(PlankExerciseName::ExtendedPlank),
17178            "weighted_extended_plank" => Some(PlankExerciseName::WeightedExtendedPlank),
17179            "full_plank_passe_twist" => Some(PlankExerciseName::FullPlankPasseTwist),
17180            "weighted_full_plank_passe_twist" => {
17181                Some(PlankExerciseName::WeightedFullPlankPasseTwist)
17182            }
17183            "inching_elbow_plank" => Some(PlankExerciseName::InchingElbowPlank),
17184            "weighted_inching_elbow_plank" => Some(PlankExerciseName::WeightedInchingElbowPlank),
17185            "inchworm_to_side_plank" => Some(PlankExerciseName::InchwormToSidePlank),
17186            "weighted_inchworm_to_side_plank" => {
17187                Some(PlankExerciseName::WeightedInchwormToSidePlank)
17188            }
17189            "kneeling_plank" => Some(PlankExerciseName::KneelingPlank),
17190            "weighted_kneeling_plank" => Some(PlankExerciseName::WeightedKneelingPlank),
17191            "kneeling_side_plank_with_leg_lift" => {
17192                Some(PlankExerciseName::KneelingSidePlankWithLegLift)
17193            }
17194            "weighted_kneeling_side_plank_with_leg_lift" => {
17195                Some(PlankExerciseName::WeightedKneelingSidePlankWithLegLift)
17196            }
17197            "lateral_roll" => Some(PlankExerciseName::LateralRoll),
17198            "weighted_lateral_roll" => Some(PlankExerciseName::WeightedLateralRoll),
17199            "lying_reverse_plank" => Some(PlankExerciseName::LyingReversePlank),
17200            "weighted_lying_reverse_plank" => Some(PlankExerciseName::WeightedLyingReversePlank),
17201            "medicine_ball_mountain_climber" => {
17202                Some(PlankExerciseName::MedicineBallMountainClimber)
17203            }
17204            "weighted_medicine_ball_mountain_climber" => {
17205                Some(PlankExerciseName::WeightedMedicineBallMountainClimber)
17206            }
17207            "modified_mountain_climber_and_extension" => {
17208                Some(PlankExerciseName::ModifiedMountainClimberAndExtension)
17209            }
17210            "weighted_modified_mountain_climber_and_extension" => {
17211                Some(PlankExerciseName::WeightedModifiedMountainClimberAndExtension)
17212            }
17213            "mountain_climber" => Some(PlankExerciseName::MountainClimber),
17214            "weighted_mountain_climber" => Some(PlankExerciseName::WeightedMountainClimber),
17215            "mountain_climber_on_sliding_discs" => {
17216                Some(PlankExerciseName::MountainClimberOnSlidingDiscs)
17217            }
17218            "weighted_mountain_climber_on_sliding_discs" => {
17219                Some(PlankExerciseName::WeightedMountainClimberOnSlidingDiscs)
17220            }
17221            "mountain_climber_with_feet_on_bosu_ball" => {
17222                Some(PlankExerciseName::MountainClimberWithFeetOnBosuBall)
17223            }
17224            "weighted_mountain_climber_with_feet_on_bosu_ball" => {
17225                Some(PlankExerciseName::WeightedMountainClimberWithFeetOnBosuBall)
17226            }
17227            "mountain_climber_with_hands_on_bench" => {
17228                Some(PlankExerciseName::MountainClimberWithHandsOnBench)
17229            }
17230            "mountain_climber_with_hands_on_swiss_ball" => {
17231                Some(PlankExerciseName::MountainClimberWithHandsOnSwissBall)
17232            }
17233            "weighted_mountain_climber_with_hands_on_swiss_ball" => {
17234                Some(PlankExerciseName::WeightedMountainClimberWithHandsOnSwissBall)
17235            }
17236            "plank" => Some(PlankExerciseName::Plank),
17237            "plank_jacks_with_feet_on_sliding_discs" => {
17238                Some(PlankExerciseName::PlankJacksWithFeetOnSlidingDiscs)
17239            }
17240            "weighted_plank_jacks_with_feet_on_sliding_discs" => {
17241                Some(PlankExerciseName::WeightedPlankJacksWithFeetOnSlidingDiscs)
17242            }
17243            "plank_knee_twist" => Some(PlankExerciseName::PlankKneeTwist),
17244            "weighted_plank_knee_twist" => Some(PlankExerciseName::WeightedPlankKneeTwist),
17245            "plank_pike_jumps" => Some(PlankExerciseName::PlankPikeJumps),
17246            "weighted_plank_pike_jumps" => Some(PlankExerciseName::WeightedPlankPikeJumps),
17247            "plank_pikes" => Some(PlankExerciseName::PlankPikes),
17248            "weighted_plank_pikes" => Some(PlankExerciseName::WeightedPlankPikes),
17249            "plank_to_stand_up" => Some(PlankExerciseName::PlankToStandUp),
17250            "weighted_plank_to_stand_up" => Some(PlankExerciseName::WeightedPlankToStandUp),
17251            "plank_with_arm_raise" => Some(PlankExerciseName::PlankWithArmRaise),
17252            "weighted_plank_with_arm_raise" => Some(PlankExerciseName::WeightedPlankWithArmRaise),
17253            "plank_with_knee_to_elbow" => Some(PlankExerciseName::PlankWithKneeToElbow),
17254            "weighted_plank_with_knee_to_elbow" => {
17255                Some(PlankExerciseName::WeightedPlankWithKneeToElbow)
17256            }
17257            "plank_with_oblique_crunch" => Some(PlankExerciseName::PlankWithObliqueCrunch),
17258            "weighted_plank_with_oblique_crunch" => {
17259                Some(PlankExerciseName::WeightedPlankWithObliqueCrunch)
17260            }
17261            "plyometric_side_plank" => Some(PlankExerciseName::PlyometricSidePlank),
17262            "weighted_plyometric_side_plank" => {
17263                Some(PlankExerciseName::WeightedPlyometricSidePlank)
17264            }
17265            "rolling_side_plank" => Some(PlankExerciseName::RollingSidePlank),
17266            "weighted_rolling_side_plank" => Some(PlankExerciseName::WeightedRollingSidePlank),
17267            "side_kick_plank" => Some(PlankExerciseName::SideKickPlank),
17268            "weighted_side_kick_plank" => Some(PlankExerciseName::WeightedSideKickPlank),
17269            "side_plank" => Some(PlankExerciseName::SidePlank),
17270            "weighted_side_plank" => Some(PlankExerciseName::WeightedSidePlank),
17271            "side_plank_and_row" => Some(PlankExerciseName::SidePlankAndRow),
17272            "weighted_side_plank_and_row" => Some(PlankExerciseName::WeightedSidePlankAndRow),
17273            "side_plank_lift" => Some(PlankExerciseName::SidePlankLift),
17274            "weighted_side_plank_lift" => Some(PlankExerciseName::WeightedSidePlankLift),
17275            "side_plank_with_elbow_on_bosu_ball" => {
17276                Some(PlankExerciseName::SidePlankWithElbowOnBosuBall)
17277            }
17278            "weighted_side_plank_with_elbow_on_bosu_ball" => {
17279                Some(PlankExerciseName::WeightedSidePlankWithElbowOnBosuBall)
17280            }
17281            "side_plank_with_feet_on_bench" => Some(PlankExerciseName::SidePlankWithFeetOnBench),
17282            "weighted_side_plank_with_feet_on_bench" => {
17283                Some(PlankExerciseName::WeightedSidePlankWithFeetOnBench)
17284            }
17285            "side_plank_with_knee_circle" => Some(PlankExerciseName::SidePlankWithKneeCircle),
17286            "weighted_side_plank_with_knee_circle" => {
17287                Some(PlankExerciseName::WeightedSidePlankWithKneeCircle)
17288            }
17289            "side_plank_with_knee_tuck" => Some(PlankExerciseName::SidePlankWithKneeTuck),
17290            "weighted_side_plank_with_knee_tuck" => {
17291                Some(PlankExerciseName::WeightedSidePlankWithKneeTuck)
17292            }
17293            "side_plank_with_leg_lift" => Some(PlankExerciseName::SidePlankWithLegLift),
17294            "weighted_side_plank_with_leg_lift" => {
17295                Some(PlankExerciseName::WeightedSidePlankWithLegLift)
17296            }
17297            "side_plank_with_reach_under" => Some(PlankExerciseName::SidePlankWithReachUnder),
17298            "weighted_side_plank_with_reach_under" => {
17299                Some(PlankExerciseName::WeightedSidePlankWithReachUnder)
17300            }
17301            "single_leg_elevated_feet_plank" => Some(PlankExerciseName::SingleLegElevatedFeetPlank),
17302            "weighted_single_leg_elevated_feet_plank" => {
17303                Some(PlankExerciseName::WeightedSingleLegElevatedFeetPlank)
17304            }
17305            "single_leg_flex_and_extend" => Some(PlankExerciseName::SingleLegFlexAndExtend),
17306            "weighted_single_leg_flex_and_extend" => {
17307                Some(PlankExerciseName::WeightedSingleLegFlexAndExtend)
17308            }
17309            "single_leg_side_plank" => Some(PlankExerciseName::SingleLegSidePlank),
17310            "weighted_single_leg_side_plank" => Some(PlankExerciseName::WeightedSingleLegSidePlank),
17311            "spiderman_plank" => Some(PlankExerciseName::SpidermanPlank),
17312            "weighted_spiderman_plank" => Some(PlankExerciseName::WeightedSpidermanPlank),
17313            "straight_arm_plank" => Some(PlankExerciseName::StraightArmPlank),
17314            "weighted_straight_arm_plank" => Some(PlankExerciseName::WeightedStraightArmPlank),
17315            "straight_arm_plank_with_shoulder_touch" => {
17316                Some(PlankExerciseName::StraightArmPlankWithShoulderTouch)
17317            }
17318            "weighted_straight_arm_plank_with_shoulder_touch" => {
17319                Some(PlankExerciseName::WeightedStraightArmPlankWithShoulderTouch)
17320            }
17321            "swiss_ball_plank" => Some(PlankExerciseName::SwissBallPlank),
17322            "weighted_swiss_ball_plank" => Some(PlankExerciseName::WeightedSwissBallPlank),
17323            "swiss_ball_plank_leg_lift" => Some(PlankExerciseName::SwissBallPlankLegLift),
17324            "weighted_swiss_ball_plank_leg_lift" => {
17325                Some(PlankExerciseName::WeightedSwissBallPlankLegLift)
17326            }
17327            "swiss_ball_plank_leg_lift_and_hold" => {
17328                Some(PlankExerciseName::SwissBallPlankLegLiftAndHold)
17329            }
17330            "swiss_ball_plank_with_feet_on_bench" => {
17331                Some(PlankExerciseName::SwissBallPlankWithFeetOnBench)
17332            }
17333            "weighted_swiss_ball_plank_with_feet_on_bench" => {
17334                Some(PlankExerciseName::WeightedSwissBallPlankWithFeetOnBench)
17335            }
17336            "swiss_ball_prone_jackknife" => Some(PlankExerciseName::SwissBallProneJackknife),
17337            "weighted_swiss_ball_prone_jackknife" => {
17338                Some(PlankExerciseName::WeightedSwissBallProneJackknife)
17339            }
17340            "swiss_ball_side_plank" => Some(PlankExerciseName::SwissBallSidePlank),
17341            "weighted_swiss_ball_side_plank" => Some(PlankExerciseName::WeightedSwissBallSidePlank),
17342            "three_way_plank" => Some(PlankExerciseName::ThreeWayPlank),
17343            "weighted_three_way_plank" => Some(PlankExerciseName::WeightedThreeWayPlank),
17344            "towel_plank_and_knee_in" => Some(PlankExerciseName::TowelPlankAndKneeIn),
17345            "weighted_towel_plank_and_knee_in" => {
17346                Some(PlankExerciseName::WeightedTowelPlankAndKneeIn)
17347            }
17348            "t_stabilization" => Some(PlankExerciseName::TStabilization),
17349            "weighted_t_stabilization" => Some(PlankExerciseName::WeightedTStabilization),
17350            "turkish_get_up_to_side_plank" => Some(PlankExerciseName::TurkishGetUpToSidePlank),
17351            "weighted_turkish_get_up_to_side_plank" => {
17352                Some(PlankExerciseName::WeightedTurkishGetUpToSidePlank)
17353            }
17354            "two_point_plank" => Some(PlankExerciseName::TwoPointPlank),
17355            "weighted_two_point_plank" => Some(PlankExerciseName::WeightedTwoPointPlank),
17356            "weighted_plank" => Some(PlankExerciseName::WeightedPlank),
17357            "wide_stance_plank_with_diagonal_arm_lift" => {
17358                Some(PlankExerciseName::WideStancePlankWithDiagonalArmLift)
17359            }
17360            "weighted_wide_stance_plank_with_diagonal_arm_lift" => {
17361                Some(PlankExerciseName::WeightedWideStancePlankWithDiagonalArmLift)
17362            }
17363            "wide_stance_plank_with_diagonal_leg_lift" => {
17364                Some(PlankExerciseName::WideStancePlankWithDiagonalLegLift)
17365            }
17366            "weighted_wide_stance_plank_with_diagonal_leg_lift" => {
17367                Some(PlankExerciseName::WeightedWideStancePlankWithDiagonalLegLift)
17368            }
17369            "wide_stance_plank_with_leg_lift" => {
17370                Some(PlankExerciseName::WideStancePlankWithLegLift)
17371            }
17372            "weighted_wide_stance_plank_with_leg_lift" => {
17373                Some(PlankExerciseName::WeightedWideStancePlankWithLegLift)
17374            }
17375            "wide_stance_plank_with_opposite_arm_and_leg_lift" => {
17376                Some(PlankExerciseName::WideStancePlankWithOppositeArmAndLegLift)
17377            }
17378            "weighted_mountain_climber_with_hands_on_bench" => {
17379                Some(PlankExerciseName::WeightedMountainClimberWithHandsOnBench)
17380            }
17381            "weighted_swiss_ball_plank_leg_lift_and_hold" => {
17382                Some(PlankExerciseName::WeightedSwissBallPlankLegLiftAndHold)
17383            }
17384            "weighted_wide_stance_plank_with_opposite_arm_and_leg_lift" => {
17385                Some(PlankExerciseName::WeightedWideStancePlankWithOppositeArmAndLegLift)
17386            }
17387            "plank_with_feet_on_swiss_ball" => Some(PlankExerciseName::PlankWithFeetOnSwissBall),
17388            "side_plank_to_plank_with_reach_under" => {
17389                Some(PlankExerciseName::SidePlankToPlankWithReachUnder)
17390            }
17391            "bridge_with_glute_lower_lift" => Some(PlankExerciseName::BridgeWithGluteLowerLift),
17392            "bridge_one_leg_bridge" => Some(PlankExerciseName::BridgeOneLegBridge),
17393            "plank_with_arm_variations" => Some(PlankExerciseName::PlankWithArmVariations),
17394            "plank_with_leg_lift" => Some(PlankExerciseName::PlankWithLegLift),
17395            "reverse_plank_with_leg_pull" => Some(PlankExerciseName::ReversePlankWithLegPull),
17396            "ring_plank_sprawls" => Some(PlankExerciseName::RingPlankSprawls),
17397            _ => None,
17398        }
17399    }
17400}
17401
17402#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
17403#[repr(u16)]
17404#[non_exhaustive]
17405pub enum PlyoExerciseName {
17406    AlternatingJumpLunge = 0,
17407    WeightedAlternatingJumpLunge = 1,
17408    BarbellJumpSquat = 2,
17409    BodyWeightJumpSquat = 3,
17410    WeightedJumpSquat = 4,
17411    CrossKneeStrike = 5,
17412    WeightedCrossKneeStrike = 6,
17413    DepthJump = 7,
17414    WeightedDepthJump = 8,
17415    DumbbellJumpSquat = 9,
17416    DumbbellSplitJump = 10,
17417    FrontKneeStrike = 11,
17418    WeightedFrontKneeStrike = 12,
17419    HighBoxJump = 13,
17420    WeightedHighBoxJump = 14,
17421    IsometricExplosiveBodyWeightJumpSquat = 15,
17422    WeightedIsometricExplosiveJumpSquat = 16,
17423    LateralLeapAndHop = 17,
17424    WeightedLateralLeapAndHop = 18,
17425    LateralPlyoSquats = 19,
17426    WeightedLateralPlyoSquats = 20,
17427    LateralSlide = 21,
17428    WeightedLateralSlide = 22,
17429    MedicineBallOverheadThrows = 23,
17430    MedicineBallSideThrow = 24,
17431    MedicineBallSlam = 25,
17432    SideToSideMedicineBallThrows = 26,
17433    SideToSideShuffleJump = 27,
17434    WeightedSideToSideShuffleJump = 28,
17435    SquatJumpOntoBox = 29,
17436    WeightedSquatJumpOntoBox = 30,
17437    SquatJumpsInAndOut = 31,
17438    WeightedSquatJumpsInAndOut = 32,
17439    BoxJump = 33,
17440    BoxJumpOvers = 34,
17441    BoxJumpOversOverTheBox = 35,
17442    StarJumpSquats = 36,
17443    JumpSquat = 37,
17444}
17445
17446impl PlyoExerciseName {
17447    /// Snake-case canonical name from Profile.xlsx.
17448    pub fn as_str(&self) -> &'static str {
17449        match self {
17450            PlyoExerciseName::AlternatingJumpLunge => "alternating_jump_lunge",
17451            PlyoExerciseName::WeightedAlternatingJumpLunge => "weighted_alternating_jump_lunge",
17452            PlyoExerciseName::BarbellJumpSquat => "barbell_jump_squat",
17453            PlyoExerciseName::BodyWeightJumpSquat => "body_weight_jump_squat",
17454            PlyoExerciseName::WeightedJumpSquat => "weighted_jump_squat",
17455            PlyoExerciseName::CrossKneeStrike => "cross_knee_strike",
17456            PlyoExerciseName::WeightedCrossKneeStrike => "weighted_cross_knee_strike",
17457            PlyoExerciseName::DepthJump => "depth_jump",
17458            PlyoExerciseName::WeightedDepthJump => "weighted_depth_jump",
17459            PlyoExerciseName::DumbbellJumpSquat => "dumbbell_jump_squat",
17460            PlyoExerciseName::DumbbellSplitJump => "dumbbell_split_jump",
17461            PlyoExerciseName::FrontKneeStrike => "front_knee_strike",
17462            PlyoExerciseName::WeightedFrontKneeStrike => "weighted_front_knee_strike",
17463            PlyoExerciseName::HighBoxJump => "high_box_jump",
17464            PlyoExerciseName::WeightedHighBoxJump => "weighted_high_box_jump",
17465            PlyoExerciseName::IsometricExplosiveBodyWeightJumpSquat => {
17466                "isometric_explosive_body_weight_jump_squat"
17467            }
17468            PlyoExerciseName::WeightedIsometricExplosiveJumpSquat => {
17469                "weighted_isometric_explosive_jump_squat"
17470            }
17471            PlyoExerciseName::LateralLeapAndHop => "lateral_leap_and_hop",
17472            PlyoExerciseName::WeightedLateralLeapAndHop => "weighted_lateral_leap_and_hop",
17473            PlyoExerciseName::LateralPlyoSquats => "lateral_plyo_squats",
17474            PlyoExerciseName::WeightedLateralPlyoSquats => "weighted_lateral_plyo_squats",
17475            PlyoExerciseName::LateralSlide => "lateral_slide",
17476            PlyoExerciseName::WeightedLateralSlide => "weighted_lateral_slide",
17477            PlyoExerciseName::MedicineBallOverheadThrows => "medicine_ball_overhead_throws",
17478            PlyoExerciseName::MedicineBallSideThrow => "medicine_ball_side_throw",
17479            PlyoExerciseName::MedicineBallSlam => "medicine_ball_slam",
17480            PlyoExerciseName::SideToSideMedicineBallThrows => "side_to_side_medicine_ball_throws",
17481            PlyoExerciseName::SideToSideShuffleJump => "side_to_side_shuffle_jump",
17482            PlyoExerciseName::WeightedSideToSideShuffleJump => "weighted_side_to_side_shuffle_jump",
17483            PlyoExerciseName::SquatJumpOntoBox => "squat_jump_onto_box",
17484            PlyoExerciseName::WeightedSquatJumpOntoBox => "weighted_squat_jump_onto_box",
17485            PlyoExerciseName::SquatJumpsInAndOut => "squat_jumps_in_and_out",
17486            PlyoExerciseName::WeightedSquatJumpsInAndOut => "weighted_squat_jumps_in_and_out",
17487            PlyoExerciseName::BoxJump => "box_jump",
17488            PlyoExerciseName::BoxJumpOvers => "box_jump_overs",
17489            PlyoExerciseName::BoxJumpOversOverTheBox => "box_jump_overs_over_the_box",
17490            PlyoExerciseName::StarJumpSquats => "star_jump_squats",
17491            PlyoExerciseName::JumpSquat => "jump_squat",
17492        }
17493    }
17494
17495    /// Try to construct from the underlying numeric value.
17496    pub fn from_value(value: u16) -> Option<Self> {
17497        match value {
17498            0 => Some(PlyoExerciseName::AlternatingJumpLunge),
17499            1 => Some(PlyoExerciseName::WeightedAlternatingJumpLunge),
17500            2 => Some(PlyoExerciseName::BarbellJumpSquat),
17501            3 => Some(PlyoExerciseName::BodyWeightJumpSquat),
17502            4 => Some(PlyoExerciseName::WeightedJumpSquat),
17503            5 => Some(PlyoExerciseName::CrossKneeStrike),
17504            6 => Some(PlyoExerciseName::WeightedCrossKneeStrike),
17505            7 => Some(PlyoExerciseName::DepthJump),
17506            8 => Some(PlyoExerciseName::WeightedDepthJump),
17507            9 => Some(PlyoExerciseName::DumbbellJumpSquat),
17508            10 => Some(PlyoExerciseName::DumbbellSplitJump),
17509            11 => Some(PlyoExerciseName::FrontKneeStrike),
17510            12 => Some(PlyoExerciseName::WeightedFrontKneeStrike),
17511            13 => Some(PlyoExerciseName::HighBoxJump),
17512            14 => Some(PlyoExerciseName::WeightedHighBoxJump),
17513            15 => Some(PlyoExerciseName::IsometricExplosiveBodyWeightJumpSquat),
17514            16 => Some(PlyoExerciseName::WeightedIsometricExplosiveJumpSquat),
17515            17 => Some(PlyoExerciseName::LateralLeapAndHop),
17516            18 => Some(PlyoExerciseName::WeightedLateralLeapAndHop),
17517            19 => Some(PlyoExerciseName::LateralPlyoSquats),
17518            20 => Some(PlyoExerciseName::WeightedLateralPlyoSquats),
17519            21 => Some(PlyoExerciseName::LateralSlide),
17520            22 => Some(PlyoExerciseName::WeightedLateralSlide),
17521            23 => Some(PlyoExerciseName::MedicineBallOverheadThrows),
17522            24 => Some(PlyoExerciseName::MedicineBallSideThrow),
17523            25 => Some(PlyoExerciseName::MedicineBallSlam),
17524            26 => Some(PlyoExerciseName::SideToSideMedicineBallThrows),
17525            27 => Some(PlyoExerciseName::SideToSideShuffleJump),
17526            28 => Some(PlyoExerciseName::WeightedSideToSideShuffleJump),
17527            29 => Some(PlyoExerciseName::SquatJumpOntoBox),
17528            30 => Some(PlyoExerciseName::WeightedSquatJumpOntoBox),
17529            31 => Some(PlyoExerciseName::SquatJumpsInAndOut),
17530            32 => Some(PlyoExerciseName::WeightedSquatJumpsInAndOut),
17531            33 => Some(PlyoExerciseName::BoxJump),
17532            34 => Some(PlyoExerciseName::BoxJumpOvers),
17533            35 => Some(PlyoExerciseName::BoxJumpOversOverTheBox),
17534            36 => Some(PlyoExerciseName::StarJumpSquats),
17535            37 => Some(PlyoExerciseName::JumpSquat),
17536            _ => None,
17537        }
17538    }
17539
17540    /// Try to construct from the snake-case canonical name.
17541    pub fn from_str(name: &str) -> Option<Self> {
17542        match name {
17543            "alternating_jump_lunge" => Some(PlyoExerciseName::AlternatingJumpLunge),
17544            "weighted_alternating_jump_lunge" => {
17545                Some(PlyoExerciseName::WeightedAlternatingJumpLunge)
17546            }
17547            "barbell_jump_squat" => Some(PlyoExerciseName::BarbellJumpSquat),
17548            "body_weight_jump_squat" => Some(PlyoExerciseName::BodyWeightJumpSquat),
17549            "weighted_jump_squat" => Some(PlyoExerciseName::WeightedJumpSquat),
17550            "cross_knee_strike" => Some(PlyoExerciseName::CrossKneeStrike),
17551            "weighted_cross_knee_strike" => Some(PlyoExerciseName::WeightedCrossKneeStrike),
17552            "depth_jump" => Some(PlyoExerciseName::DepthJump),
17553            "weighted_depth_jump" => Some(PlyoExerciseName::WeightedDepthJump),
17554            "dumbbell_jump_squat" => Some(PlyoExerciseName::DumbbellJumpSquat),
17555            "dumbbell_split_jump" => Some(PlyoExerciseName::DumbbellSplitJump),
17556            "front_knee_strike" => Some(PlyoExerciseName::FrontKneeStrike),
17557            "weighted_front_knee_strike" => Some(PlyoExerciseName::WeightedFrontKneeStrike),
17558            "high_box_jump" => Some(PlyoExerciseName::HighBoxJump),
17559            "weighted_high_box_jump" => Some(PlyoExerciseName::WeightedHighBoxJump),
17560            "isometric_explosive_body_weight_jump_squat" => {
17561                Some(PlyoExerciseName::IsometricExplosiveBodyWeightJumpSquat)
17562            }
17563            "weighted_isometric_explosive_jump_squat" => {
17564                Some(PlyoExerciseName::WeightedIsometricExplosiveJumpSquat)
17565            }
17566            "lateral_leap_and_hop" => Some(PlyoExerciseName::LateralLeapAndHop),
17567            "weighted_lateral_leap_and_hop" => Some(PlyoExerciseName::WeightedLateralLeapAndHop),
17568            "lateral_plyo_squats" => Some(PlyoExerciseName::LateralPlyoSquats),
17569            "weighted_lateral_plyo_squats" => Some(PlyoExerciseName::WeightedLateralPlyoSquats),
17570            "lateral_slide" => Some(PlyoExerciseName::LateralSlide),
17571            "weighted_lateral_slide" => Some(PlyoExerciseName::WeightedLateralSlide),
17572            "medicine_ball_overhead_throws" => Some(PlyoExerciseName::MedicineBallOverheadThrows),
17573            "medicine_ball_side_throw" => Some(PlyoExerciseName::MedicineBallSideThrow),
17574            "medicine_ball_slam" => Some(PlyoExerciseName::MedicineBallSlam),
17575            "side_to_side_medicine_ball_throws" => {
17576                Some(PlyoExerciseName::SideToSideMedicineBallThrows)
17577            }
17578            "side_to_side_shuffle_jump" => Some(PlyoExerciseName::SideToSideShuffleJump),
17579            "weighted_side_to_side_shuffle_jump" => {
17580                Some(PlyoExerciseName::WeightedSideToSideShuffleJump)
17581            }
17582            "squat_jump_onto_box" => Some(PlyoExerciseName::SquatJumpOntoBox),
17583            "weighted_squat_jump_onto_box" => Some(PlyoExerciseName::WeightedSquatJumpOntoBox),
17584            "squat_jumps_in_and_out" => Some(PlyoExerciseName::SquatJumpsInAndOut),
17585            "weighted_squat_jumps_in_and_out" => Some(PlyoExerciseName::WeightedSquatJumpsInAndOut),
17586            "box_jump" => Some(PlyoExerciseName::BoxJump),
17587            "box_jump_overs" => Some(PlyoExerciseName::BoxJumpOvers),
17588            "box_jump_overs_over_the_box" => Some(PlyoExerciseName::BoxJumpOversOverTheBox),
17589            "star_jump_squats" => Some(PlyoExerciseName::StarJumpSquats),
17590            "jump_squat" => Some(PlyoExerciseName::JumpSquat),
17591            _ => None,
17592        }
17593    }
17594}
17595
17596#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
17597#[repr(u16)]
17598#[non_exhaustive]
17599pub enum PullUpExerciseName {
17600    BandedPullUps = 0,
17601    _30DegreeLatPulldown = 1,
17602    BandAssistedChinUp = 2,
17603    CloseGripChinUp = 3,
17604    WeightedCloseGripChinUp = 4,
17605    CloseGripLatPulldown = 5,
17606    CrossoverChinUp = 6,
17607    WeightedCrossoverChinUp = 7,
17608    EzBarPullover = 8,
17609    HangingHurdle = 9,
17610    WeightedHangingHurdle = 10,
17611    KneelingLatPulldown = 11,
17612    KneelingUnderhandGripLatPulldown = 12,
17613    LatPulldown = 13,
17614    MixedGripChinUp = 14,
17615    WeightedMixedGripChinUp = 15,
17616    MixedGripPullUp = 16,
17617    WeightedMixedGripPullUp = 17,
17618    ReverseGripPulldown = 18,
17619    StandingCablePullover = 19,
17620    StraightArmPulldown = 20,
17621    SwissBallEzBarPullover = 21,
17622    TowelPullUp = 22,
17623    WeightedTowelPullUp = 23,
17624    WeightedPullUp = 24,
17625    WideGripLatPulldown = 25,
17626    WideGripPullUp = 26,
17627    WeightedWideGripPullUp = 27,
17628    BurpeePullUp = 28,
17629    WeightedBurpeePullUp = 29,
17630    JumpingPullUps = 30,
17631    WeightedJumpingPullUps = 31,
17632    KippingPullUp = 32,
17633    WeightedKippingPullUp = 33,
17634    LPullUp = 34,
17635    WeightedLPullUp = 35,
17636    SuspendedChinUp = 36,
17637    WeightedSuspendedChinUp = 37,
17638    PullUp = 38,
17639    ChinUp = 39,
17640    NeutralGripChinUp = 40,
17641    WeightedChinUp = 41,
17642    BandAssistedPullUp = 42,
17643    NeutralGripPullUp = 43,
17644    WeightedNeutralGripChinUp = 44,
17645    WeightedNeutralGripPullUp = 45,
17646}
17647
17648impl PullUpExerciseName {
17649    /// Snake-case canonical name from Profile.xlsx.
17650    pub fn as_str(&self) -> &'static str {
17651        match self {
17652            PullUpExerciseName::BandedPullUps => "banded_pull_ups",
17653            PullUpExerciseName::_30DegreeLatPulldown => "30_degree_lat_pulldown",
17654            PullUpExerciseName::BandAssistedChinUp => "band_assisted_chin_up",
17655            PullUpExerciseName::CloseGripChinUp => "close_grip_chin_up",
17656            PullUpExerciseName::WeightedCloseGripChinUp => "weighted_close_grip_chin_up",
17657            PullUpExerciseName::CloseGripLatPulldown => "close_grip_lat_pulldown",
17658            PullUpExerciseName::CrossoverChinUp => "crossover_chin_up",
17659            PullUpExerciseName::WeightedCrossoverChinUp => "weighted_crossover_chin_up",
17660            PullUpExerciseName::EzBarPullover => "ez_bar_pullover",
17661            PullUpExerciseName::HangingHurdle => "hanging_hurdle",
17662            PullUpExerciseName::WeightedHangingHurdle => "weighted_hanging_hurdle",
17663            PullUpExerciseName::KneelingLatPulldown => "kneeling_lat_pulldown",
17664            PullUpExerciseName::KneelingUnderhandGripLatPulldown => {
17665                "kneeling_underhand_grip_lat_pulldown"
17666            }
17667            PullUpExerciseName::LatPulldown => "lat_pulldown",
17668            PullUpExerciseName::MixedGripChinUp => "mixed_grip_chin_up",
17669            PullUpExerciseName::WeightedMixedGripChinUp => "weighted_mixed_grip_chin_up",
17670            PullUpExerciseName::MixedGripPullUp => "mixed_grip_pull_up",
17671            PullUpExerciseName::WeightedMixedGripPullUp => "weighted_mixed_grip_pull_up",
17672            PullUpExerciseName::ReverseGripPulldown => "reverse_grip_pulldown",
17673            PullUpExerciseName::StandingCablePullover => "standing_cable_pullover",
17674            PullUpExerciseName::StraightArmPulldown => "straight_arm_pulldown",
17675            PullUpExerciseName::SwissBallEzBarPullover => "swiss_ball_ez_bar_pullover",
17676            PullUpExerciseName::TowelPullUp => "towel_pull_up",
17677            PullUpExerciseName::WeightedTowelPullUp => "weighted_towel_pull_up",
17678            PullUpExerciseName::WeightedPullUp => "weighted_pull_up",
17679            PullUpExerciseName::WideGripLatPulldown => "wide_grip_lat_pulldown",
17680            PullUpExerciseName::WideGripPullUp => "wide_grip_pull_up",
17681            PullUpExerciseName::WeightedWideGripPullUp => "weighted_wide_grip_pull_up",
17682            PullUpExerciseName::BurpeePullUp => "burpee_pull_up",
17683            PullUpExerciseName::WeightedBurpeePullUp => "weighted_burpee_pull_up",
17684            PullUpExerciseName::JumpingPullUps => "jumping_pull_ups",
17685            PullUpExerciseName::WeightedJumpingPullUps => "weighted_jumping_pull_ups",
17686            PullUpExerciseName::KippingPullUp => "kipping_pull_up",
17687            PullUpExerciseName::WeightedKippingPullUp => "weighted_kipping_pull_up",
17688            PullUpExerciseName::LPullUp => "l_pull_up",
17689            PullUpExerciseName::WeightedLPullUp => "weighted_l_pull_up",
17690            PullUpExerciseName::SuspendedChinUp => "suspended_chin_up",
17691            PullUpExerciseName::WeightedSuspendedChinUp => "weighted_suspended_chin_up",
17692            PullUpExerciseName::PullUp => "pull_up",
17693            PullUpExerciseName::ChinUp => "chin_up",
17694            PullUpExerciseName::NeutralGripChinUp => "neutral_grip_chin_up",
17695            PullUpExerciseName::WeightedChinUp => "weighted_chin_up",
17696            PullUpExerciseName::BandAssistedPullUp => "band_assisted_pull_up",
17697            PullUpExerciseName::NeutralGripPullUp => "neutral_grip_pull_up",
17698            PullUpExerciseName::WeightedNeutralGripChinUp => "weighted_neutral_grip_chin_up",
17699            PullUpExerciseName::WeightedNeutralGripPullUp => "weighted_neutral_grip_pull_up",
17700        }
17701    }
17702
17703    /// Try to construct from the underlying numeric value.
17704    pub fn from_value(value: u16) -> Option<Self> {
17705        match value {
17706            0 => Some(PullUpExerciseName::BandedPullUps),
17707            1 => Some(PullUpExerciseName::_30DegreeLatPulldown),
17708            2 => Some(PullUpExerciseName::BandAssistedChinUp),
17709            3 => Some(PullUpExerciseName::CloseGripChinUp),
17710            4 => Some(PullUpExerciseName::WeightedCloseGripChinUp),
17711            5 => Some(PullUpExerciseName::CloseGripLatPulldown),
17712            6 => Some(PullUpExerciseName::CrossoverChinUp),
17713            7 => Some(PullUpExerciseName::WeightedCrossoverChinUp),
17714            8 => Some(PullUpExerciseName::EzBarPullover),
17715            9 => Some(PullUpExerciseName::HangingHurdle),
17716            10 => Some(PullUpExerciseName::WeightedHangingHurdle),
17717            11 => Some(PullUpExerciseName::KneelingLatPulldown),
17718            12 => Some(PullUpExerciseName::KneelingUnderhandGripLatPulldown),
17719            13 => Some(PullUpExerciseName::LatPulldown),
17720            14 => Some(PullUpExerciseName::MixedGripChinUp),
17721            15 => Some(PullUpExerciseName::WeightedMixedGripChinUp),
17722            16 => Some(PullUpExerciseName::MixedGripPullUp),
17723            17 => Some(PullUpExerciseName::WeightedMixedGripPullUp),
17724            18 => Some(PullUpExerciseName::ReverseGripPulldown),
17725            19 => Some(PullUpExerciseName::StandingCablePullover),
17726            20 => Some(PullUpExerciseName::StraightArmPulldown),
17727            21 => Some(PullUpExerciseName::SwissBallEzBarPullover),
17728            22 => Some(PullUpExerciseName::TowelPullUp),
17729            23 => Some(PullUpExerciseName::WeightedTowelPullUp),
17730            24 => Some(PullUpExerciseName::WeightedPullUp),
17731            25 => Some(PullUpExerciseName::WideGripLatPulldown),
17732            26 => Some(PullUpExerciseName::WideGripPullUp),
17733            27 => Some(PullUpExerciseName::WeightedWideGripPullUp),
17734            28 => Some(PullUpExerciseName::BurpeePullUp),
17735            29 => Some(PullUpExerciseName::WeightedBurpeePullUp),
17736            30 => Some(PullUpExerciseName::JumpingPullUps),
17737            31 => Some(PullUpExerciseName::WeightedJumpingPullUps),
17738            32 => Some(PullUpExerciseName::KippingPullUp),
17739            33 => Some(PullUpExerciseName::WeightedKippingPullUp),
17740            34 => Some(PullUpExerciseName::LPullUp),
17741            35 => Some(PullUpExerciseName::WeightedLPullUp),
17742            36 => Some(PullUpExerciseName::SuspendedChinUp),
17743            37 => Some(PullUpExerciseName::WeightedSuspendedChinUp),
17744            38 => Some(PullUpExerciseName::PullUp),
17745            39 => Some(PullUpExerciseName::ChinUp),
17746            40 => Some(PullUpExerciseName::NeutralGripChinUp),
17747            41 => Some(PullUpExerciseName::WeightedChinUp),
17748            42 => Some(PullUpExerciseName::BandAssistedPullUp),
17749            43 => Some(PullUpExerciseName::NeutralGripPullUp),
17750            44 => Some(PullUpExerciseName::WeightedNeutralGripChinUp),
17751            45 => Some(PullUpExerciseName::WeightedNeutralGripPullUp),
17752            _ => None,
17753        }
17754    }
17755
17756    /// Try to construct from the snake-case canonical name.
17757    pub fn from_str(name: &str) -> Option<Self> {
17758        match name {
17759            "banded_pull_ups" => Some(PullUpExerciseName::BandedPullUps),
17760            "30_degree_lat_pulldown" => Some(PullUpExerciseName::_30DegreeLatPulldown),
17761            "band_assisted_chin_up" => Some(PullUpExerciseName::BandAssistedChinUp),
17762            "close_grip_chin_up" => Some(PullUpExerciseName::CloseGripChinUp),
17763            "weighted_close_grip_chin_up" => Some(PullUpExerciseName::WeightedCloseGripChinUp),
17764            "close_grip_lat_pulldown" => Some(PullUpExerciseName::CloseGripLatPulldown),
17765            "crossover_chin_up" => Some(PullUpExerciseName::CrossoverChinUp),
17766            "weighted_crossover_chin_up" => Some(PullUpExerciseName::WeightedCrossoverChinUp),
17767            "ez_bar_pullover" => Some(PullUpExerciseName::EzBarPullover),
17768            "hanging_hurdle" => Some(PullUpExerciseName::HangingHurdle),
17769            "weighted_hanging_hurdle" => Some(PullUpExerciseName::WeightedHangingHurdle),
17770            "kneeling_lat_pulldown" => Some(PullUpExerciseName::KneelingLatPulldown),
17771            "kneeling_underhand_grip_lat_pulldown" => {
17772                Some(PullUpExerciseName::KneelingUnderhandGripLatPulldown)
17773            }
17774            "lat_pulldown" => Some(PullUpExerciseName::LatPulldown),
17775            "mixed_grip_chin_up" => Some(PullUpExerciseName::MixedGripChinUp),
17776            "weighted_mixed_grip_chin_up" => Some(PullUpExerciseName::WeightedMixedGripChinUp),
17777            "mixed_grip_pull_up" => Some(PullUpExerciseName::MixedGripPullUp),
17778            "weighted_mixed_grip_pull_up" => Some(PullUpExerciseName::WeightedMixedGripPullUp),
17779            "reverse_grip_pulldown" => Some(PullUpExerciseName::ReverseGripPulldown),
17780            "standing_cable_pullover" => Some(PullUpExerciseName::StandingCablePullover),
17781            "straight_arm_pulldown" => Some(PullUpExerciseName::StraightArmPulldown),
17782            "swiss_ball_ez_bar_pullover" => Some(PullUpExerciseName::SwissBallEzBarPullover),
17783            "towel_pull_up" => Some(PullUpExerciseName::TowelPullUp),
17784            "weighted_towel_pull_up" => Some(PullUpExerciseName::WeightedTowelPullUp),
17785            "weighted_pull_up" => Some(PullUpExerciseName::WeightedPullUp),
17786            "wide_grip_lat_pulldown" => Some(PullUpExerciseName::WideGripLatPulldown),
17787            "wide_grip_pull_up" => Some(PullUpExerciseName::WideGripPullUp),
17788            "weighted_wide_grip_pull_up" => Some(PullUpExerciseName::WeightedWideGripPullUp),
17789            "burpee_pull_up" => Some(PullUpExerciseName::BurpeePullUp),
17790            "weighted_burpee_pull_up" => Some(PullUpExerciseName::WeightedBurpeePullUp),
17791            "jumping_pull_ups" => Some(PullUpExerciseName::JumpingPullUps),
17792            "weighted_jumping_pull_ups" => Some(PullUpExerciseName::WeightedJumpingPullUps),
17793            "kipping_pull_up" => Some(PullUpExerciseName::KippingPullUp),
17794            "weighted_kipping_pull_up" => Some(PullUpExerciseName::WeightedKippingPullUp),
17795            "l_pull_up" => Some(PullUpExerciseName::LPullUp),
17796            "weighted_l_pull_up" => Some(PullUpExerciseName::WeightedLPullUp),
17797            "suspended_chin_up" => Some(PullUpExerciseName::SuspendedChinUp),
17798            "weighted_suspended_chin_up" => Some(PullUpExerciseName::WeightedSuspendedChinUp),
17799            "pull_up" => Some(PullUpExerciseName::PullUp),
17800            "chin_up" => Some(PullUpExerciseName::ChinUp),
17801            "neutral_grip_chin_up" => Some(PullUpExerciseName::NeutralGripChinUp),
17802            "weighted_chin_up" => Some(PullUpExerciseName::WeightedChinUp),
17803            "band_assisted_pull_up" => Some(PullUpExerciseName::BandAssistedPullUp),
17804            "neutral_grip_pull_up" => Some(PullUpExerciseName::NeutralGripPullUp),
17805            "weighted_neutral_grip_chin_up" => Some(PullUpExerciseName::WeightedNeutralGripChinUp),
17806            "weighted_neutral_grip_pull_up" => Some(PullUpExerciseName::WeightedNeutralGripPullUp),
17807            _ => None,
17808        }
17809    }
17810}
17811
17812#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
17813#[repr(u16)]
17814#[non_exhaustive]
17815pub enum PushUpExerciseName {
17816    ChestPressWithBand = 0,
17817    AlternatingStaggeredPushUp = 1,
17818    WeightedAlternatingStaggeredPushUp = 2,
17819    AlternatingHandsMedicineBallPushUp = 3,
17820    WeightedAlternatingHandsMedicineBallPushUp = 4,
17821    BosuBallPushUp = 5,
17822    WeightedBosuBallPushUp = 6,
17823    ClappingPushUp = 7,
17824    WeightedClappingPushUp = 8,
17825    CloseGripMedicineBallPushUp = 9,
17826    WeightedCloseGripMedicineBallPushUp = 10,
17827    CloseHandsPushUp = 11,
17828    WeightedCloseHandsPushUp = 12,
17829    DeclinePushUp = 13,
17830    WeightedDeclinePushUp = 14,
17831    DiamondPushUp = 15,
17832    WeightedDiamondPushUp = 16,
17833    ExplosiveCrossoverPushUp = 17,
17834    WeightedExplosiveCrossoverPushUp = 18,
17835    ExplosivePushUp = 19,
17836    WeightedExplosivePushUp = 20,
17837    FeetElevatedSideToSidePushUp = 21,
17838    WeightedFeetElevatedSideToSidePushUp = 22,
17839    HandReleasePushUp = 23,
17840    WeightedHandReleasePushUp = 24,
17841    HandstandPushUp = 25,
17842    WeightedHandstandPushUp = 26,
17843    InclinePushUp = 27,
17844    WeightedInclinePushUp = 28,
17845    IsometricExplosivePushUp = 29,
17846    WeightedIsometricExplosivePushUp = 30,
17847    JudoPushUp = 31,
17848    WeightedJudoPushUp = 32,
17849    KneelingPushUp = 33,
17850    WeightedKneelingPushUp = 34,
17851    MedicineBallChestPass = 35,
17852    MedicineBallPushUp = 36,
17853    WeightedMedicineBallPushUp = 37,
17854    OneArmPushUp = 38,
17855    WeightedOneArmPushUp = 39,
17856    WeightedPushUp = 40,
17857    PushUpAndRow = 41,
17858    WeightedPushUpAndRow = 42,
17859    PushUpPlus = 43,
17860    WeightedPushUpPlus = 44,
17861    PushUpWithFeetOnSwissBall = 45,
17862    WeightedPushUpWithFeetOnSwissBall = 46,
17863    PushUpWithOneHandOnMedicineBall = 47,
17864    WeightedPushUpWithOneHandOnMedicineBall = 48,
17865    ShoulderPushUp = 49,
17866    WeightedShoulderPushUp = 50,
17867    SingleArmMedicineBallPushUp = 51,
17868    WeightedSingleArmMedicineBallPushUp = 52,
17869    SpidermanPushUp = 53,
17870    WeightedSpidermanPushUp = 54,
17871    StackedFeetPushUp = 55,
17872    WeightedStackedFeetPushUp = 56,
17873    StaggeredHandsPushUp = 57,
17874    WeightedStaggeredHandsPushUp = 58,
17875    SuspendedPushUp = 59,
17876    WeightedSuspendedPushUp = 60,
17877    SwissBallPushUp = 61,
17878    WeightedSwissBallPushUp = 62,
17879    SwissBallPushUpPlus = 63,
17880    WeightedSwissBallPushUpPlus = 64,
17881    TPushUp = 65,
17882    WeightedTPushUp = 66,
17883    TripleStopPushUp = 67,
17884    WeightedTripleStopPushUp = 68,
17885    WideHandsPushUp = 69,
17886    WeightedWideHandsPushUp = 70,
17887    ParalletteHandstandPushUp = 71,
17888    WeightedParalletteHandstandPushUp = 72,
17889    RingHandstandPushUp = 73,
17890    WeightedRingHandstandPushUp = 74,
17891    RingPushUp = 75,
17892    WeightedRingPushUp = 76,
17893    PushUp = 77,
17894    PilatesPushup = 78,
17895    DynamicPushUp = 79,
17896    KippingHandstandPushUp = 80,
17897    ShoulderTappingPushUp = 81,
17898    BicepsPushUp = 82,
17899    HinduPushUp = 83,
17900    PikePushUp = 84,
17901    WideGripPushUp = 85,
17902    WeightedBicepsPushUp = 86,
17903    WeightedHinduPushUp = 87,
17904    WeightedPikePushUp = 88,
17905    KippingParalletteHandstandPushUp = 89,
17906    WallPushUp = 90,
17907}
17908
17909impl PushUpExerciseName {
17910    /// Snake-case canonical name from Profile.xlsx.
17911    pub fn as_str(&self) -> &'static str {
17912        match self {
17913            PushUpExerciseName::ChestPressWithBand => "chest_press_with_band",
17914            PushUpExerciseName::AlternatingStaggeredPushUp => "alternating_staggered_push_up",
17915            PushUpExerciseName::WeightedAlternatingStaggeredPushUp => {
17916                "weighted_alternating_staggered_push_up"
17917            }
17918            PushUpExerciseName::AlternatingHandsMedicineBallPushUp => {
17919                "alternating_hands_medicine_ball_push_up"
17920            }
17921            PushUpExerciseName::WeightedAlternatingHandsMedicineBallPushUp => {
17922                "weighted_alternating_hands_medicine_ball_push_up"
17923            }
17924            PushUpExerciseName::BosuBallPushUp => "bosu_ball_push_up",
17925            PushUpExerciseName::WeightedBosuBallPushUp => "weighted_bosu_ball_push_up",
17926            PushUpExerciseName::ClappingPushUp => "clapping_push_up",
17927            PushUpExerciseName::WeightedClappingPushUp => "weighted_clapping_push_up",
17928            PushUpExerciseName::CloseGripMedicineBallPushUp => "close_grip_medicine_ball_push_up",
17929            PushUpExerciseName::WeightedCloseGripMedicineBallPushUp => {
17930                "weighted_close_grip_medicine_ball_push_up"
17931            }
17932            PushUpExerciseName::CloseHandsPushUp => "close_hands_push_up",
17933            PushUpExerciseName::WeightedCloseHandsPushUp => "weighted_close_hands_push_up",
17934            PushUpExerciseName::DeclinePushUp => "decline_push_up",
17935            PushUpExerciseName::WeightedDeclinePushUp => "weighted_decline_push_up",
17936            PushUpExerciseName::DiamondPushUp => "diamond_push_up",
17937            PushUpExerciseName::WeightedDiamondPushUp => "weighted_diamond_push_up",
17938            PushUpExerciseName::ExplosiveCrossoverPushUp => "explosive_crossover_push_up",
17939            PushUpExerciseName::WeightedExplosiveCrossoverPushUp => {
17940                "weighted_explosive_crossover_push_up"
17941            }
17942            PushUpExerciseName::ExplosivePushUp => "explosive_push_up",
17943            PushUpExerciseName::WeightedExplosivePushUp => "weighted_explosive_push_up",
17944            PushUpExerciseName::FeetElevatedSideToSidePushUp => {
17945                "feet_elevated_side_to_side_push_up"
17946            }
17947            PushUpExerciseName::WeightedFeetElevatedSideToSidePushUp => {
17948                "weighted_feet_elevated_side_to_side_push_up"
17949            }
17950            PushUpExerciseName::HandReleasePushUp => "hand_release_push_up",
17951            PushUpExerciseName::WeightedHandReleasePushUp => "weighted_hand_release_push_up",
17952            PushUpExerciseName::HandstandPushUp => "handstand_push_up",
17953            PushUpExerciseName::WeightedHandstandPushUp => "weighted_handstand_push_up",
17954            PushUpExerciseName::InclinePushUp => "incline_push_up",
17955            PushUpExerciseName::WeightedInclinePushUp => "weighted_incline_push_up",
17956            PushUpExerciseName::IsometricExplosivePushUp => "isometric_explosive_push_up",
17957            PushUpExerciseName::WeightedIsometricExplosivePushUp => {
17958                "weighted_isometric_explosive_push_up"
17959            }
17960            PushUpExerciseName::JudoPushUp => "judo_push_up",
17961            PushUpExerciseName::WeightedJudoPushUp => "weighted_judo_push_up",
17962            PushUpExerciseName::KneelingPushUp => "kneeling_push_up",
17963            PushUpExerciseName::WeightedKneelingPushUp => "weighted_kneeling_push_up",
17964            PushUpExerciseName::MedicineBallChestPass => "medicine_ball_chest_pass",
17965            PushUpExerciseName::MedicineBallPushUp => "medicine_ball_push_up",
17966            PushUpExerciseName::WeightedMedicineBallPushUp => "weighted_medicine_ball_push_up",
17967            PushUpExerciseName::OneArmPushUp => "one_arm_push_up",
17968            PushUpExerciseName::WeightedOneArmPushUp => "weighted_one_arm_push_up",
17969            PushUpExerciseName::WeightedPushUp => "weighted_push_up",
17970            PushUpExerciseName::PushUpAndRow => "push_up_and_row",
17971            PushUpExerciseName::WeightedPushUpAndRow => "weighted_push_up_and_row",
17972            PushUpExerciseName::PushUpPlus => "push_up_plus",
17973            PushUpExerciseName::WeightedPushUpPlus => "weighted_push_up_plus",
17974            PushUpExerciseName::PushUpWithFeetOnSwissBall => "push_up_with_feet_on_swiss_ball",
17975            PushUpExerciseName::WeightedPushUpWithFeetOnSwissBall => {
17976                "weighted_push_up_with_feet_on_swiss_ball"
17977            }
17978            PushUpExerciseName::PushUpWithOneHandOnMedicineBall => {
17979                "push_up_with_one_hand_on_medicine_ball"
17980            }
17981            PushUpExerciseName::WeightedPushUpWithOneHandOnMedicineBall => {
17982                "weighted_push_up_with_one_hand_on_medicine_ball"
17983            }
17984            PushUpExerciseName::ShoulderPushUp => "shoulder_push_up",
17985            PushUpExerciseName::WeightedShoulderPushUp => "weighted_shoulder_push_up",
17986            PushUpExerciseName::SingleArmMedicineBallPushUp => "single_arm_medicine_ball_push_up",
17987            PushUpExerciseName::WeightedSingleArmMedicineBallPushUp => {
17988                "weighted_single_arm_medicine_ball_push_up"
17989            }
17990            PushUpExerciseName::SpidermanPushUp => "spiderman_push_up",
17991            PushUpExerciseName::WeightedSpidermanPushUp => "weighted_spiderman_push_up",
17992            PushUpExerciseName::StackedFeetPushUp => "stacked_feet_push_up",
17993            PushUpExerciseName::WeightedStackedFeetPushUp => "weighted_stacked_feet_push_up",
17994            PushUpExerciseName::StaggeredHandsPushUp => "staggered_hands_push_up",
17995            PushUpExerciseName::WeightedStaggeredHandsPushUp => "weighted_staggered_hands_push_up",
17996            PushUpExerciseName::SuspendedPushUp => "suspended_push_up",
17997            PushUpExerciseName::WeightedSuspendedPushUp => "weighted_suspended_push_up",
17998            PushUpExerciseName::SwissBallPushUp => "swiss_ball_push_up",
17999            PushUpExerciseName::WeightedSwissBallPushUp => "weighted_swiss_ball_push_up",
18000            PushUpExerciseName::SwissBallPushUpPlus => "swiss_ball_push_up_plus",
18001            PushUpExerciseName::WeightedSwissBallPushUpPlus => "weighted_swiss_ball_push_up_plus",
18002            PushUpExerciseName::TPushUp => "t_push_up",
18003            PushUpExerciseName::WeightedTPushUp => "weighted_t_push_up",
18004            PushUpExerciseName::TripleStopPushUp => "triple_stop_push_up",
18005            PushUpExerciseName::WeightedTripleStopPushUp => "weighted_triple_stop_push_up",
18006            PushUpExerciseName::WideHandsPushUp => "wide_hands_push_up",
18007            PushUpExerciseName::WeightedWideHandsPushUp => "weighted_wide_hands_push_up",
18008            PushUpExerciseName::ParalletteHandstandPushUp => "parallette_handstand_push_up",
18009            PushUpExerciseName::WeightedParalletteHandstandPushUp => {
18010                "weighted_parallette_handstand_push_up"
18011            }
18012            PushUpExerciseName::RingHandstandPushUp => "ring_handstand_push_up",
18013            PushUpExerciseName::WeightedRingHandstandPushUp => "weighted_ring_handstand_push_up",
18014            PushUpExerciseName::RingPushUp => "ring_push_up",
18015            PushUpExerciseName::WeightedRingPushUp => "weighted_ring_push_up",
18016            PushUpExerciseName::PushUp => "push_up",
18017            PushUpExerciseName::PilatesPushup => "pilates_pushup",
18018            PushUpExerciseName::DynamicPushUp => "dynamic_push_up",
18019            PushUpExerciseName::KippingHandstandPushUp => "kipping_handstand_push_up",
18020            PushUpExerciseName::ShoulderTappingPushUp => "shoulder_tapping_push_up",
18021            PushUpExerciseName::BicepsPushUp => "biceps_push_up",
18022            PushUpExerciseName::HinduPushUp => "hindu_push_up",
18023            PushUpExerciseName::PikePushUp => "pike_push_up",
18024            PushUpExerciseName::WideGripPushUp => "wide_grip_push_up",
18025            PushUpExerciseName::WeightedBicepsPushUp => "weighted_biceps_push_up",
18026            PushUpExerciseName::WeightedHinduPushUp => "weighted_hindu_push_up",
18027            PushUpExerciseName::WeightedPikePushUp => "weighted_pike_push_up",
18028            PushUpExerciseName::KippingParalletteHandstandPushUp => {
18029                "kipping_parallette_handstand_push_up"
18030            }
18031            PushUpExerciseName::WallPushUp => "wall_push_up",
18032        }
18033    }
18034
18035    /// Try to construct from the underlying numeric value.
18036    pub fn from_value(value: u16) -> Option<Self> {
18037        match value {
18038            0 => Some(PushUpExerciseName::ChestPressWithBand),
18039            1 => Some(PushUpExerciseName::AlternatingStaggeredPushUp),
18040            2 => Some(PushUpExerciseName::WeightedAlternatingStaggeredPushUp),
18041            3 => Some(PushUpExerciseName::AlternatingHandsMedicineBallPushUp),
18042            4 => Some(PushUpExerciseName::WeightedAlternatingHandsMedicineBallPushUp),
18043            5 => Some(PushUpExerciseName::BosuBallPushUp),
18044            6 => Some(PushUpExerciseName::WeightedBosuBallPushUp),
18045            7 => Some(PushUpExerciseName::ClappingPushUp),
18046            8 => Some(PushUpExerciseName::WeightedClappingPushUp),
18047            9 => Some(PushUpExerciseName::CloseGripMedicineBallPushUp),
18048            10 => Some(PushUpExerciseName::WeightedCloseGripMedicineBallPushUp),
18049            11 => Some(PushUpExerciseName::CloseHandsPushUp),
18050            12 => Some(PushUpExerciseName::WeightedCloseHandsPushUp),
18051            13 => Some(PushUpExerciseName::DeclinePushUp),
18052            14 => Some(PushUpExerciseName::WeightedDeclinePushUp),
18053            15 => Some(PushUpExerciseName::DiamondPushUp),
18054            16 => Some(PushUpExerciseName::WeightedDiamondPushUp),
18055            17 => Some(PushUpExerciseName::ExplosiveCrossoverPushUp),
18056            18 => Some(PushUpExerciseName::WeightedExplosiveCrossoverPushUp),
18057            19 => Some(PushUpExerciseName::ExplosivePushUp),
18058            20 => Some(PushUpExerciseName::WeightedExplosivePushUp),
18059            21 => Some(PushUpExerciseName::FeetElevatedSideToSidePushUp),
18060            22 => Some(PushUpExerciseName::WeightedFeetElevatedSideToSidePushUp),
18061            23 => Some(PushUpExerciseName::HandReleasePushUp),
18062            24 => Some(PushUpExerciseName::WeightedHandReleasePushUp),
18063            25 => Some(PushUpExerciseName::HandstandPushUp),
18064            26 => Some(PushUpExerciseName::WeightedHandstandPushUp),
18065            27 => Some(PushUpExerciseName::InclinePushUp),
18066            28 => Some(PushUpExerciseName::WeightedInclinePushUp),
18067            29 => Some(PushUpExerciseName::IsometricExplosivePushUp),
18068            30 => Some(PushUpExerciseName::WeightedIsometricExplosivePushUp),
18069            31 => Some(PushUpExerciseName::JudoPushUp),
18070            32 => Some(PushUpExerciseName::WeightedJudoPushUp),
18071            33 => Some(PushUpExerciseName::KneelingPushUp),
18072            34 => Some(PushUpExerciseName::WeightedKneelingPushUp),
18073            35 => Some(PushUpExerciseName::MedicineBallChestPass),
18074            36 => Some(PushUpExerciseName::MedicineBallPushUp),
18075            37 => Some(PushUpExerciseName::WeightedMedicineBallPushUp),
18076            38 => Some(PushUpExerciseName::OneArmPushUp),
18077            39 => Some(PushUpExerciseName::WeightedOneArmPushUp),
18078            40 => Some(PushUpExerciseName::WeightedPushUp),
18079            41 => Some(PushUpExerciseName::PushUpAndRow),
18080            42 => Some(PushUpExerciseName::WeightedPushUpAndRow),
18081            43 => Some(PushUpExerciseName::PushUpPlus),
18082            44 => Some(PushUpExerciseName::WeightedPushUpPlus),
18083            45 => Some(PushUpExerciseName::PushUpWithFeetOnSwissBall),
18084            46 => Some(PushUpExerciseName::WeightedPushUpWithFeetOnSwissBall),
18085            47 => Some(PushUpExerciseName::PushUpWithOneHandOnMedicineBall),
18086            48 => Some(PushUpExerciseName::WeightedPushUpWithOneHandOnMedicineBall),
18087            49 => Some(PushUpExerciseName::ShoulderPushUp),
18088            50 => Some(PushUpExerciseName::WeightedShoulderPushUp),
18089            51 => Some(PushUpExerciseName::SingleArmMedicineBallPushUp),
18090            52 => Some(PushUpExerciseName::WeightedSingleArmMedicineBallPushUp),
18091            53 => Some(PushUpExerciseName::SpidermanPushUp),
18092            54 => Some(PushUpExerciseName::WeightedSpidermanPushUp),
18093            55 => Some(PushUpExerciseName::StackedFeetPushUp),
18094            56 => Some(PushUpExerciseName::WeightedStackedFeetPushUp),
18095            57 => Some(PushUpExerciseName::StaggeredHandsPushUp),
18096            58 => Some(PushUpExerciseName::WeightedStaggeredHandsPushUp),
18097            59 => Some(PushUpExerciseName::SuspendedPushUp),
18098            60 => Some(PushUpExerciseName::WeightedSuspendedPushUp),
18099            61 => Some(PushUpExerciseName::SwissBallPushUp),
18100            62 => Some(PushUpExerciseName::WeightedSwissBallPushUp),
18101            63 => Some(PushUpExerciseName::SwissBallPushUpPlus),
18102            64 => Some(PushUpExerciseName::WeightedSwissBallPushUpPlus),
18103            65 => Some(PushUpExerciseName::TPushUp),
18104            66 => Some(PushUpExerciseName::WeightedTPushUp),
18105            67 => Some(PushUpExerciseName::TripleStopPushUp),
18106            68 => Some(PushUpExerciseName::WeightedTripleStopPushUp),
18107            69 => Some(PushUpExerciseName::WideHandsPushUp),
18108            70 => Some(PushUpExerciseName::WeightedWideHandsPushUp),
18109            71 => Some(PushUpExerciseName::ParalletteHandstandPushUp),
18110            72 => Some(PushUpExerciseName::WeightedParalletteHandstandPushUp),
18111            73 => Some(PushUpExerciseName::RingHandstandPushUp),
18112            74 => Some(PushUpExerciseName::WeightedRingHandstandPushUp),
18113            75 => Some(PushUpExerciseName::RingPushUp),
18114            76 => Some(PushUpExerciseName::WeightedRingPushUp),
18115            77 => Some(PushUpExerciseName::PushUp),
18116            78 => Some(PushUpExerciseName::PilatesPushup),
18117            79 => Some(PushUpExerciseName::DynamicPushUp),
18118            80 => Some(PushUpExerciseName::KippingHandstandPushUp),
18119            81 => Some(PushUpExerciseName::ShoulderTappingPushUp),
18120            82 => Some(PushUpExerciseName::BicepsPushUp),
18121            83 => Some(PushUpExerciseName::HinduPushUp),
18122            84 => Some(PushUpExerciseName::PikePushUp),
18123            85 => Some(PushUpExerciseName::WideGripPushUp),
18124            86 => Some(PushUpExerciseName::WeightedBicepsPushUp),
18125            87 => Some(PushUpExerciseName::WeightedHinduPushUp),
18126            88 => Some(PushUpExerciseName::WeightedPikePushUp),
18127            89 => Some(PushUpExerciseName::KippingParalletteHandstandPushUp),
18128            90 => Some(PushUpExerciseName::WallPushUp),
18129            _ => None,
18130        }
18131    }
18132
18133    /// Try to construct from the snake-case canonical name.
18134    pub fn from_str(name: &str) -> Option<Self> {
18135        match name {
18136            "chest_press_with_band" => Some(PushUpExerciseName::ChestPressWithBand),
18137            "alternating_staggered_push_up" => Some(PushUpExerciseName::AlternatingStaggeredPushUp),
18138            "weighted_alternating_staggered_push_up" => {
18139                Some(PushUpExerciseName::WeightedAlternatingStaggeredPushUp)
18140            }
18141            "alternating_hands_medicine_ball_push_up" => {
18142                Some(PushUpExerciseName::AlternatingHandsMedicineBallPushUp)
18143            }
18144            "weighted_alternating_hands_medicine_ball_push_up" => {
18145                Some(PushUpExerciseName::WeightedAlternatingHandsMedicineBallPushUp)
18146            }
18147            "bosu_ball_push_up" => Some(PushUpExerciseName::BosuBallPushUp),
18148            "weighted_bosu_ball_push_up" => Some(PushUpExerciseName::WeightedBosuBallPushUp),
18149            "clapping_push_up" => Some(PushUpExerciseName::ClappingPushUp),
18150            "weighted_clapping_push_up" => Some(PushUpExerciseName::WeightedClappingPushUp),
18151            "close_grip_medicine_ball_push_up" => {
18152                Some(PushUpExerciseName::CloseGripMedicineBallPushUp)
18153            }
18154            "weighted_close_grip_medicine_ball_push_up" => {
18155                Some(PushUpExerciseName::WeightedCloseGripMedicineBallPushUp)
18156            }
18157            "close_hands_push_up" => Some(PushUpExerciseName::CloseHandsPushUp),
18158            "weighted_close_hands_push_up" => Some(PushUpExerciseName::WeightedCloseHandsPushUp),
18159            "decline_push_up" => Some(PushUpExerciseName::DeclinePushUp),
18160            "weighted_decline_push_up" => Some(PushUpExerciseName::WeightedDeclinePushUp),
18161            "diamond_push_up" => Some(PushUpExerciseName::DiamondPushUp),
18162            "weighted_diamond_push_up" => Some(PushUpExerciseName::WeightedDiamondPushUp),
18163            "explosive_crossover_push_up" => Some(PushUpExerciseName::ExplosiveCrossoverPushUp),
18164            "weighted_explosive_crossover_push_up" => {
18165                Some(PushUpExerciseName::WeightedExplosiveCrossoverPushUp)
18166            }
18167            "explosive_push_up" => Some(PushUpExerciseName::ExplosivePushUp),
18168            "weighted_explosive_push_up" => Some(PushUpExerciseName::WeightedExplosivePushUp),
18169            "feet_elevated_side_to_side_push_up" => {
18170                Some(PushUpExerciseName::FeetElevatedSideToSidePushUp)
18171            }
18172            "weighted_feet_elevated_side_to_side_push_up" => {
18173                Some(PushUpExerciseName::WeightedFeetElevatedSideToSidePushUp)
18174            }
18175            "hand_release_push_up" => Some(PushUpExerciseName::HandReleasePushUp),
18176            "weighted_hand_release_push_up" => Some(PushUpExerciseName::WeightedHandReleasePushUp),
18177            "handstand_push_up" => Some(PushUpExerciseName::HandstandPushUp),
18178            "weighted_handstand_push_up" => Some(PushUpExerciseName::WeightedHandstandPushUp),
18179            "incline_push_up" => Some(PushUpExerciseName::InclinePushUp),
18180            "weighted_incline_push_up" => Some(PushUpExerciseName::WeightedInclinePushUp),
18181            "isometric_explosive_push_up" => Some(PushUpExerciseName::IsometricExplosivePushUp),
18182            "weighted_isometric_explosive_push_up" => {
18183                Some(PushUpExerciseName::WeightedIsometricExplosivePushUp)
18184            }
18185            "judo_push_up" => Some(PushUpExerciseName::JudoPushUp),
18186            "weighted_judo_push_up" => Some(PushUpExerciseName::WeightedJudoPushUp),
18187            "kneeling_push_up" => Some(PushUpExerciseName::KneelingPushUp),
18188            "weighted_kneeling_push_up" => Some(PushUpExerciseName::WeightedKneelingPushUp),
18189            "medicine_ball_chest_pass" => Some(PushUpExerciseName::MedicineBallChestPass),
18190            "medicine_ball_push_up" => Some(PushUpExerciseName::MedicineBallPushUp),
18191            "weighted_medicine_ball_push_up" => {
18192                Some(PushUpExerciseName::WeightedMedicineBallPushUp)
18193            }
18194            "one_arm_push_up" => Some(PushUpExerciseName::OneArmPushUp),
18195            "weighted_one_arm_push_up" => Some(PushUpExerciseName::WeightedOneArmPushUp),
18196            "weighted_push_up" => Some(PushUpExerciseName::WeightedPushUp),
18197            "push_up_and_row" => Some(PushUpExerciseName::PushUpAndRow),
18198            "weighted_push_up_and_row" => Some(PushUpExerciseName::WeightedPushUpAndRow),
18199            "push_up_plus" => Some(PushUpExerciseName::PushUpPlus),
18200            "weighted_push_up_plus" => Some(PushUpExerciseName::WeightedPushUpPlus),
18201            "push_up_with_feet_on_swiss_ball" => {
18202                Some(PushUpExerciseName::PushUpWithFeetOnSwissBall)
18203            }
18204            "weighted_push_up_with_feet_on_swiss_ball" => {
18205                Some(PushUpExerciseName::WeightedPushUpWithFeetOnSwissBall)
18206            }
18207            "push_up_with_one_hand_on_medicine_ball" => {
18208                Some(PushUpExerciseName::PushUpWithOneHandOnMedicineBall)
18209            }
18210            "weighted_push_up_with_one_hand_on_medicine_ball" => {
18211                Some(PushUpExerciseName::WeightedPushUpWithOneHandOnMedicineBall)
18212            }
18213            "shoulder_push_up" => Some(PushUpExerciseName::ShoulderPushUp),
18214            "weighted_shoulder_push_up" => Some(PushUpExerciseName::WeightedShoulderPushUp),
18215            "single_arm_medicine_ball_push_up" => {
18216                Some(PushUpExerciseName::SingleArmMedicineBallPushUp)
18217            }
18218            "weighted_single_arm_medicine_ball_push_up" => {
18219                Some(PushUpExerciseName::WeightedSingleArmMedicineBallPushUp)
18220            }
18221            "spiderman_push_up" => Some(PushUpExerciseName::SpidermanPushUp),
18222            "weighted_spiderman_push_up" => Some(PushUpExerciseName::WeightedSpidermanPushUp),
18223            "stacked_feet_push_up" => Some(PushUpExerciseName::StackedFeetPushUp),
18224            "weighted_stacked_feet_push_up" => Some(PushUpExerciseName::WeightedStackedFeetPushUp),
18225            "staggered_hands_push_up" => Some(PushUpExerciseName::StaggeredHandsPushUp),
18226            "weighted_staggered_hands_push_up" => {
18227                Some(PushUpExerciseName::WeightedStaggeredHandsPushUp)
18228            }
18229            "suspended_push_up" => Some(PushUpExerciseName::SuspendedPushUp),
18230            "weighted_suspended_push_up" => Some(PushUpExerciseName::WeightedSuspendedPushUp),
18231            "swiss_ball_push_up" => Some(PushUpExerciseName::SwissBallPushUp),
18232            "weighted_swiss_ball_push_up" => Some(PushUpExerciseName::WeightedSwissBallPushUp),
18233            "swiss_ball_push_up_plus" => Some(PushUpExerciseName::SwissBallPushUpPlus),
18234            "weighted_swiss_ball_push_up_plus" => {
18235                Some(PushUpExerciseName::WeightedSwissBallPushUpPlus)
18236            }
18237            "t_push_up" => Some(PushUpExerciseName::TPushUp),
18238            "weighted_t_push_up" => Some(PushUpExerciseName::WeightedTPushUp),
18239            "triple_stop_push_up" => Some(PushUpExerciseName::TripleStopPushUp),
18240            "weighted_triple_stop_push_up" => Some(PushUpExerciseName::WeightedTripleStopPushUp),
18241            "wide_hands_push_up" => Some(PushUpExerciseName::WideHandsPushUp),
18242            "weighted_wide_hands_push_up" => Some(PushUpExerciseName::WeightedWideHandsPushUp),
18243            "parallette_handstand_push_up" => Some(PushUpExerciseName::ParalletteHandstandPushUp),
18244            "weighted_parallette_handstand_push_up" => {
18245                Some(PushUpExerciseName::WeightedParalletteHandstandPushUp)
18246            }
18247            "ring_handstand_push_up" => Some(PushUpExerciseName::RingHandstandPushUp),
18248            "weighted_ring_handstand_push_up" => {
18249                Some(PushUpExerciseName::WeightedRingHandstandPushUp)
18250            }
18251            "ring_push_up" => Some(PushUpExerciseName::RingPushUp),
18252            "weighted_ring_push_up" => Some(PushUpExerciseName::WeightedRingPushUp),
18253            "push_up" => Some(PushUpExerciseName::PushUp),
18254            "pilates_pushup" => Some(PushUpExerciseName::PilatesPushup),
18255            "dynamic_push_up" => Some(PushUpExerciseName::DynamicPushUp),
18256            "kipping_handstand_push_up" => Some(PushUpExerciseName::KippingHandstandPushUp),
18257            "shoulder_tapping_push_up" => Some(PushUpExerciseName::ShoulderTappingPushUp),
18258            "biceps_push_up" => Some(PushUpExerciseName::BicepsPushUp),
18259            "hindu_push_up" => Some(PushUpExerciseName::HinduPushUp),
18260            "pike_push_up" => Some(PushUpExerciseName::PikePushUp),
18261            "wide_grip_push_up" => Some(PushUpExerciseName::WideGripPushUp),
18262            "weighted_biceps_push_up" => Some(PushUpExerciseName::WeightedBicepsPushUp),
18263            "weighted_hindu_push_up" => Some(PushUpExerciseName::WeightedHinduPushUp),
18264            "weighted_pike_push_up" => Some(PushUpExerciseName::WeightedPikePushUp),
18265            "kipping_parallette_handstand_push_up" => {
18266                Some(PushUpExerciseName::KippingParalletteHandstandPushUp)
18267            }
18268            "wall_push_up" => Some(PushUpExerciseName::WallPushUp),
18269            _ => None,
18270        }
18271    }
18272}
18273
18274#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
18275#[repr(u16)]
18276#[non_exhaustive]
18277pub enum RowExerciseName {
18278    BarbellStraightLegDeadliftToRow = 0,
18279    CableRowStanding = 1,
18280    DumbbellRow = 2,
18281    ElevatedFeetInvertedRow = 3,
18282    WeightedElevatedFeetInvertedRow = 4,
18283    FacePull = 5,
18284    FacePullWithExternalRotation = 6,
18285    InvertedRowWithFeetOnSwissBall = 7,
18286    WeightedInvertedRowWithFeetOnSwissBall = 8,
18287    KettlebellRow = 9,
18288    ModifiedInvertedRow = 10,
18289    WeightedModifiedInvertedRow = 11,
18290    NeutralGripAlternatingDumbbellRow = 12,
18291    OneArmBentOverRow = 13,
18292    OneLeggedDumbbellRow = 14,
18293    RenegadeRow = 15,
18294    ReverseGripBarbellRow = 16,
18295    RopeHandleCableRow = 17,
18296    SeatedCableRow = 18,
18297    SeatedDumbbellRow = 19,
18298    SingleArmCableRow = 20,
18299    SingleArmCableRowAndRotation = 21,
18300    SingleArmInvertedRow = 22,
18301    WeightedSingleArmInvertedRow = 23,
18302    SingleArmNeutralGripDumbbellRow = 24,
18303    SingleArmNeutralGripDumbbellRowAndRotation = 25,
18304    SuspendedInvertedRow = 26,
18305    WeightedSuspendedInvertedRow = 27,
18306    TBarRow = 28,
18307    TowelGripInvertedRow = 29,
18308    WeightedTowelGripInvertedRow = 30,
18309    UnderhandGripCableRow = 31,
18310    VGripCableRow = 32,
18311    WideGripSeatedCableRow = 33,
18312    AlternatingDumbbellRow = 34,
18313    InvertedRow = 35,
18314    Row = 36,
18315    WeightedRow = 37,
18316    IndoorRow = 38,
18317    BandedFacePulls = 39,
18318    ChestSupportedDumbbellRow = 40,
18319    DeclineRingRow = 41,
18320    ElevatedRingRow = 42,
18321    RdlBentOverRowWithBarbellDumbbell = 43,
18322    RingRow = 44,
18323    BarbellRow = 45,
18324    BentOverRowWithBarbell = 46,
18325    BentOverRowWithDumbell = 47,
18326    SeatedUnderhandGripCableRow = 48,
18327    TrxInvertedRow = 49,
18328    WeightedInvertedRow = 50,
18329    WeightedTrxInvertedRow = 51,
18330    DumbbellRowWheelchair = 52,
18331}
18332
18333impl RowExerciseName {
18334    /// Snake-case canonical name from Profile.xlsx.
18335    pub fn as_str(&self) -> &'static str {
18336        match self {
18337            RowExerciseName::BarbellStraightLegDeadliftToRow => {
18338                "barbell_straight_leg_deadlift_to_row"
18339            }
18340            RowExerciseName::CableRowStanding => "cable_row_standing",
18341            RowExerciseName::DumbbellRow => "dumbbell_row",
18342            RowExerciseName::ElevatedFeetInvertedRow => "elevated_feet_inverted_row",
18343            RowExerciseName::WeightedElevatedFeetInvertedRow => {
18344                "weighted_elevated_feet_inverted_row"
18345            }
18346            RowExerciseName::FacePull => "face_pull",
18347            RowExerciseName::FacePullWithExternalRotation => "face_pull_with_external_rotation",
18348            RowExerciseName::InvertedRowWithFeetOnSwissBall => {
18349                "inverted_row_with_feet_on_swiss_ball"
18350            }
18351            RowExerciseName::WeightedInvertedRowWithFeetOnSwissBall => {
18352                "weighted_inverted_row_with_feet_on_swiss_ball"
18353            }
18354            RowExerciseName::KettlebellRow => "kettlebell_row",
18355            RowExerciseName::ModifiedInvertedRow => "modified_inverted_row",
18356            RowExerciseName::WeightedModifiedInvertedRow => "weighted_modified_inverted_row",
18357            RowExerciseName::NeutralGripAlternatingDumbbellRow => {
18358                "neutral_grip_alternating_dumbbell_row"
18359            }
18360            RowExerciseName::OneArmBentOverRow => "one_arm_bent_over_row",
18361            RowExerciseName::OneLeggedDumbbellRow => "one_legged_dumbbell_row",
18362            RowExerciseName::RenegadeRow => "renegade_row",
18363            RowExerciseName::ReverseGripBarbellRow => "reverse_grip_barbell_row",
18364            RowExerciseName::RopeHandleCableRow => "rope_handle_cable_row",
18365            RowExerciseName::SeatedCableRow => "seated_cable_row",
18366            RowExerciseName::SeatedDumbbellRow => "seated_dumbbell_row",
18367            RowExerciseName::SingleArmCableRow => "single_arm_cable_row",
18368            RowExerciseName::SingleArmCableRowAndRotation => "single_arm_cable_row_and_rotation",
18369            RowExerciseName::SingleArmInvertedRow => "single_arm_inverted_row",
18370            RowExerciseName::WeightedSingleArmInvertedRow => "weighted_single_arm_inverted_row",
18371            RowExerciseName::SingleArmNeutralGripDumbbellRow => {
18372                "single_arm_neutral_grip_dumbbell_row"
18373            }
18374            RowExerciseName::SingleArmNeutralGripDumbbellRowAndRotation => {
18375                "single_arm_neutral_grip_dumbbell_row_and_rotation"
18376            }
18377            RowExerciseName::SuspendedInvertedRow => "suspended_inverted_row",
18378            RowExerciseName::WeightedSuspendedInvertedRow => "weighted_suspended_inverted_row",
18379            RowExerciseName::TBarRow => "t_bar_row",
18380            RowExerciseName::TowelGripInvertedRow => "towel_grip_inverted_row",
18381            RowExerciseName::WeightedTowelGripInvertedRow => "weighted_towel_grip_inverted_row",
18382            RowExerciseName::UnderhandGripCableRow => "underhand_grip_cable_row",
18383            RowExerciseName::VGripCableRow => "v_grip_cable_row",
18384            RowExerciseName::WideGripSeatedCableRow => "wide_grip_seated_cable_row",
18385            RowExerciseName::AlternatingDumbbellRow => "alternating_dumbbell_row",
18386            RowExerciseName::InvertedRow => "inverted_row",
18387            RowExerciseName::Row => "row",
18388            RowExerciseName::WeightedRow => "weighted_row",
18389            RowExerciseName::IndoorRow => "indoor_row",
18390            RowExerciseName::BandedFacePulls => "banded_face_pulls",
18391            RowExerciseName::ChestSupportedDumbbellRow => "chest_supported_dumbbell_row",
18392            RowExerciseName::DeclineRingRow => "decline_ring_row",
18393            RowExerciseName::ElevatedRingRow => "elevated_ring_row",
18394            RowExerciseName::RdlBentOverRowWithBarbellDumbbell => {
18395                "rdl_bent_over_row_with_barbell_dumbbell"
18396            }
18397            RowExerciseName::RingRow => "ring_row",
18398            RowExerciseName::BarbellRow => "barbell_row",
18399            RowExerciseName::BentOverRowWithBarbell => "bent_over_row_with_barbell",
18400            RowExerciseName::BentOverRowWithDumbell => "bent_over_row_with_dumbell",
18401            RowExerciseName::SeatedUnderhandGripCableRow => "seated_underhand_grip_cable_row",
18402            RowExerciseName::TrxInvertedRow => "trx_inverted_row",
18403            RowExerciseName::WeightedInvertedRow => "weighted_inverted_row",
18404            RowExerciseName::WeightedTrxInvertedRow => "weighted_trx_inverted_row",
18405            RowExerciseName::DumbbellRowWheelchair => "dumbbell_row_wheelchair",
18406        }
18407    }
18408
18409    /// Try to construct from the underlying numeric value.
18410    pub fn from_value(value: u16) -> Option<Self> {
18411        match value {
18412            0 => Some(RowExerciseName::BarbellStraightLegDeadliftToRow),
18413            1 => Some(RowExerciseName::CableRowStanding),
18414            2 => Some(RowExerciseName::DumbbellRow),
18415            3 => Some(RowExerciseName::ElevatedFeetInvertedRow),
18416            4 => Some(RowExerciseName::WeightedElevatedFeetInvertedRow),
18417            5 => Some(RowExerciseName::FacePull),
18418            6 => Some(RowExerciseName::FacePullWithExternalRotation),
18419            7 => Some(RowExerciseName::InvertedRowWithFeetOnSwissBall),
18420            8 => Some(RowExerciseName::WeightedInvertedRowWithFeetOnSwissBall),
18421            9 => Some(RowExerciseName::KettlebellRow),
18422            10 => Some(RowExerciseName::ModifiedInvertedRow),
18423            11 => Some(RowExerciseName::WeightedModifiedInvertedRow),
18424            12 => Some(RowExerciseName::NeutralGripAlternatingDumbbellRow),
18425            13 => Some(RowExerciseName::OneArmBentOverRow),
18426            14 => Some(RowExerciseName::OneLeggedDumbbellRow),
18427            15 => Some(RowExerciseName::RenegadeRow),
18428            16 => Some(RowExerciseName::ReverseGripBarbellRow),
18429            17 => Some(RowExerciseName::RopeHandleCableRow),
18430            18 => Some(RowExerciseName::SeatedCableRow),
18431            19 => Some(RowExerciseName::SeatedDumbbellRow),
18432            20 => Some(RowExerciseName::SingleArmCableRow),
18433            21 => Some(RowExerciseName::SingleArmCableRowAndRotation),
18434            22 => Some(RowExerciseName::SingleArmInvertedRow),
18435            23 => Some(RowExerciseName::WeightedSingleArmInvertedRow),
18436            24 => Some(RowExerciseName::SingleArmNeutralGripDumbbellRow),
18437            25 => Some(RowExerciseName::SingleArmNeutralGripDumbbellRowAndRotation),
18438            26 => Some(RowExerciseName::SuspendedInvertedRow),
18439            27 => Some(RowExerciseName::WeightedSuspendedInvertedRow),
18440            28 => Some(RowExerciseName::TBarRow),
18441            29 => Some(RowExerciseName::TowelGripInvertedRow),
18442            30 => Some(RowExerciseName::WeightedTowelGripInvertedRow),
18443            31 => Some(RowExerciseName::UnderhandGripCableRow),
18444            32 => Some(RowExerciseName::VGripCableRow),
18445            33 => Some(RowExerciseName::WideGripSeatedCableRow),
18446            34 => Some(RowExerciseName::AlternatingDumbbellRow),
18447            35 => Some(RowExerciseName::InvertedRow),
18448            36 => Some(RowExerciseName::Row),
18449            37 => Some(RowExerciseName::WeightedRow),
18450            38 => Some(RowExerciseName::IndoorRow),
18451            39 => Some(RowExerciseName::BandedFacePulls),
18452            40 => Some(RowExerciseName::ChestSupportedDumbbellRow),
18453            41 => Some(RowExerciseName::DeclineRingRow),
18454            42 => Some(RowExerciseName::ElevatedRingRow),
18455            43 => Some(RowExerciseName::RdlBentOverRowWithBarbellDumbbell),
18456            44 => Some(RowExerciseName::RingRow),
18457            45 => Some(RowExerciseName::BarbellRow),
18458            46 => Some(RowExerciseName::BentOverRowWithBarbell),
18459            47 => Some(RowExerciseName::BentOverRowWithDumbell),
18460            48 => Some(RowExerciseName::SeatedUnderhandGripCableRow),
18461            49 => Some(RowExerciseName::TrxInvertedRow),
18462            50 => Some(RowExerciseName::WeightedInvertedRow),
18463            51 => Some(RowExerciseName::WeightedTrxInvertedRow),
18464            52 => Some(RowExerciseName::DumbbellRowWheelchair),
18465            _ => None,
18466        }
18467    }
18468
18469    /// Try to construct from the snake-case canonical name.
18470    pub fn from_str(name: &str) -> Option<Self> {
18471        match name {
18472            "barbell_straight_leg_deadlift_to_row" => {
18473                Some(RowExerciseName::BarbellStraightLegDeadliftToRow)
18474            }
18475            "cable_row_standing" => Some(RowExerciseName::CableRowStanding),
18476            "dumbbell_row" => Some(RowExerciseName::DumbbellRow),
18477            "elevated_feet_inverted_row" => Some(RowExerciseName::ElevatedFeetInvertedRow),
18478            "weighted_elevated_feet_inverted_row" => {
18479                Some(RowExerciseName::WeightedElevatedFeetInvertedRow)
18480            }
18481            "face_pull" => Some(RowExerciseName::FacePull),
18482            "face_pull_with_external_rotation" => {
18483                Some(RowExerciseName::FacePullWithExternalRotation)
18484            }
18485            "inverted_row_with_feet_on_swiss_ball" => {
18486                Some(RowExerciseName::InvertedRowWithFeetOnSwissBall)
18487            }
18488            "weighted_inverted_row_with_feet_on_swiss_ball" => {
18489                Some(RowExerciseName::WeightedInvertedRowWithFeetOnSwissBall)
18490            }
18491            "kettlebell_row" => Some(RowExerciseName::KettlebellRow),
18492            "modified_inverted_row" => Some(RowExerciseName::ModifiedInvertedRow),
18493            "weighted_modified_inverted_row" => Some(RowExerciseName::WeightedModifiedInvertedRow),
18494            "neutral_grip_alternating_dumbbell_row" => {
18495                Some(RowExerciseName::NeutralGripAlternatingDumbbellRow)
18496            }
18497            "one_arm_bent_over_row" => Some(RowExerciseName::OneArmBentOverRow),
18498            "one_legged_dumbbell_row" => Some(RowExerciseName::OneLeggedDumbbellRow),
18499            "renegade_row" => Some(RowExerciseName::RenegadeRow),
18500            "reverse_grip_barbell_row" => Some(RowExerciseName::ReverseGripBarbellRow),
18501            "rope_handle_cable_row" => Some(RowExerciseName::RopeHandleCableRow),
18502            "seated_cable_row" => Some(RowExerciseName::SeatedCableRow),
18503            "seated_dumbbell_row" => Some(RowExerciseName::SeatedDumbbellRow),
18504            "single_arm_cable_row" => Some(RowExerciseName::SingleArmCableRow),
18505            "single_arm_cable_row_and_rotation" => {
18506                Some(RowExerciseName::SingleArmCableRowAndRotation)
18507            }
18508            "single_arm_inverted_row" => Some(RowExerciseName::SingleArmInvertedRow),
18509            "weighted_single_arm_inverted_row" => {
18510                Some(RowExerciseName::WeightedSingleArmInvertedRow)
18511            }
18512            "single_arm_neutral_grip_dumbbell_row" => {
18513                Some(RowExerciseName::SingleArmNeutralGripDumbbellRow)
18514            }
18515            "single_arm_neutral_grip_dumbbell_row_and_rotation" => {
18516                Some(RowExerciseName::SingleArmNeutralGripDumbbellRowAndRotation)
18517            }
18518            "suspended_inverted_row" => Some(RowExerciseName::SuspendedInvertedRow),
18519            "weighted_suspended_inverted_row" => {
18520                Some(RowExerciseName::WeightedSuspendedInvertedRow)
18521            }
18522            "t_bar_row" => Some(RowExerciseName::TBarRow),
18523            "towel_grip_inverted_row" => Some(RowExerciseName::TowelGripInvertedRow),
18524            "weighted_towel_grip_inverted_row" => {
18525                Some(RowExerciseName::WeightedTowelGripInvertedRow)
18526            }
18527            "underhand_grip_cable_row" => Some(RowExerciseName::UnderhandGripCableRow),
18528            "v_grip_cable_row" => Some(RowExerciseName::VGripCableRow),
18529            "wide_grip_seated_cable_row" => Some(RowExerciseName::WideGripSeatedCableRow),
18530            "alternating_dumbbell_row" => Some(RowExerciseName::AlternatingDumbbellRow),
18531            "inverted_row" => Some(RowExerciseName::InvertedRow),
18532            "row" => Some(RowExerciseName::Row),
18533            "weighted_row" => Some(RowExerciseName::WeightedRow),
18534            "indoor_row" => Some(RowExerciseName::IndoorRow),
18535            "banded_face_pulls" => Some(RowExerciseName::BandedFacePulls),
18536            "chest_supported_dumbbell_row" => Some(RowExerciseName::ChestSupportedDumbbellRow),
18537            "decline_ring_row" => Some(RowExerciseName::DeclineRingRow),
18538            "elevated_ring_row" => Some(RowExerciseName::ElevatedRingRow),
18539            "rdl_bent_over_row_with_barbell_dumbbell" => {
18540                Some(RowExerciseName::RdlBentOverRowWithBarbellDumbbell)
18541            }
18542            "ring_row" => Some(RowExerciseName::RingRow),
18543            "barbell_row" => Some(RowExerciseName::BarbellRow),
18544            "bent_over_row_with_barbell" => Some(RowExerciseName::BentOverRowWithBarbell),
18545            "bent_over_row_with_dumbell" => Some(RowExerciseName::BentOverRowWithDumbell),
18546            "seated_underhand_grip_cable_row" => Some(RowExerciseName::SeatedUnderhandGripCableRow),
18547            "trx_inverted_row" => Some(RowExerciseName::TrxInvertedRow),
18548            "weighted_inverted_row" => Some(RowExerciseName::WeightedInvertedRow),
18549            "weighted_trx_inverted_row" => Some(RowExerciseName::WeightedTrxInvertedRow),
18550            "dumbbell_row_wheelchair" => Some(RowExerciseName::DumbbellRowWheelchair),
18551            _ => None,
18552        }
18553    }
18554}
18555
18556#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
18557#[repr(u16)]
18558#[non_exhaustive]
18559pub enum ShoulderPressExerciseName {
18560    AlternatingDumbbellShoulderPress = 0,
18561    ArnoldPress = 1,
18562    BarbellFrontSquatToPushPress = 2,
18563    BarbellPushPress = 3,
18564    BarbellShoulderPress = 4,
18565    DeadCurlPress = 5,
18566    DumbbellAlternatingShoulderPressAndTwist = 6,
18567    DumbbellHammerCurlToLungeToPress = 7,
18568    DumbbellPushPress = 8,
18569    FloorInvertedShoulderPress = 9,
18570    WeightedFloorInvertedShoulderPress = 10,
18571    InvertedShoulderPress = 11,
18572    WeightedInvertedShoulderPress = 12,
18573    OneArmPushPress = 13,
18574    OverheadBarbellPress = 14,
18575    OverheadDumbbellPress = 15,
18576    SeatedBarbellShoulderPress = 16,
18577    SeatedDumbbellShoulderPress = 17,
18578    SingleArmDumbbellShoulderPress = 18,
18579    SingleArmStepUpAndPress = 19,
18580    SmithMachineOverheadPress = 20,
18581    SplitStanceHammerCurlToPress = 21,
18582    SwissBallDumbbellShoulderPress = 22,
18583    WeightPlateFrontRaise = 23,
18584    DumbbellShoulderPress = 24,
18585    MilitaryPress = 25,
18586    StrictPress = 27,
18587    DumbbellFrontRaise = 28,
18588    DumbbellCurlToOverheadPressWheelchair = 29,
18589    ArnoldPressWheelchair = 30,
18590    OverheadDumbbellPressWheelchair = 31,
18591}
18592
18593impl ShoulderPressExerciseName {
18594    /// Snake-case canonical name from Profile.xlsx.
18595    pub fn as_str(&self) -> &'static str {
18596        match self {
18597            ShoulderPressExerciseName::AlternatingDumbbellShoulderPress => {
18598                "alternating_dumbbell_shoulder_press"
18599            }
18600            ShoulderPressExerciseName::ArnoldPress => "arnold_press",
18601            ShoulderPressExerciseName::BarbellFrontSquatToPushPress => {
18602                "barbell_front_squat_to_push_press"
18603            }
18604            ShoulderPressExerciseName::BarbellPushPress => "barbell_push_press",
18605            ShoulderPressExerciseName::BarbellShoulderPress => "barbell_shoulder_press",
18606            ShoulderPressExerciseName::DeadCurlPress => "dead_curl_press",
18607            ShoulderPressExerciseName::DumbbellAlternatingShoulderPressAndTwist => {
18608                "dumbbell_alternating_shoulder_press_and_twist"
18609            }
18610            ShoulderPressExerciseName::DumbbellHammerCurlToLungeToPress => {
18611                "dumbbell_hammer_curl_to_lunge_to_press"
18612            }
18613            ShoulderPressExerciseName::DumbbellPushPress => "dumbbell_push_press",
18614            ShoulderPressExerciseName::FloorInvertedShoulderPress => {
18615                "floor_inverted_shoulder_press"
18616            }
18617            ShoulderPressExerciseName::WeightedFloorInvertedShoulderPress => {
18618                "weighted_floor_inverted_shoulder_press"
18619            }
18620            ShoulderPressExerciseName::InvertedShoulderPress => "inverted_shoulder_press",
18621            ShoulderPressExerciseName::WeightedInvertedShoulderPress => {
18622                "weighted_inverted_shoulder_press"
18623            }
18624            ShoulderPressExerciseName::OneArmPushPress => "one_arm_push_press",
18625            ShoulderPressExerciseName::OverheadBarbellPress => "overhead_barbell_press",
18626            ShoulderPressExerciseName::OverheadDumbbellPress => "overhead_dumbbell_press",
18627            ShoulderPressExerciseName::SeatedBarbellShoulderPress => {
18628                "seated_barbell_shoulder_press"
18629            }
18630            ShoulderPressExerciseName::SeatedDumbbellShoulderPress => {
18631                "seated_dumbbell_shoulder_press"
18632            }
18633            ShoulderPressExerciseName::SingleArmDumbbellShoulderPress => {
18634                "single_arm_dumbbell_shoulder_press"
18635            }
18636            ShoulderPressExerciseName::SingleArmStepUpAndPress => "single_arm_step_up_and_press",
18637            ShoulderPressExerciseName::SmithMachineOverheadPress => "smith_machine_overhead_press",
18638            ShoulderPressExerciseName::SplitStanceHammerCurlToPress => {
18639                "split_stance_hammer_curl_to_press"
18640            }
18641            ShoulderPressExerciseName::SwissBallDumbbellShoulderPress => {
18642                "swiss_ball_dumbbell_shoulder_press"
18643            }
18644            ShoulderPressExerciseName::WeightPlateFrontRaise => "weight_plate_front_raise",
18645            ShoulderPressExerciseName::DumbbellShoulderPress => "dumbbell_shoulder_press",
18646            ShoulderPressExerciseName::MilitaryPress => "military_press",
18647            ShoulderPressExerciseName::StrictPress => "strict_press",
18648            ShoulderPressExerciseName::DumbbellFrontRaise => "dumbbell_front_raise",
18649            ShoulderPressExerciseName::DumbbellCurlToOverheadPressWheelchair => {
18650                "dumbbell_curl_to_overhead_press_wheelchair"
18651            }
18652            ShoulderPressExerciseName::ArnoldPressWheelchair => "arnold_press_wheelchair",
18653            ShoulderPressExerciseName::OverheadDumbbellPressWheelchair => {
18654                "overhead_dumbbell_press_wheelchair"
18655            }
18656        }
18657    }
18658
18659    /// Try to construct from the underlying numeric value.
18660    pub fn from_value(value: u16) -> Option<Self> {
18661        match value {
18662            0 => Some(ShoulderPressExerciseName::AlternatingDumbbellShoulderPress),
18663            1 => Some(ShoulderPressExerciseName::ArnoldPress),
18664            2 => Some(ShoulderPressExerciseName::BarbellFrontSquatToPushPress),
18665            3 => Some(ShoulderPressExerciseName::BarbellPushPress),
18666            4 => Some(ShoulderPressExerciseName::BarbellShoulderPress),
18667            5 => Some(ShoulderPressExerciseName::DeadCurlPress),
18668            6 => Some(ShoulderPressExerciseName::DumbbellAlternatingShoulderPressAndTwist),
18669            7 => Some(ShoulderPressExerciseName::DumbbellHammerCurlToLungeToPress),
18670            8 => Some(ShoulderPressExerciseName::DumbbellPushPress),
18671            9 => Some(ShoulderPressExerciseName::FloorInvertedShoulderPress),
18672            10 => Some(ShoulderPressExerciseName::WeightedFloorInvertedShoulderPress),
18673            11 => Some(ShoulderPressExerciseName::InvertedShoulderPress),
18674            12 => Some(ShoulderPressExerciseName::WeightedInvertedShoulderPress),
18675            13 => Some(ShoulderPressExerciseName::OneArmPushPress),
18676            14 => Some(ShoulderPressExerciseName::OverheadBarbellPress),
18677            15 => Some(ShoulderPressExerciseName::OverheadDumbbellPress),
18678            16 => Some(ShoulderPressExerciseName::SeatedBarbellShoulderPress),
18679            17 => Some(ShoulderPressExerciseName::SeatedDumbbellShoulderPress),
18680            18 => Some(ShoulderPressExerciseName::SingleArmDumbbellShoulderPress),
18681            19 => Some(ShoulderPressExerciseName::SingleArmStepUpAndPress),
18682            20 => Some(ShoulderPressExerciseName::SmithMachineOverheadPress),
18683            21 => Some(ShoulderPressExerciseName::SplitStanceHammerCurlToPress),
18684            22 => Some(ShoulderPressExerciseName::SwissBallDumbbellShoulderPress),
18685            23 => Some(ShoulderPressExerciseName::WeightPlateFrontRaise),
18686            24 => Some(ShoulderPressExerciseName::DumbbellShoulderPress),
18687            25 => Some(ShoulderPressExerciseName::MilitaryPress),
18688            27 => Some(ShoulderPressExerciseName::StrictPress),
18689            28 => Some(ShoulderPressExerciseName::DumbbellFrontRaise),
18690            29 => Some(ShoulderPressExerciseName::DumbbellCurlToOverheadPressWheelchair),
18691            30 => Some(ShoulderPressExerciseName::ArnoldPressWheelchair),
18692            31 => Some(ShoulderPressExerciseName::OverheadDumbbellPressWheelchair),
18693            _ => None,
18694        }
18695    }
18696
18697    /// Try to construct from the snake-case canonical name.
18698    pub fn from_str(name: &str) -> Option<Self> {
18699        match name {
18700            "alternating_dumbbell_shoulder_press" => {
18701                Some(ShoulderPressExerciseName::AlternatingDumbbellShoulderPress)
18702            }
18703            "arnold_press" => Some(ShoulderPressExerciseName::ArnoldPress),
18704            "barbell_front_squat_to_push_press" => {
18705                Some(ShoulderPressExerciseName::BarbellFrontSquatToPushPress)
18706            }
18707            "barbell_push_press" => Some(ShoulderPressExerciseName::BarbellPushPress),
18708            "barbell_shoulder_press" => Some(ShoulderPressExerciseName::BarbellShoulderPress),
18709            "dead_curl_press" => Some(ShoulderPressExerciseName::DeadCurlPress),
18710            "dumbbell_alternating_shoulder_press_and_twist" => {
18711                Some(ShoulderPressExerciseName::DumbbellAlternatingShoulderPressAndTwist)
18712            }
18713            "dumbbell_hammer_curl_to_lunge_to_press" => {
18714                Some(ShoulderPressExerciseName::DumbbellHammerCurlToLungeToPress)
18715            }
18716            "dumbbell_push_press" => Some(ShoulderPressExerciseName::DumbbellPushPress),
18717            "floor_inverted_shoulder_press" => {
18718                Some(ShoulderPressExerciseName::FloorInvertedShoulderPress)
18719            }
18720            "weighted_floor_inverted_shoulder_press" => {
18721                Some(ShoulderPressExerciseName::WeightedFloorInvertedShoulderPress)
18722            }
18723            "inverted_shoulder_press" => Some(ShoulderPressExerciseName::InvertedShoulderPress),
18724            "weighted_inverted_shoulder_press" => {
18725                Some(ShoulderPressExerciseName::WeightedInvertedShoulderPress)
18726            }
18727            "one_arm_push_press" => Some(ShoulderPressExerciseName::OneArmPushPress),
18728            "overhead_barbell_press" => Some(ShoulderPressExerciseName::OverheadBarbellPress),
18729            "overhead_dumbbell_press" => Some(ShoulderPressExerciseName::OverheadDumbbellPress),
18730            "seated_barbell_shoulder_press" => {
18731                Some(ShoulderPressExerciseName::SeatedBarbellShoulderPress)
18732            }
18733            "seated_dumbbell_shoulder_press" => {
18734                Some(ShoulderPressExerciseName::SeatedDumbbellShoulderPress)
18735            }
18736            "single_arm_dumbbell_shoulder_press" => {
18737                Some(ShoulderPressExerciseName::SingleArmDumbbellShoulderPress)
18738            }
18739            "single_arm_step_up_and_press" => {
18740                Some(ShoulderPressExerciseName::SingleArmStepUpAndPress)
18741            }
18742            "smith_machine_overhead_press" => {
18743                Some(ShoulderPressExerciseName::SmithMachineOverheadPress)
18744            }
18745            "split_stance_hammer_curl_to_press" => {
18746                Some(ShoulderPressExerciseName::SplitStanceHammerCurlToPress)
18747            }
18748            "swiss_ball_dumbbell_shoulder_press" => {
18749                Some(ShoulderPressExerciseName::SwissBallDumbbellShoulderPress)
18750            }
18751            "weight_plate_front_raise" => Some(ShoulderPressExerciseName::WeightPlateFrontRaise),
18752            "dumbbell_shoulder_press" => Some(ShoulderPressExerciseName::DumbbellShoulderPress),
18753            "military_press" => Some(ShoulderPressExerciseName::MilitaryPress),
18754            "strict_press" => Some(ShoulderPressExerciseName::StrictPress),
18755            "dumbbell_front_raise" => Some(ShoulderPressExerciseName::DumbbellFrontRaise),
18756            "dumbbell_curl_to_overhead_press_wheelchair" => {
18757                Some(ShoulderPressExerciseName::DumbbellCurlToOverheadPressWheelchair)
18758            }
18759            "arnold_press_wheelchair" => Some(ShoulderPressExerciseName::ArnoldPressWheelchair),
18760            "overhead_dumbbell_press_wheelchair" => {
18761                Some(ShoulderPressExerciseName::OverheadDumbbellPressWheelchair)
18762            }
18763            _ => None,
18764        }
18765    }
18766}
18767
18768#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
18769#[repr(u16)]
18770#[non_exhaustive]
18771pub enum ShoulderStabilityExerciseName {
18772    _90DegreeCableExternalRotation = 0,
18773    BandExternalRotation = 1,
18774    BandInternalRotation = 2,
18775    BentArmLateralRaiseAndExternalRotation = 3,
18776    CableExternalRotation = 4,
18777    DumbbellFacePullWithExternalRotation = 5,
18778    FloorIRaise = 6,
18779    WeightedFloorIRaise = 7,
18780    FloorTRaise = 8,
18781    WeightedFloorTRaise = 9,
18782    FloorYRaise = 10,
18783    WeightedFloorYRaise = 11,
18784    InclineIRaise = 12,
18785    WeightedInclineIRaise = 13,
18786    InclineLRaise = 14,
18787    WeightedInclineLRaise = 15,
18788    InclineTRaise = 16,
18789    WeightedInclineTRaise = 17,
18790    InclineWRaise = 18,
18791    WeightedInclineWRaise = 19,
18792    InclineYRaise = 20,
18793    WeightedInclineYRaise = 21,
18794    LyingExternalRotation = 22,
18795    SeatedDumbbellExternalRotation = 23,
18796    StandingLRaise = 24,
18797    SwissBallIRaise = 25,
18798    WeightedSwissBallIRaise = 26,
18799    SwissBallTRaise = 27,
18800    WeightedSwissBallTRaise = 28,
18801    SwissBallWRaise = 29,
18802    WeightedSwissBallWRaise = 30,
18803    SwissBallYRaise = 31,
18804    WeightedSwissBallYRaise = 32,
18805    CableInternalRotation = 33,
18806    LyingInternalRotation = 34,
18807    SeatedDumbbellInternalRotation = 35,
18808}
18809
18810impl ShoulderStabilityExerciseName {
18811    /// Snake-case canonical name from Profile.xlsx.
18812    pub fn as_str(&self) -> &'static str {
18813        match self {
18814            ShoulderStabilityExerciseName::_90DegreeCableExternalRotation => {
18815                "90_degree_cable_external_rotation"
18816            }
18817            ShoulderStabilityExerciseName::BandExternalRotation => "band_external_rotation",
18818            ShoulderStabilityExerciseName::BandInternalRotation => "band_internal_rotation",
18819            ShoulderStabilityExerciseName::BentArmLateralRaiseAndExternalRotation => {
18820                "bent_arm_lateral_raise_and_external_rotation"
18821            }
18822            ShoulderStabilityExerciseName::CableExternalRotation => "cable_external_rotation",
18823            ShoulderStabilityExerciseName::DumbbellFacePullWithExternalRotation => {
18824                "dumbbell_face_pull_with_external_rotation"
18825            }
18826            ShoulderStabilityExerciseName::FloorIRaise => "floor_i_raise",
18827            ShoulderStabilityExerciseName::WeightedFloorIRaise => "weighted_floor_i_raise",
18828            ShoulderStabilityExerciseName::FloorTRaise => "floor_t_raise",
18829            ShoulderStabilityExerciseName::WeightedFloorTRaise => "weighted_floor_t_raise",
18830            ShoulderStabilityExerciseName::FloorYRaise => "floor_y_raise",
18831            ShoulderStabilityExerciseName::WeightedFloorYRaise => "weighted_floor_y_raise",
18832            ShoulderStabilityExerciseName::InclineIRaise => "incline_i_raise",
18833            ShoulderStabilityExerciseName::WeightedInclineIRaise => "weighted_incline_i_raise",
18834            ShoulderStabilityExerciseName::InclineLRaise => "incline_l_raise",
18835            ShoulderStabilityExerciseName::WeightedInclineLRaise => "weighted_incline_l_raise",
18836            ShoulderStabilityExerciseName::InclineTRaise => "incline_t_raise",
18837            ShoulderStabilityExerciseName::WeightedInclineTRaise => "weighted_incline_t_raise",
18838            ShoulderStabilityExerciseName::InclineWRaise => "incline_w_raise",
18839            ShoulderStabilityExerciseName::WeightedInclineWRaise => "weighted_incline_w_raise",
18840            ShoulderStabilityExerciseName::InclineYRaise => "incline_y_raise",
18841            ShoulderStabilityExerciseName::WeightedInclineYRaise => "weighted_incline_y_raise",
18842            ShoulderStabilityExerciseName::LyingExternalRotation => "lying_external_rotation",
18843            ShoulderStabilityExerciseName::SeatedDumbbellExternalRotation => {
18844                "seated_dumbbell_external_rotation"
18845            }
18846            ShoulderStabilityExerciseName::StandingLRaise => "standing_l_raise",
18847            ShoulderStabilityExerciseName::SwissBallIRaise => "swiss_ball_i_raise",
18848            ShoulderStabilityExerciseName::WeightedSwissBallIRaise => "weighted_swiss_ball_i_raise",
18849            ShoulderStabilityExerciseName::SwissBallTRaise => "swiss_ball_t_raise",
18850            ShoulderStabilityExerciseName::WeightedSwissBallTRaise => "weighted_swiss_ball_t_raise",
18851            ShoulderStabilityExerciseName::SwissBallWRaise => "swiss_ball_w_raise",
18852            ShoulderStabilityExerciseName::WeightedSwissBallWRaise => "weighted_swiss_ball_w_raise",
18853            ShoulderStabilityExerciseName::SwissBallYRaise => "swiss_ball_y_raise",
18854            ShoulderStabilityExerciseName::WeightedSwissBallYRaise => "weighted_swiss_ball_y_raise",
18855            ShoulderStabilityExerciseName::CableInternalRotation => "cable_internal_rotation",
18856            ShoulderStabilityExerciseName::LyingInternalRotation => "lying_internal_rotation",
18857            ShoulderStabilityExerciseName::SeatedDumbbellInternalRotation => {
18858                "seated_dumbbell_internal_rotation"
18859            }
18860        }
18861    }
18862
18863    /// Try to construct from the underlying numeric value.
18864    pub fn from_value(value: u16) -> Option<Self> {
18865        match value {
18866            0 => Some(ShoulderStabilityExerciseName::_90DegreeCableExternalRotation),
18867            1 => Some(ShoulderStabilityExerciseName::BandExternalRotation),
18868            2 => Some(ShoulderStabilityExerciseName::BandInternalRotation),
18869            3 => Some(ShoulderStabilityExerciseName::BentArmLateralRaiseAndExternalRotation),
18870            4 => Some(ShoulderStabilityExerciseName::CableExternalRotation),
18871            5 => Some(ShoulderStabilityExerciseName::DumbbellFacePullWithExternalRotation),
18872            6 => Some(ShoulderStabilityExerciseName::FloorIRaise),
18873            7 => Some(ShoulderStabilityExerciseName::WeightedFloorIRaise),
18874            8 => Some(ShoulderStabilityExerciseName::FloorTRaise),
18875            9 => Some(ShoulderStabilityExerciseName::WeightedFloorTRaise),
18876            10 => Some(ShoulderStabilityExerciseName::FloorYRaise),
18877            11 => Some(ShoulderStabilityExerciseName::WeightedFloorYRaise),
18878            12 => Some(ShoulderStabilityExerciseName::InclineIRaise),
18879            13 => Some(ShoulderStabilityExerciseName::WeightedInclineIRaise),
18880            14 => Some(ShoulderStabilityExerciseName::InclineLRaise),
18881            15 => Some(ShoulderStabilityExerciseName::WeightedInclineLRaise),
18882            16 => Some(ShoulderStabilityExerciseName::InclineTRaise),
18883            17 => Some(ShoulderStabilityExerciseName::WeightedInclineTRaise),
18884            18 => Some(ShoulderStabilityExerciseName::InclineWRaise),
18885            19 => Some(ShoulderStabilityExerciseName::WeightedInclineWRaise),
18886            20 => Some(ShoulderStabilityExerciseName::InclineYRaise),
18887            21 => Some(ShoulderStabilityExerciseName::WeightedInclineYRaise),
18888            22 => Some(ShoulderStabilityExerciseName::LyingExternalRotation),
18889            23 => Some(ShoulderStabilityExerciseName::SeatedDumbbellExternalRotation),
18890            24 => Some(ShoulderStabilityExerciseName::StandingLRaise),
18891            25 => Some(ShoulderStabilityExerciseName::SwissBallIRaise),
18892            26 => Some(ShoulderStabilityExerciseName::WeightedSwissBallIRaise),
18893            27 => Some(ShoulderStabilityExerciseName::SwissBallTRaise),
18894            28 => Some(ShoulderStabilityExerciseName::WeightedSwissBallTRaise),
18895            29 => Some(ShoulderStabilityExerciseName::SwissBallWRaise),
18896            30 => Some(ShoulderStabilityExerciseName::WeightedSwissBallWRaise),
18897            31 => Some(ShoulderStabilityExerciseName::SwissBallYRaise),
18898            32 => Some(ShoulderStabilityExerciseName::WeightedSwissBallYRaise),
18899            33 => Some(ShoulderStabilityExerciseName::CableInternalRotation),
18900            34 => Some(ShoulderStabilityExerciseName::LyingInternalRotation),
18901            35 => Some(ShoulderStabilityExerciseName::SeatedDumbbellInternalRotation),
18902            _ => None,
18903        }
18904    }
18905
18906    /// Try to construct from the snake-case canonical name.
18907    pub fn from_str(name: &str) -> Option<Self> {
18908        match name {
18909            "90_degree_cable_external_rotation" => {
18910                Some(ShoulderStabilityExerciseName::_90DegreeCableExternalRotation)
18911            }
18912            "band_external_rotation" => Some(ShoulderStabilityExerciseName::BandExternalRotation),
18913            "band_internal_rotation" => Some(ShoulderStabilityExerciseName::BandInternalRotation),
18914            "bent_arm_lateral_raise_and_external_rotation" => {
18915                Some(ShoulderStabilityExerciseName::BentArmLateralRaiseAndExternalRotation)
18916            }
18917            "cable_external_rotation" => Some(ShoulderStabilityExerciseName::CableExternalRotation),
18918            "dumbbell_face_pull_with_external_rotation" => {
18919                Some(ShoulderStabilityExerciseName::DumbbellFacePullWithExternalRotation)
18920            }
18921            "floor_i_raise" => Some(ShoulderStabilityExerciseName::FloorIRaise),
18922            "weighted_floor_i_raise" => Some(ShoulderStabilityExerciseName::WeightedFloorIRaise),
18923            "floor_t_raise" => Some(ShoulderStabilityExerciseName::FloorTRaise),
18924            "weighted_floor_t_raise" => Some(ShoulderStabilityExerciseName::WeightedFloorTRaise),
18925            "floor_y_raise" => Some(ShoulderStabilityExerciseName::FloorYRaise),
18926            "weighted_floor_y_raise" => Some(ShoulderStabilityExerciseName::WeightedFloorYRaise),
18927            "incline_i_raise" => Some(ShoulderStabilityExerciseName::InclineIRaise),
18928            "weighted_incline_i_raise" => {
18929                Some(ShoulderStabilityExerciseName::WeightedInclineIRaise)
18930            }
18931            "incline_l_raise" => Some(ShoulderStabilityExerciseName::InclineLRaise),
18932            "weighted_incline_l_raise" => {
18933                Some(ShoulderStabilityExerciseName::WeightedInclineLRaise)
18934            }
18935            "incline_t_raise" => Some(ShoulderStabilityExerciseName::InclineTRaise),
18936            "weighted_incline_t_raise" => {
18937                Some(ShoulderStabilityExerciseName::WeightedInclineTRaise)
18938            }
18939            "incline_w_raise" => Some(ShoulderStabilityExerciseName::InclineWRaise),
18940            "weighted_incline_w_raise" => {
18941                Some(ShoulderStabilityExerciseName::WeightedInclineWRaise)
18942            }
18943            "incline_y_raise" => Some(ShoulderStabilityExerciseName::InclineYRaise),
18944            "weighted_incline_y_raise" => {
18945                Some(ShoulderStabilityExerciseName::WeightedInclineYRaise)
18946            }
18947            "lying_external_rotation" => Some(ShoulderStabilityExerciseName::LyingExternalRotation),
18948            "seated_dumbbell_external_rotation" => {
18949                Some(ShoulderStabilityExerciseName::SeatedDumbbellExternalRotation)
18950            }
18951            "standing_l_raise" => Some(ShoulderStabilityExerciseName::StandingLRaise),
18952            "swiss_ball_i_raise" => Some(ShoulderStabilityExerciseName::SwissBallIRaise),
18953            "weighted_swiss_ball_i_raise" => {
18954                Some(ShoulderStabilityExerciseName::WeightedSwissBallIRaise)
18955            }
18956            "swiss_ball_t_raise" => Some(ShoulderStabilityExerciseName::SwissBallTRaise),
18957            "weighted_swiss_ball_t_raise" => {
18958                Some(ShoulderStabilityExerciseName::WeightedSwissBallTRaise)
18959            }
18960            "swiss_ball_w_raise" => Some(ShoulderStabilityExerciseName::SwissBallWRaise),
18961            "weighted_swiss_ball_w_raise" => {
18962                Some(ShoulderStabilityExerciseName::WeightedSwissBallWRaise)
18963            }
18964            "swiss_ball_y_raise" => Some(ShoulderStabilityExerciseName::SwissBallYRaise),
18965            "weighted_swiss_ball_y_raise" => {
18966                Some(ShoulderStabilityExerciseName::WeightedSwissBallYRaise)
18967            }
18968            "cable_internal_rotation" => Some(ShoulderStabilityExerciseName::CableInternalRotation),
18969            "lying_internal_rotation" => Some(ShoulderStabilityExerciseName::LyingInternalRotation),
18970            "seated_dumbbell_internal_rotation" => {
18971                Some(ShoulderStabilityExerciseName::SeatedDumbbellInternalRotation)
18972            }
18973            _ => None,
18974        }
18975    }
18976}
18977
18978#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
18979#[repr(u16)]
18980#[non_exhaustive]
18981pub enum ShrugExerciseName {
18982    BarbellJumpShrug = 0,
18983    BarbellShrug = 1,
18984    BarbellUprightRow = 2,
18985    BehindTheBackSmithMachineShrug = 3,
18986    DumbbellJumpShrug = 4,
18987    DumbbellShrug = 5,
18988    DumbbellUprightRow = 6,
18989    InclineDumbbellShrug = 7,
18990    OverheadBarbellShrug = 8,
18991    OverheadDumbbellShrug = 9,
18992    ScaptionAndShrug = 10,
18993    ScapularRetraction = 11,
18994    SerratusChairShrug = 12,
18995    WeightedSerratusChairShrug = 13,
18996    SerratusShrug = 14,
18997    WeightedSerratusShrug = 15,
18998    WideGripJumpShrug = 16,
18999    WideGripBarbellShrug = 17,
19000    BehindTheBackShrug = 18,
19001    DumbbellShrugWheelchair = 19,
19002    ShrugWheelchair = 20,
19003    ShrugArmDownWheelchair = 21,
19004    ShrugArmMidWheelchair = 22,
19005    ShrugArmUpWheelchair = 23,
19006    UprightRow = 24,
19007}
19008
19009impl ShrugExerciseName {
19010    /// Snake-case canonical name from Profile.xlsx.
19011    pub fn as_str(&self) -> &'static str {
19012        match self {
19013            ShrugExerciseName::BarbellJumpShrug => "barbell_jump_shrug",
19014            ShrugExerciseName::BarbellShrug => "barbell_shrug",
19015            ShrugExerciseName::BarbellUprightRow => "barbell_upright_row",
19016            ShrugExerciseName::BehindTheBackSmithMachineShrug => {
19017                "behind_the_back_smith_machine_shrug"
19018            }
19019            ShrugExerciseName::DumbbellJumpShrug => "dumbbell_jump_shrug",
19020            ShrugExerciseName::DumbbellShrug => "dumbbell_shrug",
19021            ShrugExerciseName::DumbbellUprightRow => "dumbbell_upright_row",
19022            ShrugExerciseName::InclineDumbbellShrug => "incline_dumbbell_shrug",
19023            ShrugExerciseName::OverheadBarbellShrug => "overhead_barbell_shrug",
19024            ShrugExerciseName::OverheadDumbbellShrug => "overhead_dumbbell_shrug",
19025            ShrugExerciseName::ScaptionAndShrug => "scaption_and_shrug",
19026            ShrugExerciseName::ScapularRetraction => "scapular_retraction",
19027            ShrugExerciseName::SerratusChairShrug => "serratus_chair_shrug",
19028            ShrugExerciseName::WeightedSerratusChairShrug => "weighted_serratus_chair_shrug",
19029            ShrugExerciseName::SerratusShrug => "serratus_shrug",
19030            ShrugExerciseName::WeightedSerratusShrug => "weighted_serratus_shrug",
19031            ShrugExerciseName::WideGripJumpShrug => "wide_grip_jump_shrug",
19032            ShrugExerciseName::WideGripBarbellShrug => "wide_grip_barbell_shrug",
19033            ShrugExerciseName::BehindTheBackShrug => "behind_the_back_shrug",
19034            ShrugExerciseName::DumbbellShrugWheelchair => "dumbbell_shrug_wheelchair",
19035            ShrugExerciseName::ShrugWheelchair => "shrug_wheelchair",
19036            ShrugExerciseName::ShrugArmDownWheelchair => "shrug_arm_down_wheelchair",
19037            ShrugExerciseName::ShrugArmMidWheelchair => "shrug_arm_mid_wheelchair",
19038            ShrugExerciseName::ShrugArmUpWheelchair => "shrug_arm_up_wheelchair",
19039            ShrugExerciseName::UprightRow => "upright_row",
19040        }
19041    }
19042
19043    /// Try to construct from the underlying numeric value.
19044    pub fn from_value(value: u16) -> Option<Self> {
19045        match value {
19046            0 => Some(ShrugExerciseName::BarbellJumpShrug),
19047            1 => Some(ShrugExerciseName::BarbellShrug),
19048            2 => Some(ShrugExerciseName::BarbellUprightRow),
19049            3 => Some(ShrugExerciseName::BehindTheBackSmithMachineShrug),
19050            4 => Some(ShrugExerciseName::DumbbellJumpShrug),
19051            5 => Some(ShrugExerciseName::DumbbellShrug),
19052            6 => Some(ShrugExerciseName::DumbbellUprightRow),
19053            7 => Some(ShrugExerciseName::InclineDumbbellShrug),
19054            8 => Some(ShrugExerciseName::OverheadBarbellShrug),
19055            9 => Some(ShrugExerciseName::OverheadDumbbellShrug),
19056            10 => Some(ShrugExerciseName::ScaptionAndShrug),
19057            11 => Some(ShrugExerciseName::ScapularRetraction),
19058            12 => Some(ShrugExerciseName::SerratusChairShrug),
19059            13 => Some(ShrugExerciseName::WeightedSerratusChairShrug),
19060            14 => Some(ShrugExerciseName::SerratusShrug),
19061            15 => Some(ShrugExerciseName::WeightedSerratusShrug),
19062            16 => Some(ShrugExerciseName::WideGripJumpShrug),
19063            17 => Some(ShrugExerciseName::WideGripBarbellShrug),
19064            18 => Some(ShrugExerciseName::BehindTheBackShrug),
19065            19 => Some(ShrugExerciseName::DumbbellShrugWheelchair),
19066            20 => Some(ShrugExerciseName::ShrugWheelchair),
19067            21 => Some(ShrugExerciseName::ShrugArmDownWheelchair),
19068            22 => Some(ShrugExerciseName::ShrugArmMidWheelchair),
19069            23 => Some(ShrugExerciseName::ShrugArmUpWheelchair),
19070            24 => Some(ShrugExerciseName::UprightRow),
19071            _ => None,
19072        }
19073    }
19074
19075    /// Try to construct from the snake-case canonical name.
19076    pub fn from_str(name: &str) -> Option<Self> {
19077        match name {
19078            "barbell_jump_shrug" => Some(ShrugExerciseName::BarbellJumpShrug),
19079            "barbell_shrug" => Some(ShrugExerciseName::BarbellShrug),
19080            "barbell_upright_row" => Some(ShrugExerciseName::BarbellUprightRow),
19081            "behind_the_back_smith_machine_shrug" => {
19082                Some(ShrugExerciseName::BehindTheBackSmithMachineShrug)
19083            }
19084            "dumbbell_jump_shrug" => Some(ShrugExerciseName::DumbbellJumpShrug),
19085            "dumbbell_shrug" => Some(ShrugExerciseName::DumbbellShrug),
19086            "dumbbell_upright_row" => Some(ShrugExerciseName::DumbbellUprightRow),
19087            "incline_dumbbell_shrug" => Some(ShrugExerciseName::InclineDumbbellShrug),
19088            "overhead_barbell_shrug" => Some(ShrugExerciseName::OverheadBarbellShrug),
19089            "overhead_dumbbell_shrug" => Some(ShrugExerciseName::OverheadDumbbellShrug),
19090            "scaption_and_shrug" => Some(ShrugExerciseName::ScaptionAndShrug),
19091            "scapular_retraction" => Some(ShrugExerciseName::ScapularRetraction),
19092            "serratus_chair_shrug" => Some(ShrugExerciseName::SerratusChairShrug),
19093            "weighted_serratus_chair_shrug" => Some(ShrugExerciseName::WeightedSerratusChairShrug),
19094            "serratus_shrug" => Some(ShrugExerciseName::SerratusShrug),
19095            "weighted_serratus_shrug" => Some(ShrugExerciseName::WeightedSerratusShrug),
19096            "wide_grip_jump_shrug" => Some(ShrugExerciseName::WideGripJumpShrug),
19097            "wide_grip_barbell_shrug" => Some(ShrugExerciseName::WideGripBarbellShrug),
19098            "behind_the_back_shrug" => Some(ShrugExerciseName::BehindTheBackShrug),
19099            "dumbbell_shrug_wheelchair" => Some(ShrugExerciseName::DumbbellShrugWheelchair),
19100            "shrug_wheelchair" => Some(ShrugExerciseName::ShrugWheelchair),
19101            "shrug_arm_down_wheelchair" => Some(ShrugExerciseName::ShrugArmDownWheelchair),
19102            "shrug_arm_mid_wheelchair" => Some(ShrugExerciseName::ShrugArmMidWheelchair),
19103            "shrug_arm_up_wheelchair" => Some(ShrugExerciseName::ShrugArmUpWheelchair),
19104            "upright_row" => Some(ShrugExerciseName::UprightRow),
19105            _ => None,
19106        }
19107    }
19108}
19109
19110#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
19111#[repr(u16)]
19112#[non_exhaustive]
19113pub enum SitUpExerciseName {
19114    AlternatingSitUp = 0,
19115    WeightedAlternatingSitUp = 1,
19116    BentKneeVUp = 2,
19117    WeightedBentKneeVUp = 3,
19118    ButterflySitUp = 4,
19119    WeightedButterflySitup = 5,
19120    CrossPunchRollUp = 6,
19121    WeightedCrossPunchRollUp = 7,
19122    CrossedArmsSitUp = 8,
19123    WeightedCrossedArmsSitUp = 9,
19124    GetUpSitUp = 10,
19125    WeightedGetUpSitUp = 11,
19126    HoveringSitUp = 12,
19127    WeightedHoveringSitUp = 13,
19128    KettlebellSitUp = 14,
19129    MedicineBallAlternatingVUp = 15,
19130    MedicineBallSitUp = 16,
19131    MedicineBallVUp = 17,
19132    ModifiedSitUp = 18,
19133    NegativeSitUp = 19,
19134    OneArmFullSitUp = 20,
19135    RecliningCircle = 21,
19136    WeightedRecliningCircle = 22,
19137    ReverseCurlUp = 23,
19138    WeightedReverseCurlUp = 24,
19139    SingleLegSwissBallJackknife = 25,
19140    WeightedSingleLegSwissBallJackknife = 26,
19141    TheTeaser = 27,
19142    TheTeaserWeighted = 28,
19143    ThreePartRollDown = 29,
19144    WeightedThreePartRollDown = 30,
19145    VUp = 31,
19146    WeightedVUp = 32,
19147    WeightedRussianTwistOnSwissBall = 33,
19148    WeightedSitUp = 34,
19149    XAbs = 35,
19150    WeightedXAbs = 36,
19151    SitUp = 37,
19152    GhdSitUps = 38,
19153    SitUpTurkishGetUp = 39,
19154    RussianTwistOnSwissBall = 40,
19155}
19156
19157impl SitUpExerciseName {
19158    /// Snake-case canonical name from Profile.xlsx.
19159    pub fn as_str(&self) -> &'static str {
19160        match self {
19161            SitUpExerciseName::AlternatingSitUp => "alternating_sit_up",
19162            SitUpExerciseName::WeightedAlternatingSitUp => "weighted_alternating_sit_up",
19163            SitUpExerciseName::BentKneeVUp => "bent_knee_v_up",
19164            SitUpExerciseName::WeightedBentKneeVUp => "weighted_bent_knee_v_up",
19165            SitUpExerciseName::ButterflySitUp => "butterfly_sit_up",
19166            SitUpExerciseName::WeightedButterflySitup => "weighted_butterfly_situp",
19167            SitUpExerciseName::CrossPunchRollUp => "cross_punch_roll_up",
19168            SitUpExerciseName::WeightedCrossPunchRollUp => "weighted_cross_punch_roll_up",
19169            SitUpExerciseName::CrossedArmsSitUp => "crossed_arms_sit_up",
19170            SitUpExerciseName::WeightedCrossedArmsSitUp => "weighted_crossed_arms_sit_up",
19171            SitUpExerciseName::GetUpSitUp => "get_up_sit_up",
19172            SitUpExerciseName::WeightedGetUpSitUp => "weighted_get_up_sit_up",
19173            SitUpExerciseName::HoveringSitUp => "hovering_sit_up",
19174            SitUpExerciseName::WeightedHoveringSitUp => "weighted_hovering_sit_up",
19175            SitUpExerciseName::KettlebellSitUp => "kettlebell_sit_up",
19176            SitUpExerciseName::MedicineBallAlternatingVUp => "medicine_ball_alternating_v_up",
19177            SitUpExerciseName::MedicineBallSitUp => "medicine_ball_sit_up",
19178            SitUpExerciseName::MedicineBallVUp => "medicine_ball_v_up",
19179            SitUpExerciseName::ModifiedSitUp => "modified_sit_up",
19180            SitUpExerciseName::NegativeSitUp => "negative_sit_up",
19181            SitUpExerciseName::OneArmFullSitUp => "one_arm_full_sit_up",
19182            SitUpExerciseName::RecliningCircle => "reclining_circle",
19183            SitUpExerciseName::WeightedRecliningCircle => "weighted_reclining_circle",
19184            SitUpExerciseName::ReverseCurlUp => "reverse_curl_up",
19185            SitUpExerciseName::WeightedReverseCurlUp => "weighted_reverse_curl_up",
19186            SitUpExerciseName::SingleLegSwissBallJackknife => "single_leg_swiss_ball_jackknife",
19187            SitUpExerciseName::WeightedSingleLegSwissBallJackknife => {
19188                "weighted_single_leg_swiss_ball_jackknife"
19189            }
19190            SitUpExerciseName::TheTeaser => "the_teaser",
19191            SitUpExerciseName::TheTeaserWeighted => "the_teaser_weighted",
19192            SitUpExerciseName::ThreePartRollDown => "three_part_roll_down",
19193            SitUpExerciseName::WeightedThreePartRollDown => "weighted_three_part_roll_down",
19194            SitUpExerciseName::VUp => "v_up",
19195            SitUpExerciseName::WeightedVUp => "weighted_v_up",
19196            SitUpExerciseName::WeightedRussianTwistOnSwissBall => {
19197                "weighted_russian_twist_on_swiss_ball"
19198            }
19199            SitUpExerciseName::WeightedSitUp => "weighted_sit_up",
19200            SitUpExerciseName::XAbs => "x_abs",
19201            SitUpExerciseName::WeightedXAbs => "weighted_x_abs",
19202            SitUpExerciseName::SitUp => "sit_up",
19203            SitUpExerciseName::GhdSitUps => "ghd_sit_ups",
19204            SitUpExerciseName::SitUpTurkishGetUp => "sit_up_turkish_get_up",
19205            SitUpExerciseName::RussianTwistOnSwissBall => "russian_twist_on_swiss_ball",
19206        }
19207    }
19208
19209    /// Try to construct from the underlying numeric value.
19210    pub fn from_value(value: u16) -> Option<Self> {
19211        match value {
19212            0 => Some(SitUpExerciseName::AlternatingSitUp),
19213            1 => Some(SitUpExerciseName::WeightedAlternatingSitUp),
19214            2 => Some(SitUpExerciseName::BentKneeVUp),
19215            3 => Some(SitUpExerciseName::WeightedBentKneeVUp),
19216            4 => Some(SitUpExerciseName::ButterflySitUp),
19217            5 => Some(SitUpExerciseName::WeightedButterflySitup),
19218            6 => Some(SitUpExerciseName::CrossPunchRollUp),
19219            7 => Some(SitUpExerciseName::WeightedCrossPunchRollUp),
19220            8 => Some(SitUpExerciseName::CrossedArmsSitUp),
19221            9 => Some(SitUpExerciseName::WeightedCrossedArmsSitUp),
19222            10 => Some(SitUpExerciseName::GetUpSitUp),
19223            11 => Some(SitUpExerciseName::WeightedGetUpSitUp),
19224            12 => Some(SitUpExerciseName::HoveringSitUp),
19225            13 => Some(SitUpExerciseName::WeightedHoveringSitUp),
19226            14 => Some(SitUpExerciseName::KettlebellSitUp),
19227            15 => Some(SitUpExerciseName::MedicineBallAlternatingVUp),
19228            16 => Some(SitUpExerciseName::MedicineBallSitUp),
19229            17 => Some(SitUpExerciseName::MedicineBallVUp),
19230            18 => Some(SitUpExerciseName::ModifiedSitUp),
19231            19 => Some(SitUpExerciseName::NegativeSitUp),
19232            20 => Some(SitUpExerciseName::OneArmFullSitUp),
19233            21 => Some(SitUpExerciseName::RecliningCircle),
19234            22 => Some(SitUpExerciseName::WeightedRecliningCircle),
19235            23 => Some(SitUpExerciseName::ReverseCurlUp),
19236            24 => Some(SitUpExerciseName::WeightedReverseCurlUp),
19237            25 => Some(SitUpExerciseName::SingleLegSwissBallJackknife),
19238            26 => Some(SitUpExerciseName::WeightedSingleLegSwissBallJackknife),
19239            27 => Some(SitUpExerciseName::TheTeaser),
19240            28 => Some(SitUpExerciseName::TheTeaserWeighted),
19241            29 => Some(SitUpExerciseName::ThreePartRollDown),
19242            30 => Some(SitUpExerciseName::WeightedThreePartRollDown),
19243            31 => Some(SitUpExerciseName::VUp),
19244            32 => Some(SitUpExerciseName::WeightedVUp),
19245            33 => Some(SitUpExerciseName::WeightedRussianTwistOnSwissBall),
19246            34 => Some(SitUpExerciseName::WeightedSitUp),
19247            35 => Some(SitUpExerciseName::XAbs),
19248            36 => Some(SitUpExerciseName::WeightedXAbs),
19249            37 => Some(SitUpExerciseName::SitUp),
19250            38 => Some(SitUpExerciseName::GhdSitUps),
19251            39 => Some(SitUpExerciseName::SitUpTurkishGetUp),
19252            40 => Some(SitUpExerciseName::RussianTwistOnSwissBall),
19253            _ => None,
19254        }
19255    }
19256
19257    /// Try to construct from the snake-case canonical name.
19258    pub fn from_str(name: &str) -> Option<Self> {
19259        match name {
19260            "alternating_sit_up" => Some(SitUpExerciseName::AlternatingSitUp),
19261            "weighted_alternating_sit_up" => Some(SitUpExerciseName::WeightedAlternatingSitUp),
19262            "bent_knee_v_up" => Some(SitUpExerciseName::BentKneeVUp),
19263            "weighted_bent_knee_v_up" => Some(SitUpExerciseName::WeightedBentKneeVUp),
19264            "butterfly_sit_up" => Some(SitUpExerciseName::ButterflySitUp),
19265            "weighted_butterfly_situp" => Some(SitUpExerciseName::WeightedButterflySitup),
19266            "cross_punch_roll_up" => Some(SitUpExerciseName::CrossPunchRollUp),
19267            "weighted_cross_punch_roll_up" => Some(SitUpExerciseName::WeightedCrossPunchRollUp),
19268            "crossed_arms_sit_up" => Some(SitUpExerciseName::CrossedArmsSitUp),
19269            "weighted_crossed_arms_sit_up" => Some(SitUpExerciseName::WeightedCrossedArmsSitUp),
19270            "get_up_sit_up" => Some(SitUpExerciseName::GetUpSitUp),
19271            "weighted_get_up_sit_up" => Some(SitUpExerciseName::WeightedGetUpSitUp),
19272            "hovering_sit_up" => Some(SitUpExerciseName::HoveringSitUp),
19273            "weighted_hovering_sit_up" => Some(SitUpExerciseName::WeightedHoveringSitUp),
19274            "kettlebell_sit_up" => Some(SitUpExerciseName::KettlebellSitUp),
19275            "medicine_ball_alternating_v_up" => Some(SitUpExerciseName::MedicineBallAlternatingVUp),
19276            "medicine_ball_sit_up" => Some(SitUpExerciseName::MedicineBallSitUp),
19277            "medicine_ball_v_up" => Some(SitUpExerciseName::MedicineBallVUp),
19278            "modified_sit_up" => Some(SitUpExerciseName::ModifiedSitUp),
19279            "negative_sit_up" => Some(SitUpExerciseName::NegativeSitUp),
19280            "one_arm_full_sit_up" => Some(SitUpExerciseName::OneArmFullSitUp),
19281            "reclining_circle" => Some(SitUpExerciseName::RecliningCircle),
19282            "weighted_reclining_circle" => Some(SitUpExerciseName::WeightedRecliningCircle),
19283            "reverse_curl_up" => Some(SitUpExerciseName::ReverseCurlUp),
19284            "weighted_reverse_curl_up" => Some(SitUpExerciseName::WeightedReverseCurlUp),
19285            "single_leg_swiss_ball_jackknife" => {
19286                Some(SitUpExerciseName::SingleLegSwissBallJackknife)
19287            }
19288            "weighted_single_leg_swiss_ball_jackknife" => {
19289                Some(SitUpExerciseName::WeightedSingleLegSwissBallJackknife)
19290            }
19291            "the_teaser" => Some(SitUpExerciseName::TheTeaser),
19292            "the_teaser_weighted" => Some(SitUpExerciseName::TheTeaserWeighted),
19293            "three_part_roll_down" => Some(SitUpExerciseName::ThreePartRollDown),
19294            "weighted_three_part_roll_down" => Some(SitUpExerciseName::WeightedThreePartRollDown),
19295            "v_up" => Some(SitUpExerciseName::VUp),
19296            "weighted_v_up" => Some(SitUpExerciseName::WeightedVUp),
19297            "weighted_russian_twist_on_swiss_ball" => {
19298                Some(SitUpExerciseName::WeightedRussianTwistOnSwissBall)
19299            }
19300            "weighted_sit_up" => Some(SitUpExerciseName::WeightedSitUp),
19301            "x_abs" => Some(SitUpExerciseName::XAbs),
19302            "weighted_x_abs" => Some(SitUpExerciseName::WeightedXAbs),
19303            "sit_up" => Some(SitUpExerciseName::SitUp),
19304            "ghd_sit_ups" => Some(SitUpExerciseName::GhdSitUps),
19305            "sit_up_turkish_get_up" => Some(SitUpExerciseName::SitUpTurkishGetUp),
19306            "russian_twist_on_swiss_ball" => Some(SitUpExerciseName::RussianTwistOnSwissBall),
19307            _ => None,
19308        }
19309    }
19310}
19311
19312#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
19313#[repr(u16)]
19314#[non_exhaustive]
19315pub enum SquatExerciseName {
19316    LegPress = 0,
19317    BackSquatWithBodyBar = 1,
19318    BackSquats = 2,
19319    WeightedBackSquats = 3,
19320    BalancingSquat = 4,
19321    WeightedBalancingSquat = 5,
19322    BarbellBackSquat = 6,
19323    BarbellBoxSquat = 7,
19324    BarbellFrontSquat = 8,
19325    BarbellHackSquat = 9,
19326    BarbellHangSquatSnatch = 10,
19327    BarbellLateralStepUp = 11,
19328    BarbellQuarterSquat = 12,
19329    BarbellSiffSquat = 13,
19330    BarbellSquatSnatch = 14,
19331    BarbellSquatWithHeelsRaised = 15,
19332    BarbellStepover = 16,
19333    BarbellStepUp = 17,
19334    BenchSquatWithRotationalChop = 18,
19335    WeightedBenchSquatWithRotationalChop = 19,
19336    BodyWeightWallSquat = 20,
19337    WeightedWallSquat = 21,
19338    BoxStepSquat = 22,
19339    WeightedBoxStepSquat = 23,
19340    BracedSquat = 24,
19341    CrossedArmBarbellFrontSquat = 25,
19342    CrossoverDumbbellStepUp = 26,
19343    DumbbellFrontSquat = 27,
19344    DumbbellSplitSquat = 28,
19345    DumbbellSquat = 29,
19346    DumbbellSquatClean = 30,
19347    DumbbellStepover = 31,
19348    DumbbellStepUp = 32,
19349    ElevatedSingleLegSquat = 33,
19350    WeightedElevatedSingleLegSquat = 34,
19351    FigureFourSquats = 35,
19352    WeightedFigureFourSquats = 36,
19353    GobletSquat = 37,
19354    KettlebellSquat = 38,
19355    KettlebellSwingOverhead = 39,
19356    KettlebellSwingWithFlipToSquat = 40,
19357    LateralDumbbellStepUp = 41,
19358    OneLeggedSquat = 42,
19359    OverheadDumbbellSquat = 43,
19360    OverheadSquat = 44,
19361    PartialSingleLegSquat = 45,
19362    WeightedPartialSingleLegSquat = 46,
19363    PistolSquat = 47,
19364    WeightedPistolSquat = 48,
19365    PlieSlides = 49,
19366    WeightedPlieSlides = 50,
19367    PlieSquat = 51,
19368    WeightedPlieSquat = 52,
19369    PrisonerSquat = 53,
19370    WeightedPrisonerSquat = 54,
19371    SingleLegBenchGetUp = 55,
19372    WeightedSingleLegBenchGetUp = 56,
19373    SingleLegBenchSquat = 57,
19374    WeightedSingleLegBenchSquat = 58,
19375    SingleLegSquatOnSwissBall = 59,
19376    WeightedSingleLegSquatOnSwissBall = 60,
19377    Squat = 61,
19378    WeightedSquat = 62,
19379    SquatsWithBand = 63,
19380    StaggeredSquat = 64,
19381    WeightedStaggeredSquat = 65,
19382    StepUp = 66,
19383    WeightedStepUp = 67,
19384    SuitcaseSquats = 68,
19385    SumoSquat = 69,
19386    SumoSquatSlideIn = 70,
19387    WeightedSumoSquatSlideIn = 71,
19388    SumoSquatToHighPull = 72,
19389    SumoSquatToStand = 73,
19390    WeightedSumoSquatToStand = 74,
19391    SumoSquatWithRotation = 75,
19392    WeightedSumoSquatWithRotation = 76,
19393    SwissBallBodyWeightWallSquat = 77,
19394    WeightedSwissBallWallSquat = 78,
19395    Thrusters = 79,
19396    UnevenSquat = 80,
19397    WeightedUnevenSquat = 81,
19398    WaistSlimmingSquat = 82,
19399    WallBall = 83,
19400    WideStanceBarbellSquat = 84,
19401    WideStanceGobletSquat = 85,
19402    ZercherSquat = 86,
19403    KbsOverhead = 87,
19404    SquatAndSideKick = 88,
19405    SquatJumpsInNOut = 89,
19406    PilatesPlieSquatsParallelTurnedOutFlatAndHeels = 90,
19407    ReleveStraightLegAndKneeBentWithOneLegVariation = 91,
19408    AlternatingBoxDumbbellStepUps = 92,
19409    DumbbellOverheadSquatSingleArm = 93,
19410    DumbbellSquatSnatch = 94,
19411    MedicineBallSquat = 95,
19412    WallBallSquatAndPress = 97,
19413    SquatAmericanSwing = 98,
19414    AirSquat = 100,
19415    DumbbellThrusters = 101,
19416    OverheadBarbellSquat = 102,
19417}
19418
19419impl SquatExerciseName {
19420    /// Snake-case canonical name from Profile.xlsx.
19421    pub fn as_str(&self) -> &'static str {
19422        match self {
19423            SquatExerciseName::LegPress => "leg_press",
19424            SquatExerciseName::BackSquatWithBodyBar => "back_squat_with_body_bar",
19425            SquatExerciseName::BackSquats => "back_squats",
19426            SquatExerciseName::WeightedBackSquats => "weighted_back_squats",
19427            SquatExerciseName::BalancingSquat => "balancing_squat",
19428            SquatExerciseName::WeightedBalancingSquat => "weighted_balancing_squat",
19429            SquatExerciseName::BarbellBackSquat => "barbell_back_squat",
19430            SquatExerciseName::BarbellBoxSquat => "barbell_box_squat",
19431            SquatExerciseName::BarbellFrontSquat => "barbell_front_squat",
19432            SquatExerciseName::BarbellHackSquat => "barbell_hack_squat",
19433            SquatExerciseName::BarbellHangSquatSnatch => "barbell_hang_squat_snatch",
19434            SquatExerciseName::BarbellLateralStepUp => "barbell_lateral_step_up",
19435            SquatExerciseName::BarbellQuarterSquat => "barbell_quarter_squat",
19436            SquatExerciseName::BarbellSiffSquat => "barbell_siff_squat",
19437            SquatExerciseName::BarbellSquatSnatch => "barbell_squat_snatch",
19438            SquatExerciseName::BarbellSquatWithHeelsRaised => "barbell_squat_with_heels_raised",
19439            SquatExerciseName::BarbellStepover => "barbell_stepover",
19440            SquatExerciseName::BarbellStepUp => "barbell_step_up",
19441            SquatExerciseName::BenchSquatWithRotationalChop => "bench_squat_with_rotational_chop",
19442            SquatExerciseName::WeightedBenchSquatWithRotationalChop => {
19443                "weighted_bench_squat_with_rotational_chop"
19444            }
19445            SquatExerciseName::BodyWeightWallSquat => "body_weight_wall_squat",
19446            SquatExerciseName::WeightedWallSquat => "weighted_wall_squat",
19447            SquatExerciseName::BoxStepSquat => "box_step_squat",
19448            SquatExerciseName::WeightedBoxStepSquat => "weighted_box_step_squat",
19449            SquatExerciseName::BracedSquat => "braced_squat",
19450            SquatExerciseName::CrossedArmBarbellFrontSquat => "crossed_arm_barbell_front_squat",
19451            SquatExerciseName::CrossoverDumbbellStepUp => "crossover_dumbbell_step_up",
19452            SquatExerciseName::DumbbellFrontSquat => "dumbbell_front_squat",
19453            SquatExerciseName::DumbbellSplitSquat => "dumbbell_split_squat",
19454            SquatExerciseName::DumbbellSquat => "dumbbell_squat",
19455            SquatExerciseName::DumbbellSquatClean => "dumbbell_squat_clean",
19456            SquatExerciseName::DumbbellStepover => "dumbbell_stepover",
19457            SquatExerciseName::DumbbellStepUp => "dumbbell_step_up",
19458            SquatExerciseName::ElevatedSingleLegSquat => "elevated_single_leg_squat",
19459            SquatExerciseName::WeightedElevatedSingleLegSquat => {
19460                "weighted_elevated_single_leg_squat"
19461            }
19462            SquatExerciseName::FigureFourSquats => "figure_four_squats",
19463            SquatExerciseName::WeightedFigureFourSquats => "weighted_figure_four_squats",
19464            SquatExerciseName::GobletSquat => "goblet_squat",
19465            SquatExerciseName::KettlebellSquat => "kettlebell_squat",
19466            SquatExerciseName::KettlebellSwingOverhead => "kettlebell_swing_overhead",
19467            SquatExerciseName::KettlebellSwingWithFlipToSquat => {
19468                "kettlebell_swing_with_flip_to_squat"
19469            }
19470            SquatExerciseName::LateralDumbbellStepUp => "lateral_dumbbell_step_up",
19471            SquatExerciseName::OneLeggedSquat => "one_legged_squat",
19472            SquatExerciseName::OverheadDumbbellSquat => "overhead_dumbbell_squat",
19473            SquatExerciseName::OverheadSquat => "overhead_squat",
19474            SquatExerciseName::PartialSingleLegSquat => "partial_single_leg_squat",
19475            SquatExerciseName::WeightedPartialSingleLegSquat => "weighted_partial_single_leg_squat",
19476            SquatExerciseName::PistolSquat => "pistol_squat",
19477            SquatExerciseName::WeightedPistolSquat => "weighted_pistol_squat",
19478            SquatExerciseName::PlieSlides => "plie_slides",
19479            SquatExerciseName::WeightedPlieSlides => "weighted_plie_slides",
19480            SquatExerciseName::PlieSquat => "plie_squat",
19481            SquatExerciseName::WeightedPlieSquat => "weighted_plie_squat",
19482            SquatExerciseName::PrisonerSquat => "prisoner_squat",
19483            SquatExerciseName::WeightedPrisonerSquat => "weighted_prisoner_squat",
19484            SquatExerciseName::SingleLegBenchGetUp => "single_leg_bench_get_up",
19485            SquatExerciseName::WeightedSingleLegBenchGetUp => "weighted_single_leg_bench_get_up",
19486            SquatExerciseName::SingleLegBenchSquat => "single_leg_bench_squat",
19487            SquatExerciseName::WeightedSingleLegBenchSquat => "weighted_single_leg_bench_squat",
19488            SquatExerciseName::SingleLegSquatOnSwissBall => "single_leg_squat_on_swiss_ball",
19489            SquatExerciseName::WeightedSingleLegSquatOnSwissBall => {
19490                "weighted_single_leg_squat_on_swiss_ball"
19491            }
19492            SquatExerciseName::Squat => "squat",
19493            SquatExerciseName::WeightedSquat => "weighted_squat",
19494            SquatExerciseName::SquatsWithBand => "squats_with_band",
19495            SquatExerciseName::StaggeredSquat => "staggered_squat",
19496            SquatExerciseName::WeightedStaggeredSquat => "weighted_staggered_squat",
19497            SquatExerciseName::StepUp => "step_up",
19498            SquatExerciseName::WeightedStepUp => "weighted_step_up",
19499            SquatExerciseName::SuitcaseSquats => "suitcase_squats",
19500            SquatExerciseName::SumoSquat => "sumo_squat",
19501            SquatExerciseName::SumoSquatSlideIn => "sumo_squat_slide_in",
19502            SquatExerciseName::WeightedSumoSquatSlideIn => "weighted_sumo_squat_slide_in",
19503            SquatExerciseName::SumoSquatToHighPull => "sumo_squat_to_high_pull",
19504            SquatExerciseName::SumoSquatToStand => "sumo_squat_to_stand",
19505            SquatExerciseName::WeightedSumoSquatToStand => "weighted_sumo_squat_to_stand",
19506            SquatExerciseName::SumoSquatWithRotation => "sumo_squat_with_rotation",
19507            SquatExerciseName::WeightedSumoSquatWithRotation => "weighted_sumo_squat_with_rotation",
19508            SquatExerciseName::SwissBallBodyWeightWallSquat => "swiss_ball_body_weight_wall_squat",
19509            SquatExerciseName::WeightedSwissBallWallSquat => "weighted_swiss_ball_wall_squat",
19510            SquatExerciseName::Thrusters => "thrusters",
19511            SquatExerciseName::UnevenSquat => "uneven_squat",
19512            SquatExerciseName::WeightedUnevenSquat => "weighted_uneven_squat",
19513            SquatExerciseName::WaistSlimmingSquat => "waist_slimming_squat",
19514            SquatExerciseName::WallBall => "wall_ball",
19515            SquatExerciseName::WideStanceBarbellSquat => "wide_stance_barbell_squat",
19516            SquatExerciseName::WideStanceGobletSquat => "wide_stance_goblet_squat",
19517            SquatExerciseName::ZercherSquat => "zercher_squat",
19518            SquatExerciseName::KbsOverhead => "kbs_overhead",
19519            SquatExerciseName::SquatAndSideKick => "squat_and_side_kick",
19520            SquatExerciseName::SquatJumpsInNOut => "squat_jumps_in_n_out",
19521            SquatExerciseName::PilatesPlieSquatsParallelTurnedOutFlatAndHeels => {
19522                "pilates_plie_squats_parallel_turned_out_flat_and_heels"
19523            }
19524            SquatExerciseName::ReleveStraightLegAndKneeBentWithOneLegVariation => {
19525                "releve_straight_leg_and_knee_bent_with_one_leg_variation"
19526            }
19527            SquatExerciseName::AlternatingBoxDumbbellStepUps => "alternating_box_dumbbell_step_ups",
19528            SquatExerciseName::DumbbellOverheadSquatSingleArm => {
19529                "dumbbell_overhead_squat_single_arm"
19530            }
19531            SquatExerciseName::DumbbellSquatSnatch => "dumbbell_squat_snatch",
19532            SquatExerciseName::MedicineBallSquat => "medicine_ball_squat",
19533            SquatExerciseName::WallBallSquatAndPress => "wall_ball_squat_and_press",
19534            SquatExerciseName::SquatAmericanSwing => "squat_american_swing",
19535            SquatExerciseName::AirSquat => "air_squat",
19536            SquatExerciseName::DumbbellThrusters => "dumbbell_thrusters",
19537            SquatExerciseName::OverheadBarbellSquat => "overhead_barbell_squat",
19538        }
19539    }
19540
19541    /// Try to construct from the underlying numeric value.
19542    pub fn from_value(value: u16) -> Option<Self> {
19543        match value {
19544            0 => Some(SquatExerciseName::LegPress),
19545            1 => Some(SquatExerciseName::BackSquatWithBodyBar),
19546            2 => Some(SquatExerciseName::BackSquats),
19547            3 => Some(SquatExerciseName::WeightedBackSquats),
19548            4 => Some(SquatExerciseName::BalancingSquat),
19549            5 => Some(SquatExerciseName::WeightedBalancingSquat),
19550            6 => Some(SquatExerciseName::BarbellBackSquat),
19551            7 => Some(SquatExerciseName::BarbellBoxSquat),
19552            8 => Some(SquatExerciseName::BarbellFrontSquat),
19553            9 => Some(SquatExerciseName::BarbellHackSquat),
19554            10 => Some(SquatExerciseName::BarbellHangSquatSnatch),
19555            11 => Some(SquatExerciseName::BarbellLateralStepUp),
19556            12 => Some(SquatExerciseName::BarbellQuarterSquat),
19557            13 => Some(SquatExerciseName::BarbellSiffSquat),
19558            14 => Some(SquatExerciseName::BarbellSquatSnatch),
19559            15 => Some(SquatExerciseName::BarbellSquatWithHeelsRaised),
19560            16 => Some(SquatExerciseName::BarbellStepover),
19561            17 => Some(SquatExerciseName::BarbellStepUp),
19562            18 => Some(SquatExerciseName::BenchSquatWithRotationalChop),
19563            19 => Some(SquatExerciseName::WeightedBenchSquatWithRotationalChop),
19564            20 => Some(SquatExerciseName::BodyWeightWallSquat),
19565            21 => Some(SquatExerciseName::WeightedWallSquat),
19566            22 => Some(SquatExerciseName::BoxStepSquat),
19567            23 => Some(SquatExerciseName::WeightedBoxStepSquat),
19568            24 => Some(SquatExerciseName::BracedSquat),
19569            25 => Some(SquatExerciseName::CrossedArmBarbellFrontSquat),
19570            26 => Some(SquatExerciseName::CrossoverDumbbellStepUp),
19571            27 => Some(SquatExerciseName::DumbbellFrontSquat),
19572            28 => Some(SquatExerciseName::DumbbellSplitSquat),
19573            29 => Some(SquatExerciseName::DumbbellSquat),
19574            30 => Some(SquatExerciseName::DumbbellSquatClean),
19575            31 => Some(SquatExerciseName::DumbbellStepover),
19576            32 => Some(SquatExerciseName::DumbbellStepUp),
19577            33 => Some(SquatExerciseName::ElevatedSingleLegSquat),
19578            34 => Some(SquatExerciseName::WeightedElevatedSingleLegSquat),
19579            35 => Some(SquatExerciseName::FigureFourSquats),
19580            36 => Some(SquatExerciseName::WeightedFigureFourSquats),
19581            37 => Some(SquatExerciseName::GobletSquat),
19582            38 => Some(SquatExerciseName::KettlebellSquat),
19583            39 => Some(SquatExerciseName::KettlebellSwingOverhead),
19584            40 => Some(SquatExerciseName::KettlebellSwingWithFlipToSquat),
19585            41 => Some(SquatExerciseName::LateralDumbbellStepUp),
19586            42 => Some(SquatExerciseName::OneLeggedSquat),
19587            43 => Some(SquatExerciseName::OverheadDumbbellSquat),
19588            44 => Some(SquatExerciseName::OverheadSquat),
19589            45 => Some(SquatExerciseName::PartialSingleLegSquat),
19590            46 => Some(SquatExerciseName::WeightedPartialSingleLegSquat),
19591            47 => Some(SquatExerciseName::PistolSquat),
19592            48 => Some(SquatExerciseName::WeightedPistolSquat),
19593            49 => Some(SquatExerciseName::PlieSlides),
19594            50 => Some(SquatExerciseName::WeightedPlieSlides),
19595            51 => Some(SquatExerciseName::PlieSquat),
19596            52 => Some(SquatExerciseName::WeightedPlieSquat),
19597            53 => Some(SquatExerciseName::PrisonerSquat),
19598            54 => Some(SquatExerciseName::WeightedPrisonerSquat),
19599            55 => Some(SquatExerciseName::SingleLegBenchGetUp),
19600            56 => Some(SquatExerciseName::WeightedSingleLegBenchGetUp),
19601            57 => Some(SquatExerciseName::SingleLegBenchSquat),
19602            58 => Some(SquatExerciseName::WeightedSingleLegBenchSquat),
19603            59 => Some(SquatExerciseName::SingleLegSquatOnSwissBall),
19604            60 => Some(SquatExerciseName::WeightedSingleLegSquatOnSwissBall),
19605            61 => Some(SquatExerciseName::Squat),
19606            62 => Some(SquatExerciseName::WeightedSquat),
19607            63 => Some(SquatExerciseName::SquatsWithBand),
19608            64 => Some(SquatExerciseName::StaggeredSquat),
19609            65 => Some(SquatExerciseName::WeightedStaggeredSquat),
19610            66 => Some(SquatExerciseName::StepUp),
19611            67 => Some(SquatExerciseName::WeightedStepUp),
19612            68 => Some(SquatExerciseName::SuitcaseSquats),
19613            69 => Some(SquatExerciseName::SumoSquat),
19614            70 => Some(SquatExerciseName::SumoSquatSlideIn),
19615            71 => Some(SquatExerciseName::WeightedSumoSquatSlideIn),
19616            72 => Some(SquatExerciseName::SumoSquatToHighPull),
19617            73 => Some(SquatExerciseName::SumoSquatToStand),
19618            74 => Some(SquatExerciseName::WeightedSumoSquatToStand),
19619            75 => Some(SquatExerciseName::SumoSquatWithRotation),
19620            76 => Some(SquatExerciseName::WeightedSumoSquatWithRotation),
19621            77 => Some(SquatExerciseName::SwissBallBodyWeightWallSquat),
19622            78 => Some(SquatExerciseName::WeightedSwissBallWallSquat),
19623            79 => Some(SquatExerciseName::Thrusters),
19624            80 => Some(SquatExerciseName::UnevenSquat),
19625            81 => Some(SquatExerciseName::WeightedUnevenSquat),
19626            82 => Some(SquatExerciseName::WaistSlimmingSquat),
19627            83 => Some(SquatExerciseName::WallBall),
19628            84 => Some(SquatExerciseName::WideStanceBarbellSquat),
19629            85 => Some(SquatExerciseName::WideStanceGobletSquat),
19630            86 => Some(SquatExerciseName::ZercherSquat),
19631            87 => Some(SquatExerciseName::KbsOverhead),
19632            88 => Some(SquatExerciseName::SquatAndSideKick),
19633            89 => Some(SquatExerciseName::SquatJumpsInNOut),
19634            90 => Some(SquatExerciseName::PilatesPlieSquatsParallelTurnedOutFlatAndHeels),
19635            91 => Some(SquatExerciseName::ReleveStraightLegAndKneeBentWithOneLegVariation),
19636            92 => Some(SquatExerciseName::AlternatingBoxDumbbellStepUps),
19637            93 => Some(SquatExerciseName::DumbbellOverheadSquatSingleArm),
19638            94 => Some(SquatExerciseName::DumbbellSquatSnatch),
19639            95 => Some(SquatExerciseName::MedicineBallSquat),
19640            97 => Some(SquatExerciseName::WallBallSquatAndPress),
19641            98 => Some(SquatExerciseName::SquatAmericanSwing),
19642            100 => Some(SquatExerciseName::AirSquat),
19643            101 => Some(SquatExerciseName::DumbbellThrusters),
19644            102 => Some(SquatExerciseName::OverheadBarbellSquat),
19645            _ => None,
19646        }
19647    }
19648
19649    /// Try to construct from the snake-case canonical name.
19650    pub fn from_str(name: &str) -> Option<Self> {
19651        match name {
19652            "leg_press" => Some(SquatExerciseName::LegPress),
19653            "back_squat_with_body_bar" => Some(SquatExerciseName::BackSquatWithBodyBar),
19654            "back_squats" => Some(SquatExerciseName::BackSquats),
19655            "weighted_back_squats" => Some(SquatExerciseName::WeightedBackSquats),
19656            "balancing_squat" => Some(SquatExerciseName::BalancingSquat),
19657            "weighted_balancing_squat" => Some(SquatExerciseName::WeightedBalancingSquat),
19658            "barbell_back_squat" => Some(SquatExerciseName::BarbellBackSquat),
19659            "barbell_box_squat" => Some(SquatExerciseName::BarbellBoxSquat),
19660            "barbell_front_squat" => Some(SquatExerciseName::BarbellFrontSquat),
19661            "barbell_hack_squat" => Some(SquatExerciseName::BarbellHackSquat),
19662            "barbell_hang_squat_snatch" => Some(SquatExerciseName::BarbellHangSquatSnatch),
19663            "barbell_lateral_step_up" => Some(SquatExerciseName::BarbellLateralStepUp),
19664            "barbell_quarter_squat" => Some(SquatExerciseName::BarbellQuarterSquat),
19665            "barbell_siff_squat" => Some(SquatExerciseName::BarbellSiffSquat),
19666            "barbell_squat_snatch" => Some(SquatExerciseName::BarbellSquatSnatch),
19667            "barbell_squat_with_heels_raised" => {
19668                Some(SquatExerciseName::BarbellSquatWithHeelsRaised)
19669            }
19670            "barbell_stepover" => Some(SquatExerciseName::BarbellStepover),
19671            "barbell_step_up" => Some(SquatExerciseName::BarbellStepUp),
19672            "bench_squat_with_rotational_chop" => {
19673                Some(SquatExerciseName::BenchSquatWithRotationalChop)
19674            }
19675            "weighted_bench_squat_with_rotational_chop" => {
19676                Some(SquatExerciseName::WeightedBenchSquatWithRotationalChop)
19677            }
19678            "body_weight_wall_squat" => Some(SquatExerciseName::BodyWeightWallSquat),
19679            "weighted_wall_squat" => Some(SquatExerciseName::WeightedWallSquat),
19680            "box_step_squat" => Some(SquatExerciseName::BoxStepSquat),
19681            "weighted_box_step_squat" => Some(SquatExerciseName::WeightedBoxStepSquat),
19682            "braced_squat" => Some(SquatExerciseName::BracedSquat),
19683            "crossed_arm_barbell_front_squat" => {
19684                Some(SquatExerciseName::CrossedArmBarbellFrontSquat)
19685            }
19686            "crossover_dumbbell_step_up" => Some(SquatExerciseName::CrossoverDumbbellStepUp),
19687            "dumbbell_front_squat" => Some(SquatExerciseName::DumbbellFrontSquat),
19688            "dumbbell_split_squat" => Some(SquatExerciseName::DumbbellSplitSquat),
19689            "dumbbell_squat" => Some(SquatExerciseName::DumbbellSquat),
19690            "dumbbell_squat_clean" => Some(SquatExerciseName::DumbbellSquatClean),
19691            "dumbbell_stepover" => Some(SquatExerciseName::DumbbellStepover),
19692            "dumbbell_step_up" => Some(SquatExerciseName::DumbbellStepUp),
19693            "elevated_single_leg_squat" => Some(SquatExerciseName::ElevatedSingleLegSquat),
19694            "weighted_elevated_single_leg_squat" => {
19695                Some(SquatExerciseName::WeightedElevatedSingleLegSquat)
19696            }
19697            "figure_four_squats" => Some(SquatExerciseName::FigureFourSquats),
19698            "weighted_figure_four_squats" => Some(SquatExerciseName::WeightedFigureFourSquats),
19699            "goblet_squat" => Some(SquatExerciseName::GobletSquat),
19700            "kettlebell_squat" => Some(SquatExerciseName::KettlebellSquat),
19701            "kettlebell_swing_overhead" => Some(SquatExerciseName::KettlebellSwingOverhead),
19702            "kettlebell_swing_with_flip_to_squat" => {
19703                Some(SquatExerciseName::KettlebellSwingWithFlipToSquat)
19704            }
19705            "lateral_dumbbell_step_up" => Some(SquatExerciseName::LateralDumbbellStepUp),
19706            "one_legged_squat" => Some(SquatExerciseName::OneLeggedSquat),
19707            "overhead_dumbbell_squat" => Some(SquatExerciseName::OverheadDumbbellSquat),
19708            "overhead_squat" => Some(SquatExerciseName::OverheadSquat),
19709            "partial_single_leg_squat" => Some(SquatExerciseName::PartialSingleLegSquat),
19710            "weighted_partial_single_leg_squat" => {
19711                Some(SquatExerciseName::WeightedPartialSingleLegSquat)
19712            }
19713            "pistol_squat" => Some(SquatExerciseName::PistolSquat),
19714            "weighted_pistol_squat" => Some(SquatExerciseName::WeightedPistolSquat),
19715            "plie_slides" => Some(SquatExerciseName::PlieSlides),
19716            "weighted_plie_slides" => Some(SquatExerciseName::WeightedPlieSlides),
19717            "plie_squat" => Some(SquatExerciseName::PlieSquat),
19718            "weighted_plie_squat" => Some(SquatExerciseName::WeightedPlieSquat),
19719            "prisoner_squat" => Some(SquatExerciseName::PrisonerSquat),
19720            "weighted_prisoner_squat" => Some(SquatExerciseName::WeightedPrisonerSquat),
19721            "single_leg_bench_get_up" => Some(SquatExerciseName::SingleLegBenchGetUp),
19722            "weighted_single_leg_bench_get_up" => {
19723                Some(SquatExerciseName::WeightedSingleLegBenchGetUp)
19724            }
19725            "single_leg_bench_squat" => Some(SquatExerciseName::SingleLegBenchSquat),
19726            "weighted_single_leg_bench_squat" => {
19727                Some(SquatExerciseName::WeightedSingleLegBenchSquat)
19728            }
19729            "single_leg_squat_on_swiss_ball" => Some(SquatExerciseName::SingleLegSquatOnSwissBall),
19730            "weighted_single_leg_squat_on_swiss_ball" => {
19731                Some(SquatExerciseName::WeightedSingleLegSquatOnSwissBall)
19732            }
19733            "squat" => Some(SquatExerciseName::Squat),
19734            "weighted_squat" => Some(SquatExerciseName::WeightedSquat),
19735            "squats_with_band" => Some(SquatExerciseName::SquatsWithBand),
19736            "staggered_squat" => Some(SquatExerciseName::StaggeredSquat),
19737            "weighted_staggered_squat" => Some(SquatExerciseName::WeightedStaggeredSquat),
19738            "step_up" => Some(SquatExerciseName::StepUp),
19739            "weighted_step_up" => Some(SquatExerciseName::WeightedStepUp),
19740            "suitcase_squats" => Some(SquatExerciseName::SuitcaseSquats),
19741            "sumo_squat" => Some(SquatExerciseName::SumoSquat),
19742            "sumo_squat_slide_in" => Some(SquatExerciseName::SumoSquatSlideIn),
19743            "weighted_sumo_squat_slide_in" => Some(SquatExerciseName::WeightedSumoSquatSlideIn),
19744            "sumo_squat_to_high_pull" => Some(SquatExerciseName::SumoSquatToHighPull),
19745            "sumo_squat_to_stand" => Some(SquatExerciseName::SumoSquatToStand),
19746            "weighted_sumo_squat_to_stand" => Some(SquatExerciseName::WeightedSumoSquatToStand),
19747            "sumo_squat_with_rotation" => Some(SquatExerciseName::SumoSquatWithRotation),
19748            "weighted_sumo_squat_with_rotation" => {
19749                Some(SquatExerciseName::WeightedSumoSquatWithRotation)
19750            }
19751            "swiss_ball_body_weight_wall_squat" => {
19752                Some(SquatExerciseName::SwissBallBodyWeightWallSquat)
19753            }
19754            "weighted_swiss_ball_wall_squat" => Some(SquatExerciseName::WeightedSwissBallWallSquat),
19755            "thrusters" => Some(SquatExerciseName::Thrusters),
19756            "uneven_squat" => Some(SquatExerciseName::UnevenSquat),
19757            "weighted_uneven_squat" => Some(SquatExerciseName::WeightedUnevenSquat),
19758            "waist_slimming_squat" => Some(SquatExerciseName::WaistSlimmingSquat),
19759            "wall_ball" => Some(SquatExerciseName::WallBall),
19760            "wide_stance_barbell_squat" => Some(SquatExerciseName::WideStanceBarbellSquat),
19761            "wide_stance_goblet_squat" => Some(SquatExerciseName::WideStanceGobletSquat),
19762            "zercher_squat" => Some(SquatExerciseName::ZercherSquat),
19763            "kbs_overhead" => Some(SquatExerciseName::KbsOverhead),
19764            "squat_and_side_kick" => Some(SquatExerciseName::SquatAndSideKick),
19765            "squat_jumps_in_n_out" => Some(SquatExerciseName::SquatJumpsInNOut),
19766            "pilates_plie_squats_parallel_turned_out_flat_and_heels" => {
19767                Some(SquatExerciseName::PilatesPlieSquatsParallelTurnedOutFlatAndHeels)
19768            }
19769            "releve_straight_leg_and_knee_bent_with_one_leg_variation" => {
19770                Some(SquatExerciseName::ReleveStraightLegAndKneeBentWithOneLegVariation)
19771            }
19772            "alternating_box_dumbbell_step_ups" => {
19773                Some(SquatExerciseName::AlternatingBoxDumbbellStepUps)
19774            }
19775            "dumbbell_overhead_squat_single_arm" => {
19776                Some(SquatExerciseName::DumbbellOverheadSquatSingleArm)
19777            }
19778            "dumbbell_squat_snatch" => Some(SquatExerciseName::DumbbellSquatSnatch),
19779            "medicine_ball_squat" => Some(SquatExerciseName::MedicineBallSquat),
19780            "wall_ball_squat_and_press" => Some(SquatExerciseName::WallBallSquatAndPress),
19781            "squat_american_swing" => Some(SquatExerciseName::SquatAmericanSwing),
19782            "air_squat" => Some(SquatExerciseName::AirSquat),
19783            "dumbbell_thrusters" => Some(SquatExerciseName::DumbbellThrusters),
19784            "overhead_barbell_squat" => Some(SquatExerciseName::OverheadBarbellSquat),
19785            _ => None,
19786        }
19787    }
19788}
19789
19790#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
19791#[repr(u16)]
19792#[non_exhaustive]
19793pub enum TotalBodyExerciseName {
19794    Burpee = 0,
19795    WeightedBurpee = 1,
19796    BurpeeBoxJump = 2,
19797    WeightedBurpeeBoxJump = 3,
19798    HighPullBurpee = 4,
19799    ManMakers = 5,
19800    OneArmBurpee = 6,
19801    SquatThrusts = 7,
19802    WeightedSquatThrusts = 8,
19803    SquatPlankPushUp = 9,
19804    WeightedSquatPlankPushUp = 10,
19805    StandingTRotationBalance = 11,
19806    WeightedStandingTRotationBalance = 12,
19807    BarbellBurpee = 13,
19808    BurpeeBoxJumpOverYesLiterallyJumpingOverTheBox = 15,
19809    BurpeeBoxJumpStepUpOver = 16,
19810    LateralBarbellBurpee = 17,
19811    TotalBodyBurpeeOverBar = 18,
19812    BurpeeBoxJumpOver = 19,
19813    BurpeeWheelchair = 20,
19814}
19815
19816impl TotalBodyExerciseName {
19817    /// Snake-case canonical name from Profile.xlsx.
19818    pub fn as_str(&self) -> &'static str {
19819        match self {
19820            TotalBodyExerciseName::Burpee => "burpee",
19821            TotalBodyExerciseName::WeightedBurpee => "weighted_burpee",
19822            TotalBodyExerciseName::BurpeeBoxJump => "burpee_box_jump",
19823            TotalBodyExerciseName::WeightedBurpeeBoxJump => "weighted_burpee_box_jump",
19824            TotalBodyExerciseName::HighPullBurpee => "high_pull_burpee",
19825            TotalBodyExerciseName::ManMakers => "man_makers",
19826            TotalBodyExerciseName::OneArmBurpee => "one_arm_burpee",
19827            TotalBodyExerciseName::SquatThrusts => "squat_thrusts",
19828            TotalBodyExerciseName::WeightedSquatThrusts => "weighted_squat_thrusts",
19829            TotalBodyExerciseName::SquatPlankPushUp => "squat_plank_push_up",
19830            TotalBodyExerciseName::WeightedSquatPlankPushUp => "weighted_squat_plank_push_up",
19831            TotalBodyExerciseName::StandingTRotationBalance => "standing_t_rotation_balance",
19832            TotalBodyExerciseName::WeightedStandingTRotationBalance => {
19833                "weighted_standing_t_rotation_balance"
19834            }
19835            TotalBodyExerciseName::BarbellBurpee => "barbell_burpee",
19836            TotalBodyExerciseName::BurpeeBoxJumpOverYesLiterallyJumpingOverTheBox => {
19837                "burpee_box_jump_over_yes_literally_jumping_over_the_box"
19838            }
19839            TotalBodyExerciseName::BurpeeBoxJumpStepUpOver => "burpee_box_jump_step_up_over",
19840            TotalBodyExerciseName::LateralBarbellBurpee => "lateral_barbell_burpee",
19841            TotalBodyExerciseName::TotalBodyBurpeeOverBar => "total_body_burpee_over_bar",
19842            TotalBodyExerciseName::BurpeeBoxJumpOver => "burpee_box_jump_over",
19843            TotalBodyExerciseName::BurpeeWheelchair => "burpee_wheelchair",
19844        }
19845    }
19846
19847    /// Try to construct from the underlying numeric value.
19848    pub fn from_value(value: u16) -> Option<Self> {
19849        match value {
19850            0 => Some(TotalBodyExerciseName::Burpee),
19851            1 => Some(TotalBodyExerciseName::WeightedBurpee),
19852            2 => Some(TotalBodyExerciseName::BurpeeBoxJump),
19853            3 => Some(TotalBodyExerciseName::WeightedBurpeeBoxJump),
19854            4 => Some(TotalBodyExerciseName::HighPullBurpee),
19855            5 => Some(TotalBodyExerciseName::ManMakers),
19856            6 => Some(TotalBodyExerciseName::OneArmBurpee),
19857            7 => Some(TotalBodyExerciseName::SquatThrusts),
19858            8 => Some(TotalBodyExerciseName::WeightedSquatThrusts),
19859            9 => Some(TotalBodyExerciseName::SquatPlankPushUp),
19860            10 => Some(TotalBodyExerciseName::WeightedSquatPlankPushUp),
19861            11 => Some(TotalBodyExerciseName::StandingTRotationBalance),
19862            12 => Some(TotalBodyExerciseName::WeightedStandingTRotationBalance),
19863            13 => Some(TotalBodyExerciseName::BarbellBurpee),
19864            15 => Some(TotalBodyExerciseName::BurpeeBoxJumpOverYesLiterallyJumpingOverTheBox),
19865            16 => Some(TotalBodyExerciseName::BurpeeBoxJumpStepUpOver),
19866            17 => Some(TotalBodyExerciseName::LateralBarbellBurpee),
19867            18 => Some(TotalBodyExerciseName::TotalBodyBurpeeOverBar),
19868            19 => Some(TotalBodyExerciseName::BurpeeBoxJumpOver),
19869            20 => Some(TotalBodyExerciseName::BurpeeWheelchair),
19870            _ => None,
19871        }
19872    }
19873
19874    /// Try to construct from the snake-case canonical name.
19875    pub fn from_str(name: &str) -> Option<Self> {
19876        match name {
19877            "burpee" => Some(TotalBodyExerciseName::Burpee),
19878            "weighted_burpee" => Some(TotalBodyExerciseName::WeightedBurpee),
19879            "burpee_box_jump" => Some(TotalBodyExerciseName::BurpeeBoxJump),
19880            "weighted_burpee_box_jump" => Some(TotalBodyExerciseName::WeightedBurpeeBoxJump),
19881            "high_pull_burpee" => Some(TotalBodyExerciseName::HighPullBurpee),
19882            "man_makers" => Some(TotalBodyExerciseName::ManMakers),
19883            "one_arm_burpee" => Some(TotalBodyExerciseName::OneArmBurpee),
19884            "squat_thrusts" => Some(TotalBodyExerciseName::SquatThrusts),
19885            "weighted_squat_thrusts" => Some(TotalBodyExerciseName::WeightedSquatThrusts),
19886            "squat_plank_push_up" => Some(TotalBodyExerciseName::SquatPlankPushUp),
19887            "weighted_squat_plank_push_up" => Some(TotalBodyExerciseName::WeightedSquatPlankPushUp),
19888            "standing_t_rotation_balance" => Some(TotalBodyExerciseName::StandingTRotationBalance),
19889            "weighted_standing_t_rotation_balance" => {
19890                Some(TotalBodyExerciseName::WeightedStandingTRotationBalance)
19891            }
19892            "barbell_burpee" => Some(TotalBodyExerciseName::BarbellBurpee),
19893            "burpee_box_jump_over_yes_literally_jumping_over_the_box" => {
19894                Some(TotalBodyExerciseName::BurpeeBoxJumpOverYesLiterallyJumpingOverTheBox)
19895            }
19896            "burpee_box_jump_step_up_over" => Some(TotalBodyExerciseName::BurpeeBoxJumpStepUpOver),
19897            "lateral_barbell_burpee" => Some(TotalBodyExerciseName::LateralBarbellBurpee),
19898            "total_body_burpee_over_bar" => Some(TotalBodyExerciseName::TotalBodyBurpeeOverBar),
19899            "burpee_box_jump_over" => Some(TotalBodyExerciseName::BurpeeBoxJumpOver),
19900            "burpee_wheelchair" => Some(TotalBodyExerciseName::BurpeeWheelchair),
19901            _ => None,
19902        }
19903    }
19904}
19905
19906#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
19907#[repr(u16)]
19908#[non_exhaustive]
19909pub enum MoveExerciseName {
19910    ArchAndCurl = 0,
19911    ArmCirclesWithBallBandAndWeight = 1,
19912    ArmStretch = 2,
19913    BackMassage = 3,
19914    BellyBreathing = 4,
19915    BridgeWithBall = 5,
19916    DiamondLegCrunch = 6,
19917    DiamondLegLift = 7,
19918    EightPointShoulderOpener = 8,
19919    FootRolling = 9,
19920    Footwork = 10,
19921    FootworkOnDisc = 11,
19922    ForwardFold = 12,
19923    FrogWithBand = 13,
19924    HalfRollUp = 14,
19925    HamstringCurl = 15,
19926    HamstringStretch = 16,
19927    HipStretch = 17,
19928    HugATreeWithBallBandAndWeight = 18,
19929    KneeCircles = 19,
19930    KneeFoldsOnDisc = 20,
19931    LateralFlexion = 21,
19932    LegStretchWithBand = 22,
19933    LegStretchWithLegCircles = 23,
19934    LowerLiftOnDisc = 24,
19935    LungeSquat = 25,
19936    LungesWithKneeLift = 26,
19937    MermaidStretch = 27,
19938    NeutralPelvicPosition = 28,
19939    PelvicClocksOnDisc = 29,
19940    PilatesPlieSquatsParallelTurnedOutFlatAndHeelsWithChair = 30,
19941    PiriformisStretch = 31,
19942    PlankKneeCrosses = 32,
19943    PlankKneePulls = 33,
19944    PlankUpDowns = 34,
19945    PrayerMudra = 35,
19946    PsoasLungeStretch = 36,
19947    RibcageBreathing = 37,
19948    RollDown = 38,
19949    RollUpWithWeightAndBand = 39,
19950    Saw = 40,
19951    ScapularStabilization = 41,
19952    ScissorsOnDisc = 42,
19953    SeatedHipStretchup = 43,
19954    SeatedTwist = 44,
19955    ShavingTheHeadWithBallBandAndWeight = 45,
19956    SpinalTwist = 46,
19957    SpinalTwistStretch = 47,
19958    SpineStretchForward = 48,
19959    SquatOpenArmTwistPose = 49,
19960    SquatsWithBall = 50,
19961    StandAndHang = 51,
19962    StandingSideStretch = 52,
19963    StandingSingleLegForwardBendWithItBandOpener = 53,
19964    StraightLegCrunchWithLegLift = 54,
19965    StraightLegCrunchWithLegLiftWithBall = 55,
19966    StraightLegCrunchWithLegsCrossed = 56,
19967    StraightLegCrunchWithLegsCrossedWithBall = 57,
19968    StraightLegDiagonalCrunch = 58,
19969    StraightLegDiagonalCrunchWithBall = 59,
19970    TailboneCurl = 60,
19971    ThroatLock = 61,
19972    TickTockSideRoll = 62,
19973    Twist = 63,
19974    VLegCrunches = 64,
19975    VSit = 65,
19976    ForwardFoldWheelchair = 66,
19977    ForwardFoldPlusWheelchair = 67,
19978    ArmCirclesLowForwardWheelchair = 68,
19979    ArmCirclesMidForwardWheelchair = 69,
19980    ArmCirclesHighForwardWheelchair = 70,
19981    ArmCirclesLowBackwardWheelchair = 71,
19982    ArmCirclesMidBackwardWheelchair = 72,
19983    ArmCirclesHighBackwardWheelchair = 73,
19984    CoreTwistsWheelchair = 74,
19985    ArmRaiseWheelchair = 75,
19986    ChestExpandWheelchair = 76,
19987    ArmExtendWheelchair = 77,
19988    ForwardBendWheelchair = 78,
19989    ToeTouchWheelchair = 79,
19990    ExtendedToeTouchWheelchair = 80,
19991    SeatedArmCircles = 81,
19992    TrunkRotations = 82,
19993    SeatedTrunkRotations = 83,
19994    ToeTouch = 84,
19995}
19996
19997impl MoveExerciseName {
19998    /// Snake-case canonical name from Profile.xlsx.
19999    pub fn as_str(&self) -> &'static str {
20000        match self {
20001            MoveExerciseName::ArchAndCurl => "arch_and_curl",
20002            MoveExerciseName::ArmCirclesWithBallBandAndWeight => {
20003                "arm_circles_with_ball_band_and_weight"
20004            }
20005            MoveExerciseName::ArmStretch => "arm_stretch",
20006            MoveExerciseName::BackMassage => "back_massage",
20007            MoveExerciseName::BellyBreathing => "belly_breathing",
20008            MoveExerciseName::BridgeWithBall => "bridge_with_ball",
20009            MoveExerciseName::DiamondLegCrunch => "diamond_leg_crunch",
20010            MoveExerciseName::DiamondLegLift => "diamond_leg_lift",
20011            MoveExerciseName::EightPointShoulderOpener => "eight_point_shoulder_opener",
20012            MoveExerciseName::FootRolling => "foot_rolling",
20013            MoveExerciseName::Footwork => "footwork",
20014            MoveExerciseName::FootworkOnDisc => "footwork_on_disc",
20015            MoveExerciseName::ForwardFold => "forward_fold",
20016            MoveExerciseName::FrogWithBand => "frog_with_band",
20017            MoveExerciseName::HalfRollUp => "half_roll_up",
20018            MoveExerciseName::HamstringCurl => "hamstring_curl",
20019            MoveExerciseName::HamstringStretch => "hamstring_stretch",
20020            MoveExerciseName::HipStretch => "hip_stretch",
20021            MoveExerciseName::HugATreeWithBallBandAndWeight => {
20022                "hug_a_tree_with_ball_band_and_weight"
20023            }
20024            MoveExerciseName::KneeCircles => "knee_circles",
20025            MoveExerciseName::KneeFoldsOnDisc => "knee_folds_on_disc",
20026            MoveExerciseName::LateralFlexion => "lateral_flexion",
20027            MoveExerciseName::LegStretchWithBand => "leg_stretch_with_band",
20028            MoveExerciseName::LegStretchWithLegCircles => "leg_stretch_with_leg_circles",
20029            MoveExerciseName::LowerLiftOnDisc => "lower_lift_on_disc",
20030            MoveExerciseName::LungeSquat => "lunge_squat",
20031            MoveExerciseName::LungesWithKneeLift => "lunges_with_knee_lift",
20032            MoveExerciseName::MermaidStretch => "mermaid_stretch",
20033            MoveExerciseName::NeutralPelvicPosition => "neutral_pelvic_position",
20034            MoveExerciseName::PelvicClocksOnDisc => "pelvic_clocks_on_disc",
20035            MoveExerciseName::PilatesPlieSquatsParallelTurnedOutFlatAndHeelsWithChair => {
20036                "pilates_plie_squats_parallel_turned_out_flat_and_heels_with_chair"
20037            }
20038            MoveExerciseName::PiriformisStretch => "piriformis_stretch",
20039            MoveExerciseName::PlankKneeCrosses => "plank_knee_crosses",
20040            MoveExerciseName::PlankKneePulls => "plank_knee_pulls",
20041            MoveExerciseName::PlankUpDowns => "plank_up_downs",
20042            MoveExerciseName::PrayerMudra => "prayer_mudra",
20043            MoveExerciseName::PsoasLungeStretch => "psoas_lunge_stretch",
20044            MoveExerciseName::RibcageBreathing => "ribcage_breathing",
20045            MoveExerciseName::RollDown => "roll_down",
20046            MoveExerciseName::RollUpWithWeightAndBand => "roll_up_with_weight_and_band",
20047            MoveExerciseName::Saw => "saw",
20048            MoveExerciseName::ScapularStabilization => "scapular_stabilization",
20049            MoveExerciseName::ScissorsOnDisc => "scissors_on_disc",
20050            MoveExerciseName::SeatedHipStretchup => "seated_hip_stretchup",
20051            MoveExerciseName::SeatedTwist => "seated_twist",
20052            MoveExerciseName::ShavingTheHeadWithBallBandAndWeight => {
20053                "shaving_the_head_with_ball_band_and_weight"
20054            }
20055            MoveExerciseName::SpinalTwist => "spinal_twist",
20056            MoveExerciseName::SpinalTwistStretch => "spinal_twist_stretch",
20057            MoveExerciseName::SpineStretchForward => "spine_stretch_forward",
20058            MoveExerciseName::SquatOpenArmTwistPose => "squat_open_arm_twist_pose",
20059            MoveExerciseName::SquatsWithBall => "squats_with_ball",
20060            MoveExerciseName::StandAndHang => "stand_and_hang",
20061            MoveExerciseName::StandingSideStretch => "standing_side_stretch",
20062            MoveExerciseName::StandingSingleLegForwardBendWithItBandOpener => {
20063                "standing_single_leg_forward_bend_with_it_band_opener"
20064            }
20065            MoveExerciseName::StraightLegCrunchWithLegLift => "straight_leg_crunch_with_leg_lift",
20066            MoveExerciseName::StraightLegCrunchWithLegLiftWithBall => {
20067                "straight_leg_crunch_with_leg_lift_with_ball"
20068            }
20069            MoveExerciseName::StraightLegCrunchWithLegsCrossed => {
20070                "straight_leg_crunch_with_legs_crossed"
20071            }
20072            MoveExerciseName::StraightLegCrunchWithLegsCrossedWithBall => {
20073                "straight_leg_crunch_with_legs_crossed_with_ball"
20074            }
20075            MoveExerciseName::StraightLegDiagonalCrunch => "straight_leg_diagonal_crunch",
20076            MoveExerciseName::StraightLegDiagonalCrunchWithBall => {
20077                "straight_leg_diagonal_crunch_with_ball"
20078            }
20079            MoveExerciseName::TailboneCurl => "tailbone_curl",
20080            MoveExerciseName::ThroatLock => "throat_lock",
20081            MoveExerciseName::TickTockSideRoll => "tick_tock_side_roll",
20082            MoveExerciseName::Twist => "twist",
20083            MoveExerciseName::VLegCrunches => "v_leg_crunches",
20084            MoveExerciseName::VSit => "v_sit",
20085            MoveExerciseName::ForwardFoldWheelchair => "forward_fold_wheelchair",
20086            MoveExerciseName::ForwardFoldPlusWheelchair => "forward_fold_plus_wheelchair",
20087            MoveExerciseName::ArmCirclesLowForwardWheelchair => {
20088                "arm_circles_low_forward_wheelchair"
20089            }
20090            MoveExerciseName::ArmCirclesMidForwardWheelchair => {
20091                "arm_circles_mid_forward_wheelchair"
20092            }
20093            MoveExerciseName::ArmCirclesHighForwardWheelchair => {
20094                "arm_circles_high_forward_wheelchair"
20095            }
20096            MoveExerciseName::ArmCirclesLowBackwardWheelchair => {
20097                "arm_circles_low_backward_wheelchair"
20098            }
20099            MoveExerciseName::ArmCirclesMidBackwardWheelchair => {
20100                "arm_circles_mid_backward_wheelchair"
20101            }
20102            MoveExerciseName::ArmCirclesHighBackwardWheelchair => {
20103                "arm_circles_high_backward_wheelchair"
20104            }
20105            MoveExerciseName::CoreTwistsWheelchair => "core_twists_wheelchair",
20106            MoveExerciseName::ArmRaiseWheelchair => "arm_raise_wheelchair",
20107            MoveExerciseName::ChestExpandWheelchair => "chest_expand_wheelchair",
20108            MoveExerciseName::ArmExtendWheelchair => "arm_extend_wheelchair",
20109            MoveExerciseName::ForwardBendWheelchair => "forward_bend_wheelchair",
20110            MoveExerciseName::ToeTouchWheelchair => "toe_touch_wheelchair",
20111            MoveExerciseName::ExtendedToeTouchWheelchair => "extended_toe_touch_wheelchair",
20112            MoveExerciseName::SeatedArmCircles => "seated_arm_circles",
20113            MoveExerciseName::TrunkRotations => "trunk_rotations",
20114            MoveExerciseName::SeatedTrunkRotations => "seated_trunk_rotations",
20115            MoveExerciseName::ToeTouch => "toe_touch",
20116        }
20117    }
20118
20119    /// Try to construct from the underlying numeric value.
20120    pub fn from_value(value: u16) -> Option<Self> {
20121        match value {
20122            0 => Some(MoveExerciseName::ArchAndCurl),
20123            1 => Some(MoveExerciseName::ArmCirclesWithBallBandAndWeight),
20124            2 => Some(MoveExerciseName::ArmStretch),
20125            3 => Some(MoveExerciseName::BackMassage),
20126            4 => Some(MoveExerciseName::BellyBreathing),
20127            5 => Some(MoveExerciseName::BridgeWithBall),
20128            6 => Some(MoveExerciseName::DiamondLegCrunch),
20129            7 => Some(MoveExerciseName::DiamondLegLift),
20130            8 => Some(MoveExerciseName::EightPointShoulderOpener),
20131            9 => Some(MoveExerciseName::FootRolling),
20132            10 => Some(MoveExerciseName::Footwork),
20133            11 => Some(MoveExerciseName::FootworkOnDisc),
20134            12 => Some(MoveExerciseName::ForwardFold),
20135            13 => Some(MoveExerciseName::FrogWithBand),
20136            14 => Some(MoveExerciseName::HalfRollUp),
20137            15 => Some(MoveExerciseName::HamstringCurl),
20138            16 => Some(MoveExerciseName::HamstringStretch),
20139            17 => Some(MoveExerciseName::HipStretch),
20140            18 => Some(MoveExerciseName::HugATreeWithBallBandAndWeight),
20141            19 => Some(MoveExerciseName::KneeCircles),
20142            20 => Some(MoveExerciseName::KneeFoldsOnDisc),
20143            21 => Some(MoveExerciseName::LateralFlexion),
20144            22 => Some(MoveExerciseName::LegStretchWithBand),
20145            23 => Some(MoveExerciseName::LegStretchWithLegCircles),
20146            24 => Some(MoveExerciseName::LowerLiftOnDisc),
20147            25 => Some(MoveExerciseName::LungeSquat),
20148            26 => Some(MoveExerciseName::LungesWithKneeLift),
20149            27 => Some(MoveExerciseName::MermaidStretch),
20150            28 => Some(MoveExerciseName::NeutralPelvicPosition),
20151            29 => Some(MoveExerciseName::PelvicClocksOnDisc),
20152            30 => Some(MoveExerciseName::PilatesPlieSquatsParallelTurnedOutFlatAndHeelsWithChair),
20153            31 => Some(MoveExerciseName::PiriformisStretch),
20154            32 => Some(MoveExerciseName::PlankKneeCrosses),
20155            33 => Some(MoveExerciseName::PlankKneePulls),
20156            34 => Some(MoveExerciseName::PlankUpDowns),
20157            35 => Some(MoveExerciseName::PrayerMudra),
20158            36 => Some(MoveExerciseName::PsoasLungeStretch),
20159            37 => Some(MoveExerciseName::RibcageBreathing),
20160            38 => Some(MoveExerciseName::RollDown),
20161            39 => Some(MoveExerciseName::RollUpWithWeightAndBand),
20162            40 => Some(MoveExerciseName::Saw),
20163            41 => Some(MoveExerciseName::ScapularStabilization),
20164            42 => Some(MoveExerciseName::ScissorsOnDisc),
20165            43 => Some(MoveExerciseName::SeatedHipStretchup),
20166            44 => Some(MoveExerciseName::SeatedTwist),
20167            45 => Some(MoveExerciseName::ShavingTheHeadWithBallBandAndWeight),
20168            46 => Some(MoveExerciseName::SpinalTwist),
20169            47 => Some(MoveExerciseName::SpinalTwistStretch),
20170            48 => Some(MoveExerciseName::SpineStretchForward),
20171            49 => Some(MoveExerciseName::SquatOpenArmTwistPose),
20172            50 => Some(MoveExerciseName::SquatsWithBall),
20173            51 => Some(MoveExerciseName::StandAndHang),
20174            52 => Some(MoveExerciseName::StandingSideStretch),
20175            53 => Some(MoveExerciseName::StandingSingleLegForwardBendWithItBandOpener),
20176            54 => Some(MoveExerciseName::StraightLegCrunchWithLegLift),
20177            55 => Some(MoveExerciseName::StraightLegCrunchWithLegLiftWithBall),
20178            56 => Some(MoveExerciseName::StraightLegCrunchWithLegsCrossed),
20179            57 => Some(MoveExerciseName::StraightLegCrunchWithLegsCrossedWithBall),
20180            58 => Some(MoveExerciseName::StraightLegDiagonalCrunch),
20181            59 => Some(MoveExerciseName::StraightLegDiagonalCrunchWithBall),
20182            60 => Some(MoveExerciseName::TailboneCurl),
20183            61 => Some(MoveExerciseName::ThroatLock),
20184            62 => Some(MoveExerciseName::TickTockSideRoll),
20185            63 => Some(MoveExerciseName::Twist),
20186            64 => Some(MoveExerciseName::VLegCrunches),
20187            65 => Some(MoveExerciseName::VSit),
20188            66 => Some(MoveExerciseName::ForwardFoldWheelchair),
20189            67 => Some(MoveExerciseName::ForwardFoldPlusWheelchair),
20190            68 => Some(MoveExerciseName::ArmCirclesLowForwardWheelchair),
20191            69 => Some(MoveExerciseName::ArmCirclesMidForwardWheelchair),
20192            70 => Some(MoveExerciseName::ArmCirclesHighForwardWheelchair),
20193            71 => Some(MoveExerciseName::ArmCirclesLowBackwardWheelchair),
20194            72 => Some(MoveExerciseName::ArmCirclesMidBackwardWheelchair),
20195            73 => Some(MoveExerciseName::ArmCirclesHighBackwardWheelchair),
20196            74 => Some(MoveExerciseName::CoreTwistsWheelchair),
20197            75 => Some(MoveExerciseName::ArmRaiseWheelchair),
20198            76 => Some(MoveExerciseName::ChestExpandWheelchair),
20199            77 => Some(MoveExerciseName::ArmExtendWheelchair),
20200            78 => Some(MoveExerciseName::ForwardBendWheelchair),
20201            79 => Some(MoveExerciseName::ToeTouchWheelchair),
20202            80 => Some(MoveExerciseName::ExtendedToeTouchWheelchair),
20203            81 => Some(MoveExerciseName::SeatedArmCircles),
20204            82 => Some(MoveExerciseName::TrunkRotations),
20205            83 => Some(MoveExerciseName::SeatedTrunkRotations),
20206            84 => Some(MoveExerciseName::ToeTouch),
20207            _ => None,
20208        }
20209    }
20210
20211    /// Try to construct from the snake-case canonical name.
20212    pub fn from_str(name: &str) -> Option<Self> {
20213        match name {
20214            "arch_and_curl" => Some(MoveExerciseName::ArchAndCurl),
20215            "arm_circles_with_ball_band_and_weight" => {
20216                Some(MoveExerciseName::ArmCirclesWithBallBandAndWeight)
20217            }
20218            "arm_stretch" => Some(MoveExerciseName::ArmStretch),
20219            "back_massage" => Some(MoveExerciseName::BackMassage),
20220            "belly_breathing" => Some(MoveExerciseName::BellyBreathing),
20221            "bridge_with_ball" => Some(MoveExerciseName::BridgeWithBall),
20222            "diamond_leg_crunch" => Some(MoveExerciseName::DiamondLegCrunch),
20223            "diamond_leg_lift" => Some(MoveExerciseName::DiamondLegLift),
20224            "eight_point_shoulder_opener" => Some(MoveExerciseName::EightPointShoulderOpener),
20225            "foot_rolling" => Some(MoveExerciseName::FootRolling),
20226            "footwork" => Some(MoveExerciseName::Footwork),
20227            "footwork_on_disc" => Some(MoveExerciseName::FootworkOnDisc),
20228            "forward_fold" => Some(MoveExerciseName::ForwardFold),
20229            "frog_with_band" => Some(MoveExerciseName::FrogWithBand),
20230            "half_roll_up" => Some(MoveExerciseName::HalfRollUp),
20231            "hamstring_curl" => Some(MoveExerciseName::HamstringCurl),
20232            "hamstring_stretch" => Some(MoveExerciseName::HamstringStretch),
20233            "hip_stretch" => Some(MoveExerciseName::HipStretch),
20234            "hug_a_tree_with_ball_band_and_weight" => {
20235                Some(MoveExerciseName::HugATreeWithBallBandAndWeight)
20236            }
20237            "knee_circles" => Some(MoveExerciseName::KneeCircles),
20238            "knee_folds_on_disc" => Some(MoveExerciseName::KneeFoldsOnDisc),
20239            "lateral_flexion" => Some(MoveExerciseName::LateralFlexion),
20240            "leg_stretch_with_band" => Some(MoveExerciseName::LegStretchWithBand),
20241            "leg_stretch_with_leg_circles" => Some(MoveExerciseName::LegStretchWithLegCircles),
20242            "lower_lift_on_disc" => Some(MoveExerciseName::LowerLiftOnDisc),
20243            "lunge_squat" => Some(MoveExerciseName::LungeSquat),
20244            "lunges_with_knee_lift" => Some(MoveExerciseName::LungesWithKneeLift),
20245            "mermaid_stretch" => Some(MoveExerciseName::MermaidStretch),
20246            "neutral_pelvic_position" => Some(MoveExerciseName::NeutralPelvicPosition),
20247            "pelvic_clocks_on_disc" => Some(MoveExerciseName::PelvicClocksOnDisc),
20248            "pilates_plie_squats_parallel_turned_out_flat_and_heels_with_chair" => {
20249                Some(MoveExerciseName::PilatesPlieSquatsParallelTurnedOutFlatAndHeelsWithChair)
20250            }
20251            "piriformis_stretch" => Some(MoveExerciseName::PiriformisStretch),
20252            "plank_knee_crosses" => Some(MoveExerciseName::PlankKneeCrosses),
20253            "plank_knee_pulls" => Some(MoveExerciseName::PlankKneePulls),
20254            "plank_up_downs" => Some(MoveExerciseName::PlankUpDowns),
20255            "prayer_mudra" => Some(MoveExerciseName::PrayerMudra),
20256            "psoas_lunge_stretch" => Some(MoveExerciseName::PsoasLungeStretch),
20257            "ribcage_breathing" => Some(MoveExerciseName::RibcageBreathing),
20258            "roll_down" => Some(MoveExerciseName::RollDown),
20259            "roll_up_with_weight_and_band" => Some(MoveExerciseName::RollUpWithWeightAndBand),
20260            "saw" => Some(MoveExerciseName::Saw),
20261            "scapular_stabilization" => Some(MoveExerciseName::ScapularStabilization),
20262            "scissors_on_disc" => Some(MoveExerciseName::ScissorsOnDisc),
20263            "seated_hip_stretchup" => Some(MoveExerciseName::SeatedHipStretchup),
20264            "seated_twist" => Some(MoveExerciseName::SeatedTwist),
20265            "shaving_the_head_with_ball_band_and_weight" => {
20266                Some(MoveExerciseName::ShavingTheHeadWithBallBandAndWeight)
20267            }
20268            "spinal_twist" => Some(MoveExerciseName::SpinalTwist),
20269            "spinal_twist_stretch" => Some(MoveExerciseName::SpinalTwistStretch),
20270            "spine_stretch_forward" => Some(MoveExerciseName::SpineStretchForward),
20271            "squat_open_arm_twist_pose" => Some(MoveExerciseName::SquatOpenArmTwistPose),
20272            "squats_with_ball" => Some(MoveExerciseName::SquatsWithBall),
20273            "stand_and_hang" => Some(MoveExerciseName::StandAndHang),
20274            "standing_side_stretch" => Some(MoveExerciseName::StandingSideStretch),
20275            "standing_single_leg_forward_bend_with_it_band_opener" => {
20276                Some(MoveExerciseName::StandingSingleLegForwardBendWithItBandOpener)
20277            }
20278            "straight_leg_crunch_with_leg_lift" => {
20279                Some(MoveExerciseName::StraightLegCrunchWithLegLift)
20280            }
20281            "straight_leg_crunch_with_leg_lift_with_ball" => {
20282                Some(MoveExerciseName::StraightLegCrunchWithLegLiftWithBall)
20283            }
20284            "straight_leg_crunch_with_legs_crossed" => {
20285                Some(MoveExerciseName::StraightLegCrunchWithLegsCrossed)
20286            }
20287            "straight_leg_crunch_with_legs_crossed_with_ball" => {
20288                Some(MoveExerciseName::StraightLegCrunchWithLegsCrossedWithBall)
20289            }
20290            "straight_leg_diagonal_crunch" => Some(MoveExerciseName::StraightLegDiagonalCrunch),
20291            "straight_leg_diagonal_crunch_with_ball" => {
20292                Some(MoveExerciseName::StraightLegDiagonalCrunchWithBall)
20293            }
20294            "tailbone_curl" => Some(MoveExerciseName::TailboneCurl),
20295            "throat_lock" => Some(MoveExerciseName::ThroatLock),
20296            "tick_tock_side_roll" => Some(MoveExerciseName::TickTockSideRoll),
20297            "twist" => Some(MoveExerciseName::Twist),
20298            "v_leg_crunches" => Some(MoveExerciseName::VLegCrunches),
20299            "v_sit" => Some(MoveExerciseName::VSit),
20300            "forward_fold_wheelchair" => Some(MoveExerciseName::ForwardFoldWheelchair),
20301            "forward_fold_plus_wheelchair" => Some(MoveExerciseName::ForwardFoldPlusWheelchair),
20302            "arm_circles_low_forward_wheelchair" => {
20303                Some(MoveExerciseName::ArmCirclesLowForwardWheelchair)
20304            }
20305            "arm_circles_mid_forward_wheelchair" => {
20306                Some(MoveExerciseName::ArmCirclesMidForwardWheelchair)
20307            }
20308            "arm_circles_high_forward_wheelchair" => {
20309                Some(MoveExerciseName::ArmCirclesHighForwardWheelchair)
20310            }
20311            "arm_circles_low_backward_wheelchair" => {
20312                Some(MoveExerciseName::ArmCirclesLowBackwardWheelchair)
20313            }
20314            "arm_circles_mid_backward_wheelchair" => {
20315                Some(MoveExerciseName::ArmCirclesMidBackwardWheelchair)
20316            }
20317            "arm_circles_high_backward_wheelchair" => {
20318                Some(MoveExerciseName::ArmCirclesHighBackwardWheelchair)
20319            }
20320            "core_twists_wheelchair" => Some(MoveExerciseName::CoreTwistsWheelchair),
20321            "arm_raise_wheelchair" => Some(MoveExerciseName::ArmRaiseWheelchair),
20322            "chest_expand_wheelchair" => Some(MoveExerciseName::ChestExpandWheelchair),
20323            "arm_extend_wheelchair" => Some(MoveExerciseName::ArmExtendWheelchair),
20324            "forward_bend_wheelchair" => Some(MoveExerciseName::ForwardBendWheelchair),
20325            "toe_touch_wheelchair" => Some(MoveExerciseName::ToeTouchWheelchair),
20326            "extended_toe_touch_wheelchair" => Some(MoveExerciseName::ExtendedToeTouchWheelchair),
20327            "seated_arm_circles" => Some(MoveExerciseName::SeatedArmCircles),
20328            "trunk_rotations" => Some(MoveExerciseName::TrunkRotations),
20329            "seated_trunk_rotations" => Some(MoveExerciseName::SeatedTrunkRotations),
20330            "toe_touch" => Some(MoveExerciseName::ToeTouch),
20331            _ => None,
20332        }
20333    }
20334}
20335
20336#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
20337#[repr(u16)]
20338#[non_exhaustive]
20339pub enum PoseExerciseName {
20340    AllFours = 0,
20341    AnkleToKnee = 1,
20342    BabyCobra = 2,
20343    Boat = 3,
20344    BoundAngle = 4,
20345    BoundSeatedSingleLegForwardBend = 5,
20346    Bow = 6,
20347    BowedHalfMoon = 7,
20348    Bridge = 8,
20349    Cat = 9,
20350    Chair = 10,
20351    Childs = 11,
20352    Corpse = 12,
20353    CowFace = 13,
20354    Cow = 14,
20355    DevotionalWarrior = 15,
20356    DolphinPlank = 16,
20357    Dolphin = 17,
20358    DownDogKneeToNose = 18,
20359    DownDogSplit = 19,
20360    DownDogSplitOpenHipBentKnee = 20,
20361    DownwardFacingDog = 21,
20362    Eagle = 22,
20363    EasySeated = 23,
20364    ExtendedPuppy = 24,
20365    ExtendedSideAngle = 25,
20366    Fish = 26,
20367    FourLimbedStaff = 27,
20368    FullSplit = 28,
20369    Gate = 29,
20370    HalfChairHalfAnkleToKnee = 30,
20371    HalfMoon = 31,
20372    HeadToKnee = 32,
20373    Heron = 33,
20374    Heros = 34,
20375    HighLunge = 35,
20376    KneesChestChin = 36,
20377    Lizard = 37,
20378    Locust = 38,
20379    LowLunge = 39,
20380    LowLungeTwist = 40,
20381    LowLungeWithKneeDown = 41,
20382    Mermaid = 42,
20383    Mountain = 43,
20384    OneLeggedDownwardFacingPoseOpenHipBentKnee = 44,
20385    OneLeggedPigeon = 45,
20386    PeacefulWarrior = 46,
20387    Plank = 47,
20388    Plow = 48,
20389    ReclinedHandToFoot = 49,
20390    RevolvedHalfMoon = 50,
20391    RevolvedHeadToKnee = 51,
20392    RevolvedTriangle = 52,
20393    RunnersLunge = 53,
20394    SeatedEasySideBend = 54,
20395    SeatedEasyTwist = 55,
20396    SeatedLongLegForwardBend = 56,
20397    SeatedWideLegForwardBend = 57,
20398    ShoulderStand = 58,
20399    SideBoat = 59,
20400    SidePlank = 60,
20401    Sphinx = 61,
20402    SquatOpenArmTwist = 62,
20403    SquatPalmPress = 63,
20404    Staff = 64,
20405    StandingArmsUp = 65,
20406    StandingForwardBendHalfwayUp = 66,
20407    StandingForwardBend = 67,
20408    StandingSideOpener = 68,
20409    StandingSingleLegForwardBend = 69,
20410    StandingSplit = 70,
20411    StandingWideLegForwardBend = 71,
20412    StandingWideLegForwardBendWithTwist = 72,
20413    SupineSpinalTwist = 73,
20414    TableTop = 74,
20415    ThreadTheNeedle = 75,
20416    Thunderbolt = 76,
20417    ThunderboltPoseBothSidesArmStretch = 77,
20418    Tree = 78,
20419    Triangle = 79,
20420    UpDog = 80,
20421    UpwardFacingPlank = 81,
20422    WarriorOne = 82,
20423    WarriorThree = 83,
20424    WarriorTwo = 84,
20425    Wheel = 85,
20426    WideSideLunge = 86,
20427    DeepBreathingWheelchair = 87,
20428    DeepBreathingLowWheelchair = 88,
20429    DeepBreathingMidWheelchair = 89,
20430    DeepBreathingHighWheelchair = 90,
20431    PrayerWheelchair = 91,
20432    OverheadPrayerWheelchair = 92,
20433    CactusWheelchair = 93,
20434    BreathingPunchesWheelchair = 94,
20435    BreathingPunchesExtendedWheelchair = 95,
20436    BreathingPunchesOverheadWheelchair = 96,
20437    BreathingPunchesOverheadAndDownWheelchair = 97,
20438    BreathingPunchesSideWheelchair = 98,
20439    BreathingPunchesExtendedSideWheelchair = 99,
20440    BreathingPunchesOverheadSideWheelchair = 100,
20441    BreathingPunchesOverheadAndDownSideWheelchair = 101,
20442    LeftHandBackWheelchair = 102,
20443    TriangleWheelchair = 103,
20444    ThreadTheNeedleWheelchair = 104,
20445    NeckFlexionAndExtensionWheelchair = 105,
20446    NeckLateralFlexionWheelchair = 106,
20447    SpineFlexionAndExtensionWheelchair = 107,
20448    SpineRotationWheelchair = 108,
20449    SpineLateralFlexionWheelchair = 109,
20450    AlternativeSkiingWheelchair = 110,
20451    ReachForwardWheelchair = 111,
20452    WarriorWheelchair = 112,
20453    ReverseWarriorWheelchair = 113,
20454    DownwardFacingDogToCobra = 114,
20455    SeatedCatCow = 115,
20456}
20457
20458impl PoseExerciseName {
20459    /// Snake-case canonical name from Profile.xlsx.
20460    pub fn as_str(&self) -> &'static str {
20461        match self {
20462            PoseExerciseName::AllFours => "all_fours",
20463            PoseExerciseName::AnkleToKnee => "ankle_to_knee",
20464            PoseExerciseName::BabyCobra => "baby_cobra",
20465            PoseExerciseName::Boat => "boat",
20466            PoseExerciseName::BoundAngle => "bound_angle",
20467            PoseExerciseName::BoundSeatedSingleLegForwardBend => {
20468                "bound_seated_single_leg_forward_bend"
20469            }
20470            PoseExerciseName::Bow => "bow",
20471            PoseExerciseName::BowedHalfMoon => "bowed_half_moon",
20472            PoseExerciseName::Bridge => "bridge",
20473            PoseExerciseName::Cat => "cat",
20474            PoseExerciseName::Chair => "chair",
20475            PoseExerciseName::Childs => "childs",
20476            PoseExerciseName::Corpse => "corpse",
20477            PoseExerciseName::CowFace => "cow_face",
20478            PoseExerciseName::Cow => "cow",
20479            PoseExerciseName::DevotionalWarrior => "devotional_warrior",
20480            PoseExerciseName::DolphinPlank => "dolphin_plank",
20481            PoseExerciseName::Dolphin => "dolphin",
20482            PoseExerciseName::DownDogKneeToNose => "down_dog_knee_to_nose",
20483            PoseExerciseName::DownDogSplit => "down_dog_split",
20484            PoseExerciseName::DownDogSplitOpenHipBentKnee => "down_dog_split_open_hip_bent_knee",
20485            PoseExerciseName::DownwardFacingDog => "downward_facing_dog",
20486            PoseExerciseName::Eagle => "eagle",
20487            PoseExerciseName::EasySeated => "easy_seated",
20488            PoseExerciseName::ExtendedPuppy => "extended_puppy",
20489            PoseExerciseName::ExtendedSideAngle => "extended_side_angle",
20490            PoseExerciseName::Fish => "fish",
20491            PoseExerciseName::FourLimbedStaff => "four_limbed_staff",
20492            PoseExerciseName::FullSplit => "full_split",
20493            PoseExerciseName::Gate => "gate",
20494            PoseExerciseName::HalfChairHalfAnkleToKnee => "half_chair_half_ankle_to_knee",
20495            PoseExerciseName::HalfMoon => "half_moon",
20496            PoseExerciseName::HeadToKnee => "head_to_knee",
20497            PoseExerciseName::Heron => "heron",
20498            PoseExerciseName::Heros => "heros",
20499            PoseExerciseName::HighLunge => "high_lunge",
20500            PoseExerciseName::KneesChestChin => "knees_chest_chin",
20501            PoseExerciseName::Lizard => "lizard",
20502            PoseExerciseName::Locust => "locust",
20503            PoseExerciseName::LowLunge => "low_lunge",
20504            PoseExerciseName::LowLungeTwist => "low_lunge_twist",
20505            PoseExerciseName::LowLungeWithKneeDown => "low_lunge_with_knee_down",
20506            PoseExerciseName::Mermaid => "mermaid",
20507            PoseExerciseName::Mountain => "mountain",
20508            PoseExerciseName::OneLeggedDownwardFacingPoseOpenHipBentKnee => {
20509                "one_legged_downward_facing_pose_open_hip_bent_knee"
20510            }
20511            PoseExerciseName::OneLeggedPigeon => "one_legged_pigeon",
20512            PoseExerciseName::PeacefulWarrior => "peaceful_warrior",
20513            PoseExerciseName::Plank => "plank",
20514            PoseExerciseName::Plow => "plow",
20515            PoseExerciseName::ReclinedHandToFoot => "reclined_hand_to_foot",
20516            PoseExerciseName::RevolvedHalfMoon => "revolved_half_moon",
20517            PoseExerciseName::RevolvedHeadToKnee => "revolved_head_to_knee",
20518            PoseExerciseName::RevolvedTriangle => "revolved_triangle",
20519            PoseExerciseName::RunnersLunge => "runners_lunge",
20520            PoseExerciseName::SeatedEasySideBend => "seated_easy_side_bend",
20521            PoseExerciseName::SeatedEasyTwist => "seated_easy_twist",
20522            PoseExerciseName::SeatedLongLegForwardBend => "seated_long_leg_forward_bend",
20523            PoseExerciseName::SeatedWideLegForwardBend => "seated_wide_leg_forward_bend",
20524            PoseExerciseName::ShoulderStand => "shoulder_stand",
20525            PoseExerciseName::SideBoat => "side_boat",
20526            PoseExerciseName::SidePlank => "side_plank",
20527            PoseExerciseName::Sphinx => "sphinx",
20528            PoseExerciseName::SquatOpenArmTwist => "squat_open_arm_twist",
20529            PoseExerciseName::SquatPalmPress => "squat_palm_press",
20530            PoseExerciseName::Staff => "staff",
20531            PoseExerciseName::StandingArmsUp => "standing_arms_up",
20532            PoseExerciseName::StandingForwardBendHalfwayUp => "standing_forward_bend_halfway_up",
20533            PoseExerciseName::StandingForwardBend => "standing_forward_bend",
20534            PoseExerciseName::StandingSideOpener => "standing_side_opener",
20535            PoseExerciseName::StandingSingleLegForwardBend => "standing_single_leg_forward_bend",
20536            PoseExerciseName::StandingSplit => "standing_split",
20537            PoseExerciseName::StandingWideLegForwardBend => "standing_wide_leg_forward_bend",
20538            PoseExerciseName::StandingWideLegForwardBendWithTwist => {
20539                "standing_wide_leg_forward_bend_with_twist"
20540            }
20541            PoseExerciseName::SupineSpinalTwist => "supine_spinal_twist",
20542            PoseExerciseName::TableTop => "table_top",
20543            PoseExerciseName::ThreadTheNeedle => "thread_the_needle",
20544            PoseExerciseName::Thunderbolt => "thunderbolt",
20545            PoseExerciseName::ThunderboltPoseBothSidesArmStretch => {
20546                "thunderbolt_pose_both_sides_arm_stretch"
20547            }
20548            PoseExerciseName::Tree => "tree",
20549            PoseExerciseName::Triangle => "triangle",
20550            PoseExerciseName::UpDog => "up_dog",
20551            PoseExerciseName::UpwardFacingPlank => "upward_facing_plank",
20552            PoseExerciseName::WarriorOne => "warrior_one",
20553            PoseExerciseName::WarriorThree => "warrior_three",
20554            PoseExerciseName::WarriorTwo => "warrior_two",
20555            PoseExerciseName::Wheel => "wheel",
20556            PoseExerciseName::WideSideLunge => "wide_side_lunge",
20557            PoseExerciseName::DeepBreathingWheelchair => "deep_breathing_wheelchair",
20558            PoseExerciseName::DeepBreathingLowWheelchair => "deep_breathing_low_wheelchair",
20559            PoseExerciseName::DeepBreathingMidWheelchair => "deep_breathing_mid_wheelchair",
20560            PoseExerciseName::DeepBreathingHighWheelchair => "deep_breathing_high_wheelchair",
20561            PoseExerciseName::PrayerWheelchair => "prayer_wheelchair",
20562            PoseExerciseName::OverheadPrayerWheelchair => "overhead_prayer_wheelchair",
20563            PoseExerciseName::CactusWheelchair => "cactus_wheelchair",
20564            PoseExerciseName::BreathingPunchesWheelchair => "breathing_punches_wheelchair",
20565            PoseExerciseName::BreathingPunchesExtendedWheelchair => {
20566                "breathing_punches_extended_wheelchair"
20567            }
20568            PoseExerciseName::BreathingPunchesOverheadWheelchair => {
20569                "breathing_punches_overhead_wheelchair"
20570            }
20571            PoseExerciseName::BreathingPunchesOverheadAndDownWheelchair => {
20572                "breathing_punches_overhead_and_down_wheelchair"
20573            }
20574            PoseExerciseName::BreathingPunchesSideWheelchair => "breathing_punches_side_wheelchair",
20575            PoseExerciseName::BreathingPunchesExtendedSideWheelchair => {
20576                "breathing_punches_extended_side_wheelchair"
20577            }
20578            PoseExerciseName::BreathingPunchesOverheadSideWheelchair => {
20579                "breathing_punches_overhead_side_wheelchair"
20580            }
20581            PoseExerciseName::BreathingPunchesOverheadAndDownSideWheelchair => {
20582                "breathing_punches_overhead_and_down_side_wheelchair"
20583            }
20584            PoseExerciseName::LeftHandBackWheelchair => "left_hand_back_wheelchair",
20585            PoseExerciseName::TriangleWheelchair => "triangle_wheelchair",
20586            PoseExerciseName::ThreadTheNeedleWheelchair => "thread_the_needle_wheelchair",
20587            PoseExerciseName::NeckFlexionAndExtensionWheelchair => {
20588                "neck_flexion_and_extension_wheelchair"
20589            }
20590            PoseExerciseName::NeckLateralFlexionWheelchair => "neck_lateral_flexion_wheelchair",
20591            PoseExerciseName::SpineFlexionAndExtensionWheelchair => {
20592                "spine_flexion_and_extension_wheelchair"
20593            }
20594            PoseExerciseName::SpineRotationWheelchair => "spine_rotation_wheelchair",
20595            PoseExerciseName::SpineLateralFlexionWheelchair => "spine_lateral_flexion_wheelchair",
20596            PoseExerciseName::AlternativeSkiingWheelchair => "alternative_skiing_wheelchair",
20597            PoseExerciseName::ReachForwardWheelchair => "reach_forward_wheelchair",
20598            PoseExerciseName::WarriorWheelchair => "warrior_wheelchair",
20599            PoseExerciseName::ReverseWarriorWheelchair => "reverse_warrior_wheelchair",
20600            PoseExerciseName::DownwardFacingDogToCobra => "downward_facing_dog_to_cobra",
20601            PoseExerciseName::SeatedCatCow => "seated_cat_cow",
20602        }
20603    }
20604
20605    /// Try to construct from the underlying numeric value.
20606    pub fn from_value(value: u16) -> Option<Self> {
20607        match value {
20608            0 => Some(PoseExerciseName::AllFours),
20609            1 => Some(PoseExerciseName::AnkleToKnee),
20610            2 => Some(PoseExerciseName::BabyCobra),
20611            3 => Some(PoseExerciseName::Boat),
20612            4 => Some(PoseExerciseName::BoundAngle),
20613            5 => Some(PoseExerciseName::BoundSeatedSingleLegForwardBend),
20614            6 => Some(PoseExerciseName::Bow),
20615            7 => Some(PoseExerciseName::BowedHalfMoon),
20616            8 => Some(PoseExerciseName::Bridge),
20617            9 => Some(PoseExerciseName::Cat),
20618            10 => Some(PoseExerciseName::Chair),
20619            11 => Some(PoseExerciseName::Childs),
20620            12 => Some(PoseExerciseName::Corpse),
20621            13 => Some(PoseExerciseName::CowFace),
20622            14 => Some(PoseExerciseName::Cow),
20623            15 => Some(PoseExerciseName::DevotionalWarrior),
20624            16 => Some(PoseExerciseName::DolphinPlank),
20625            17 => Some(PoseExerciseName::Dolphin),
20626            18 => Some(PoseExerciseName::DownDogKneeToNose),
20627            19 => Some(PoseExerciseName::DownDogSplit),
20628            20 => Some(PoseExerciseName::DownDogSplitOpenHipBentKnee),
20629            21 => Some(PoseExerciseName::DownwardFacingDog),
20630            22 => Some(PoseExerciseName::Eagle),
20631            23 => Some(PoseExerciseName::EasySeated),
20632            24 => Some(PoseExerciseName::ExtendedPuppy),
20633            25 => Some(PoseExerciseName::ExtendedSideAngle),
20634            26 => Some(PoseExerciseName::Fish),
20635            27 => Some(PoseExerciseName::FourLimbedStaff),
20636            28 => Some(PoseExerciseName::FullSplit),
20637            29 => Some(PoseExerciseName::Gate),
20638            30 => Some(PoseExerciseName::HalfChairHalfAnkleToKnee),
20639            31 => Some(PoseExerciseName::HalfMoon),
20640            32 => Some(PoseExerciseName::HeadToKnee),
20641            33 => Some(PoseExerciseName::Heron),
20642            34 => Some(PoseExerciseName::Heros),
20643            35 => Some(PoseExerciseName::HighLunge),
20644            36 => Some(PoseExerciseName::KneesChestChin),
20645            37 => Some(PoseExerciseName::Lizard),
20646            38 => Some(PoseExerciseName::Locust),
20647            39 => Some(PoseExerciseName::LowLunge),
20648            40 => Some(PoseExerciseName::LowLungeTwist),
20649            41 => Some(PoseExerciseName::LowLungeWithKneeDown),
20650            42 => Some(PoseExerciseName::Mermaid),
20651            43 => Some(PoseExerciseName::Mountain),
20652            44 => Some(PoseExerciseName::OneLeggedDownwardFacingPoseOpenHipBentKnee),
20653            45 => Some(PoseExerciseName::OneLeggedPigeon),
20654            46 => Some(PoseExerciseName::PeacefulWarrior),
20655            47 => Some(PoseExerciseName::Plank),
20656            48 => Some(PoseExerciseName::Plow),
20657            49 => Some(PoseExerciseName::ReclinedHandToFoot),
20658            50 => Some(PoseExerciseName::RevolvedHalfMoon),
20659            51 => Some(PoseExerciseName::RevolvedHeadToKnee),
20660            52 => Some(PoseExerciseName::RevolvedTriangle),
20661            53 => Some(PoseExerciseName::RunnersLunge),
20662            54 => Some(PoseExerciseName::SeatedEasySideBend),
20663            55 => Some(PoseExerciseName::SeatedEasyTwist),
20664            56 => Some(PoseExerciseName::SeatedLongLegForwardBend),
20665            57 => Some(PoseExerciseName::SeatedWideLegForwardBend),
20666            58 => Some(PoseExerciseName::ShoulderStand),
20667            59 => Some(PoseExerciseName::SideBoat),
20668            60 => Some(PoseExerciseName::SidePlank),
20669            61 => Some(PoseExerciseName::Sphinx),
20670            62 => Some(PoseExerciseName::SquatOpenArmTwist),
20671            63 => Some(PoseExerciseName::SquatPalmPress),
20672            64 => Some(PoseExerciseName::Staff),
20673            65 => Some(PoseExerciseName::StandingArmsUp),
20674            66 => Some(PoseExerciseName::StandingForwardBendHalfwayUp),
20675            67 => Some(PoseExerciseName::StandingForwardBend),
20676            68 => Some(PoseExerciseName::StandingSideOpener),
20677            69 => Some(PoseExerciseName::StandingSingleLegForwardBend),
20678            70 => Some(PoseExerciseName::StandingSplit),
20679            71 => Some(PoseExerciseName::StandingWideLegForwardBend),
20680            72 => Some(PoseExerciseName::StandingWideLegForwardBendWithTwist),
20681            73 => Some(PoseExerciseName::SupineSpinalTwist),
20682            74 => Some(PoseExerciseName::TableTop),
20683            75 => Some(PoseExerciseName::ThreadTheNeedle),
20684            76 => Some(PoseExerciseName::Thunderbolt),
20685            77 => Some(PoseExerciseName::ThunderboltPoseBothSidesArmStretch),
20686            78 => Some(PoseExerciseName::Tree),
20687            79 => Some(PoseExerciseName::Triangle),
20688            80 => Some(PoseExerciseName::UpDog),
20689            81 => Some(PoseExerciseName::UpwardFacingPlank),
20690            82 => Some(PoseExerciseName::WarriorOne),
20691            83 => Some(PoseExerciseName::WarriorThree),
20692            84 => Some(PoseExerciseName::WarriorTwo),
20693            85 => Some(PoseExerciseName::Wheel),
20694            86 => Some(PoseExerciseName::WideSideLunge),
20695            87 => Some(PoseExerciseName::DeepBreathingWheelchair),
20696            88 => Some(PoseExerciseName::DeepBreathingLowWheelchair),
20697            89 => Some(PoseExerciseName::DeepBreathingMidWheelchair),
20698            90 => Some(PoseExerciseName::DeepBreathingHighWheelchair),
20699            91 => Some(PoseExerciseName::PrayerWheelchair),
20700            92 => Some(PoseExerciseName::OverheadPrayerWheelchair),
20701            93 => Some(PoseExerciseName::CactusWheelchair),
20702            94 => Some(PoseExerciseName::BreathingPunchesWheelchair),
20703            95 => Some(PoseExerciseName::BreathingPunchesExtendedWheelchair),
20704            96 => Some(PoseExerciseName::BreathingPunchesOverheadWheelchair),
20705            97 => Some(PoseExerciseName::BreathingPunchesOverheadAndDownWheelchair),
20706            98 => Some(PoseExerciseName::BreathingPunchesSideWheelchair),
20707            99 => Some(PoseExerciseName::BreathingPunchesExtendedSideWheelchair),
20708            100 => Some(PoseExerciseName::BreathingPunchesOverheadSideWheelchair),
20709            101 => Some(PoseExerciseName::BreathingPunchesOverheadAndDownSideWheelchair),
20710            102 => Some(PoseExerciseName::LeftHandBackWheelchair),
20711            103 => Some(PoseExerciseName::TriangleWheelchair),
20712            104 => Some(PoseExerciseName::ThreadTheNeedleWheelchair),
20713            105 => Some(PoseExerciseName::NeckFlexionAndExtensionWheelchair),
20714            106 => Some(PoseExerciseName::NeckLateralFlexionWheelchair),
20715            107 => Some(PoseExerciseName::SpineFlexionAndExtensionWheelchair),
20716            108 => Some(PoseExerciseName::SpineRotationWheelchair),
20717            109 => Some(PoseExerciseName::SpineLateralFlexionWheelchair),
20718            110 => Some(PoseExerciseName::AlternativeSkiingWheelchair),
20719            111 => Some(PoseExerciseName::ReachForwardWheelchair),
20720            112 => Some(PoseExerciseName::WarriorWheelchair),
20721            113 => Some(PoseExerciseName::ReverseWarriorWheelchair),
20722            114 => Some(PoseExerciseName::DownwardFacingDogToCobra),
20723            115 => Some(PoseExerciseName::SeatedCatCow),
20724            _ => None,
20725        }
20726    }
20727
20728    /// Try to construct from the snake-case canonical name.
20729    pub fn from_str(name: &str) -> Option<Self> {
20730        match name {
20731            "all_fours" => Some(PoseExerciseName::AllFours),
20732            "ankle_to_knee" => Some(PoseExerciseName::AnkleToKnee),
20733            "baby_cobra" => Some(PoseExerciseName::BabyCobra),
20734            "boat" => Some(PoseExerciseName::Boat),
20735            "bound_angle" => Some(PoseExerciseName::BoundAngle),
20736            "bound_seated_single_leg_forward_bend" => {
20737                Some(PoseExerciseName::BoundSeatedSingleLegForwardBend)
20738            }
20739            "bow" => Some(PoseExerciseName::Bow),
20740            "bowed_half_moon" => Some(PoseExerciseName::BowedHalfMoon),
20741            "bridge" => Some(PoseExerciseName::Bridge),
20742            "cat" => Some(PoseExerciseName::Cat),
20743            "chair" => Some(PoseExerciseName::Chair),
20744            "childs" => Some(PoseExerciseName::Childs),
20745            "corpse" => Some(PoseExerciseName::Corpse),
20746            "cow_face" => Some(PoseExerciseName::CowFace),
20747            "cow" => Some(PoseExerciseName::Cow),
20748            "devotional_warrior" => Some(PoseExerciseName::DevotionalWarrior),
20749            "dolphin_plank" => Some(PoseExerciseName::DolphinPlank),
20750            "dolphin" => Some(PoseExerciseName::Dolphin),
20751            "down_dog_knee_to_nose" => Some(PoseExerciseName::DownDogKneeToNose),
20752            "down_dog_split" => Some(PoseExerciseName::DownDogSplit),
20753            "down_dog_split_open_hip_bent_knee" => {
20754                Some(PoseExerciseName::DownDogSplitOpenHipBentKnee)
20755            }
20756            "downward_facing_dog" => Some(PoseExerciseName::DownwardFacingDog),
20757            "eagle" => Some(PoseExerciseName::Eagle),
20758            "easy_seated" => Some(PoseExerciseName::EasySeated),
20759            "extended_puppy" => Some(PoseExerciseName::ExtendedPuppy),
20760            "extended_side_angle" => Some(PoseExerciseName::ExtendedSideAngle),
20761            "fish" => Some(PoseExerciseName::Fish),
20762            "four_limbed_staff" => Some(PoseExerciseName::FourLimbedStaff),
20763            "full_split" => Some(PoseExerciseName::FullSplit),
20764            "gate" => Some(PoseExerciseName::Gate),
20765            "half_chair_half_ankle_to_knee" => Some(PoseExerciseName::HalfChairHalfAnkleToKnee),
20766            "half_moon" => Some(PoseExerciseName::HalfMoon),
20767            "head_to_knee" => Some(PoseExerciseName::HeadToKnee),
20768            "heron" => Some(PoseExerciseName::Heron),
20769            "heros" => Some(PoseExerciseName::Heros),
20770            "high_lunge" => Some(PoseExerciseName::HighLunge),
20771            "knees_chest_chin" => Some(PoseExerciseName::KneesChestChin),
20772            "lizard" => Some(PoseExerciseName::Lizard),
20773            "locust" => Some(PoseExerciseName::Locust),
20774            "low_lunge" => Some(PoseExerciseName::LowLunge),
20775            "low_lunge_twist" => Some(PoseExerciseName::LowLungeTwist),
20776            "low_lunge_with_knee_down" => Some(PoseExerciseName::LowLungeWithKneeDown),
20777            "mermaid" => Some(PoseExerciseName::Mermaid),
20778            "mountain" => Some(PoseExerciseName::Mountain),
20779            "one_legged_downward_facing_pose_open_hip_bent_knee" => {
20780                Some(PoseExerciseName::OneLeggedDownwardFacingPoseOpenHipBentKnee)
20781            }
20782            "one_legged_pigeon" => Some(PoseExerciseName::OneLeggedPigeon),
20783            "peaceful_warrior" => Some(PoseExerciseName::PeacefulWarrior),
20784            "plank" => Some(PoseExerciseName::Plank),
20785            "plow" => Some(PoseExerciseName::Plow),
20786            "reclined_hand_to_foot" => Some(PoseExerciseName::ReclinedHandToFoot),
20787            "revolved_half_moon" => Some(PoseExerciseName::RevolvedHalfMoon),
20788            "revolved_head_to_knee" => Some(PoseExerciseName::RevolvedHeadToKnee),
20789            "revolved_triangle" => Some(PoseExerciseName::RevolvedTriangle),
20790            "runners_lunge" => Some(PoseExerciseName::RunnersLunge),
20791            "seated_easy_side_bend" => Some(PoseExerciseName::SeatedEasySideBend),
20792            "seated_easy_twist" => Some(PoseExerciseName::SeatedEasyTwist),
20793            "seated_long_leg_forward_bend" => Some(PoseExerciseName::SeatedLongLegForwardBend),
20794            "seated_wide_leg_forward_bend" => Some(PoseExerciseName::SeatedWideLegForwardBend),
20795            "shoulder_stand" => Some(PoseExerciseName::ShoulderStand),
20796            "side_boat" => Some(PoseExerciseName::SideBoat),
20797            "side_plank" => Some(PoseExerciseName::SidePlank),
20798            "sphinx" => Some(PoseExerciseName::Sphinx),
20799            "squat_open_arm_twist" => Some(PoseExerciseName::SquatOpenArmTwist),
20800            "squat_palm_press" => Some(PoseExerciseName::SquatPalmPress),
20801            "staff" => Some(PoseExerciseName::Staff),
20802            "standing_arms_up" => Some(PoseExerciseName::StandingArmsUp),
20803            "standing_forward_bend_halfway_up" => {
20804                Some(PoseExerciseName::StandingForwardBendHalfwayUp)
20805            }
20806            "standing_forward_bend" => Some(PoseExerciseName::StandingForwardBend),
20807            "standing_side_opener" => Some(PoseExerciseName::StandingSideOpener),
20808            "standing_single_leg_forward_bend" => {
20809                Some(PoseExerciseName::StandingSingleLegForwardBend)
20810            }
20811            "standing_split" => Some(PoseExerciseName::StandingSplit),
20812            "standing_wide_leg_forward_bend" => Some(PoseExerciseName::StandingWideLegForwardBend),
20813            "standing_wide_leg_forward_bend_with_twist" => {
20814                Some(PoseExerciseName::StandingWideLegForwardBendWithTwist)
20815            }
20816            "supine_spinal_twist" => Some(PoseExerciseName::SupineSpinalTwist),
20817            "table_top" => Some(PoseExerciseName::TableTop),
20818            "thread_the_needle" => Some(PoseExerciseName::ThreadTheNeedle),
20819            "thunderbolt" => Some(PoseExerciseName::Thunderbolt),
20820            "thunderbolt_pose_both_sides_arm_stretch" => {
20821                Some(PoseExerciseName::ThunderboltPoseBothSidesArmStretch)
20822            }
20823            "tree" => Some(PoseExerciseName::Tree),
20824            "triangle" => Some(PoseExerciseName::Triangle),
20825            "up_dog" => Some(PoseExerciseName::UpDog),
20826            "upward_facing_plank" => Some(PoseExerciseName::UpwardFacingPlank),
20827            "warrior_one" => Some(PoseExerciseName::WarriorOne),
20828            "warrior_three" => Some(PoseExerciseName::WarriorThree),
20829            "warrior_two" => Some(PoseExerciseName::WarriorTwo),
20830            "wheel" => Some(PoseExerciseName::Wheel),
20831            "wide_side_lunge" => Some(PoseExerciseName::WideSideLunge),
20832            "deep_breathing_wheelchair" => Some(PoseExerciseName::DeepBreathingWheelchair),
20833            "deep_breathing_low_wheelchair" => Some(PoseExerciseName::DeepBreathingLowWheelchair),
20834            "deep_breathing_mid_wheelchair" => Some(PoseExerciseName::DeepBreathingMidWheelchair),
20835            "deep_breathing_high_wheelchair" => Some(PoseExerciseName::DeepBreathingHighWheelchair),
20836            "prayer_wheelchair" => Some(PoseExerciseName::PrayerWheelchair),
20837            "overhead_prayer_wheelchair" => Some(PoseExerciseName::OverheadPrayerWheelchair),
20838            "cactus_wheelchair" => Some(PoseExerciseName::CactusWheelchair),
20839            "breathing_punches_wheelchair" => Some(PoseExerciseName::BreathingPunchesWheelchair),
20840            "breathing_punches_extended_wheelchair" => {
20841                Some(PoseExerciseName::BreathingPunchesExtendedWheelchair)
20842            }
20843            "breathing_punches_overhead_wheelchair" => {
20844                Some(PoseExerciseName::BreathingPunchesOverheadWheelchair)
20845            }
20846            "breathing_punches_overhead_and_down_wheelchair" => {
20847                Some(PoseExerciseName::BreathingPunchesOverheadAndDownWheelchair)
20848            }
20849            "breathing_punches_side_wheelchair" => {
20850                Some(PoseExerciseName::BreathingPunchesSideWheelchair)
20851            }
20852            "breathing_punches_extended_side_wheelchair" => {
20853                Some(PoseExerciseName::BreathingPunchesExtendedSideWheelchair)
20854            }
20855            "breathing_punches_overhead_side_wheelchair" => {
20856                Some(PoseExerciseName::BreathingPunchesOverheadSideWheelchair)
20857            }
20858            "breathing_punches_overhead_and_down_side_wheelchair" => {
20859                Some(PoseExerciseName::BreathingPunchesOverheadAndDownSideWheelchair)
20860            }
20861            "left_hand_back_wheelchair" => Some(PoseExerciseName::LeftHandBackWheelchair),
20862            "triangle_wheelchair" => Some(PoseExerciseName::TriangleWheelchair),
20863            "thread_the_needle_wheelchair" => Some(PoseExerciseName::ThreadTheNeedleWheelchair),
20864            "neck_flexion_and_extension_wheelchair" => {
20865                Some(PoseExerciseName::NeckFlexionAndExtensionWheelchair)
20866            }
20867            "neck_lateral_flexion_wheelchair" => {
20868                Some(PoseExerciseName::NeckLateralFlexionWheelchair)
20869            }
20870            "spine_flexion_and_extension_wheelchair" => {
20871                Some(PoseExerciseName::SpineFlexionAndExtensionWheelchair)
20872            }
20873            "spine_rotation_wheelchair" => Some(PoseExerciseName::SpineRotationWheelchair),
20874            "spine_lateral_flexion_wheelchair" => {
20875                Some(PoseExerciseName::SpineLateralFlexionWheelchair)
20876            }
20877            "alternative_skiing_wheelchair" => Some(PoseExerciseName::AlternativeSkiingWheelchair),
20878            "reach_forward_wheelchair" => Some(PoseExerciseName::ReachForwardWheelchair),
20879            "warrior_wheelchair" => Some(PoseExerciseName::WarriorWheelchair),
20880            "reverse_warrior_wheelchair" => Some(PoseExerciseName::ReverseWarriorWheelchair),
20881            "downward_facing_dog_to_cobra" => Some(PoseExerciseName::DownwardFacingDogToCobra),
20882            "seated_cat_cow" => Some(PoseExerciseName::SeatedCatCow),
20883            _ => None,
20884        }
20885    }
20886}
20887
20888#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
20889#[repr(u16)]
20890#[non_exhaustive]
20891pub enum TricepsExtensionExerciseName {
20892    BenchDip = 0,
20893    WeightedBenchDip = 1,
20894    BodyWeightDip = 2,
20895    CableKickback = 3,
20896    CableLyingTricepsExtension = 4,
20897    CableOverheadTricepsExtension = 5,
20898    DumbbellKickback = 6,
20899    DumbbellLyingTricepsExtension = 7,
20900    EzBarOverheadTricepsExtension = 8,
20901    InclineDip = 9,
20902    WeightedInclineDip = 10,
20903    InclineEzBarLyingTricepsExtension = 11,
20904    LyingDumbbellPulloverToExtension = 12,
20905    LyingEzBarTricepsExtension = 13,
20906    LyingTricepsExtensionToCloseGripBenchPress = 14,
20907    OverheadDumbbellTricepsExtension = 15,
20908    RecliningTricepsPress = 16,
20909    ReverseGripPressdown = 17,
20910    ReverseGripTricepsPressdown = 18,
20911    RopePressdown = 19,
20912    SeatedBarbellOverheadTricepsExtension = 20,
20913    SeatedDumbbellOverheadTricepsExtension = 21,
20914    SeatedEzBarOverheadTricepsExtension = 22,
20915    SeatedSingleArmOverheadDumbbellExtension = 23,
20916    SingleArmDumbbellOverheadTricepsExtension = 24,
20917    SingleDumbbellSeatedOverheadTricepsExtension = 25,
20918    SingleLegBenchDipAndKick = 26,
20919    WeightedSingleLegBenchDipAndKick = 27,
20920    SingleLegDip = 28,
20921    WeightedSingleLegDip = 29,
20922    StaticLyingTricepsExtension = 30,
20923    SuspendedDip = 31,
20924    WeightedSuspendedDip = 32,
20925    SwissBallDumbbellLyingTricepsExtension = 33,
20926    SwissBallEzBarLyingTricepsExtension = 34,
20927    SwissBallEzBarOverheadTricepsExtension = 35,
20928    TabletopDip = 36,
20929    WeightedTabletopDip = 37,
20930    TricepsExtensionOnFloor = 38,
20931    TricepsPressdown = 39,
20932    WeightedDip = 40,
20933    AlternatingDumbbellLyingTricepsExtension = 41,
20934    TricepsPress = 42,
20935    DumbbellKickbackWheelchair = 43,
20936    OverheadDumbbellTricepsExtensionWheelchair = 44,
20937}
20938
20939impl TricepsExtensionExerciseName {
20940    /// Snake-case canonical name from Profile.xlsx.
20941    pub fn as_str(&self) -> &'static str {
20942        match self {
20943            TricepsExtensionExerciseName::BenchDip => "bench_dip",
20944            TricepsExtensionExerciseName::WeightedBenchDip => "weighted_bench_dip",
20945            TricepsExtensionExerciseName::BodyWeightDip => "body_weight_dip",
20946            TricepsExtensionExerciseName::CableKickback => "cable_kickback",
20947            TricepsExtensionExerciseName::CableLyingTricepsExtension => {
20948                "cable_lying_triceps_extension"
20949            }
20950            TricepsExtensionExerciseName::CableOverheadTricepsExtension => {
20951                "cable_overhead_triceps_extension"
20952            }
20953            TricepsExtensionExerciseName::DumbbellKickback => "dumbbell_kickback",
20954            TricepsExtensionExerciseName::DumbbellLyingTricepsExtension => {
20955                "dumbbell_lying_triceps_extension"
20956            }
20957            TricepsExtensionExerciseName::EzBarOverheadTricepsExtension => {
20958                "ez_bar_overhead_triceps_extension"
20959            }
20960            TricepsExtensionExerciseName::InclineDip => "incline_dip",
20961            TricepsExtensionExerciseName::WeightedInclineDip => "weighted_incline_dip",
20962            TricepsExtensionExerciseName::InclineEzBarLyingTricepsExtension => {
20963                "incline_ez_bar_lying_triceps_extension"
20964            }
20965            TricepsExtensionExerciseName::LyingDumbbellPulloverToExtension => {
20966                "lying_dumbbell_pullover_to_extension"
20967            }
20968            TricepsExtensionExerciseName::LyingEzBarTricepsExtension => {
20969                "lying_ez_bar_triceps_extension"
20970            }
20971            TricepsExtensionExerciseName::LyingTricepsExtensionToCloseGripBenchPress => {
20972                "lying_triceps_extension_to_close_grip_bench_press"
20973            }
20974            TricepsExtensionExerciseName::OverheadDumbbellTricepsExtension => {
20975                "overhead_dumbbell_triceps_extension"
20976            }
20977            TricepsExtensionExerciseName::RecliningTricepsPress => "reclining_triceps_press",
20978            TricepsExtensionExerciseName::ReverseGripPressdown => "reverse_grip_pressdown",
20979            TricepsExtensionExerciseName::ReverseGripTricepsPressdown => {
20980                "reverse_grip_triceps_pressdown"
20981            }
20982            TricepsExtensionExerciseName::RopePressdown => "rope_pressdown",
20983            TricepsExtensionExerciseName::SeatedBarbellOverheadTricepsExtension => {
20984                "seated_barbell_overhead_triceps_extension"
20985            }
20986            TricepsExtensionExerciseName::SeatedDumbbellOverheadTricepsExtension => {
20987                "seated_dumbbell_overhead_triceps_extension"
20988            }
20989            TricepsExtensionExerciseName::SeatedEzBarOverheadTricepsExtension => {
20990                "seated_ez_bar_overhead_triceps_extension"
20991            }
20992            TricepsExtensionExerciseName::SeatedSingleArmOverheadDumbbellExtension => {
20993                "seated_single_arm_overhead_dumbbell_extension"
20994            }
20995            TricepsExtensionExerciseName::SingleArmDumbbellOverheadTricepsExtension => {
20996                "single_arm_dumbbell_overhead_triceps_extension"
20997            }
20998            TricepsExtensionExerciseName::SingleDumbbellSeatedOverheadTricepsExtension => {
20999                "single_dumbbell_seated_overhead_triceps_extension"
21000            }
21001            TricepsExtensionExerciseName::SingleLegBenchDipAndKick => {
21002                "single_leg_bench_dip_and_kick"
21003            }
21004            TricepsExtensionExerciseName::WeightedSingleLegBenchDipAndKick => {
21005                "weighted_single_leg_bench_dip_and_kick"
21006            }
21007            TricepsExtensionExerciseName::SingleLegDip => "single_leg_dip",
21008            TricepsExtensionExerciseName::WeightedSingleLegDip => "weighted_single_leg_dip",
21009            TricepsExtensionExerciseName::StaticLyingTricepsExtension => {
21010                "static_lying_triceps_extension"
21011            }
21012            TricepsExtensionExerciseName::SuspendedDip => "suspended_dip",
21013            TricepsExtensionExerciseName::WeightedSuspendedDip => "weighted_suspended_dip",
21014            TricepsExtensionExerciseName::SwissBallDumbbellLyingTricepsExtension => {
21015                "swiss_ball_dumbbell_lying_triceps_extension"
21016            }
21017            TricepsExtensionExerciseName::SwissBallEzBarLyingTricepsExtension => {
21018                "swiss_ball_ez_bar_lying_triceps_extension"
21019            }
21020            TricepsExtensionExerciseName::SwissBallEzBarOverheadTricepsExtension => {
21021                "swiss_ball_ez_bar_overhead_triceps_extension"
21022            }
21023            TricepsExtensionExerciseName::TabletopDip => "tabletop_dip",
21024            TricepsExtensionExerciseName::WeightedTabletopDip => "weighted_tabletop_dip",
21025            TricepsExtensionExerciseName::TricepsExtensionOnFloor => "triceps_extension_on_floor",
21026            TricepsExtensionExerciseName::TricepsPressdown => "triceps_pressdown",
21027            TricepsExtensionExerciseName::WeightedDip => "weighted_dip",
21028            TricepsExtensionExerciseName::AlternatingDumbbellLyingTricepsExtension => {
21029                "alternating_dumbbell_lying_triceps_extension"
21030            }
21031            TricepsExtensionExerciseName::TricepsPress => "triceps_press",
21032            TricepsExtensionExerciseName::DumbbellKickbackWheelchair => {
21033                "dumbbell_kickback_wheelchair"
21034            }
21035            TricepsExtensionExerciseName::OverheadDumbbellTricepsExtensionWheelchair => {
21036                "overhead_dumbbell_triceps_extension_wheelchair"
21037            }
21038        }
21039    }
21040
21041    /// Try to construct from the underlying numeric value.
21042    pub fn from_value(value: u16) -> Option<Self> {
21043        match value {
21044            0 => Some(TricepsExtensionExerciseName::BenchDip),
21045            1 => Some(TricepsExtensionExerciseName::WeightedBenchDip),
21046            2 => Some(TricepsExtensionExerciseName::BodyWeightDip),
21047            3 => Some(TricepsExtensionExerciseName::CableKickback),
21048            4 => Some(TricepsExtensionExerciseName::CableLyingTricepsExtension),
21049            5 => Some(TricepsExtensionExerciseName::CableOverheadTricepsExtension),
21050            6 => Some(TricepsExtensionExerciseName::DumbbellKickback),
21051            7 => Some(TricepsExtensionExerciseName::DumbbellLyingTricepsExtension),
21052            8 => Some(TricepsExtensionExerciseName::EzBarOverheadTricepsExtension),
21053            9 => Some(TricepsExtensionExerciseName::InclineDip),
21054            10 => Some(TricepsExtensionExerciseName::WeightedInclineDip),
21055            11 => Some(TricepsExtensionExerciseName::InclineEzBarLyingTricepsExtension),
21056            12 => Some(TricepsExtensionExerciseName::LyingDumbbellPulloverToExtension),
21057            13 => Some(TricepsExtensionExerciseName::LyingEzBarTricepsExtension),
21058            14 => Some(TricepsExtensionExerciseName::LyingTricepsExtensionToCloseGripBenchPress),
21059            15 => Some(TricepsExtensionExerciseName::OverheadDumbbellTricepsExtension),
21060            16 => Some(TricepsExtensionExerciseName::RecliningTricepsPress),
21061            17 => Some(TricepsExtensionExerciseName::ReverseGripPressdown),
21062            18 => Some(TricepsExtensionExerciseName::ReverseGripTricepsPressdown),
21063            19 => Some(TricepsExtensionExerciseName::RopePressdown),
21064            20 => Some(TricepsExtensionExerciseName::SeatedBarbellOverheadTricepsExtension),
21065            21 => Some(TricepsExtensionExerciseName::SeatedDumbbellOverheadTricepsExtension),
21066            22 => Some(TricepsExtensionExerciseName::SeatedEzBarOverheadTricepsExtension),
21067            23 => Some(TricepsExtensionExerciseName::SeatedSingleArmOverheadDumbbellExtension),
21068            24 => Some(TricepsExtensionExerciseName::SingleArmDumbbellOverheadTricepsExtension),
21069            25 => Some(TricepsExtensionExerciseName::SingleDumbbellSeatedOverheadTricepsExtension),
21070            26 => Some(TricepsExtensionExerciseName::SingleLegBenchDipAndKick),
21071            27 => Some(TricepsExtensionExerciseName::WeightedSingleLegBenchDipAndKick),
21072            28 => Some(TricepsExtensionExerciseName::SingleLegDip),
21073            29 => Some(TricepsExtensionExerciseName::WeightedSingleLegDip),
21074            30 => Some(TricepsExtensionExerciseName::StaticLyingTricepsExtension),
21075            31 => Some(TricepsExtensionExerciseName::SuspendedDip),
21076            32 => Some(TricepsExtensionExerciseName::WeightedSuspendedDip),
21077            33 => Some(TricepsExtensionExerciseName::SwissBallDumbbellLyingTricepsExtension),
21078            34 => Some(TricepsExtensionExerciseName::SwissBallEzBarLyingTricepsExtension),
21079            35 => Some(TricepsExtensionExerciseName::SwissBallEzBarOverheadTricepsExtension),
21080            36 => Some(TricepsExtensionExerciseName::TabletopDip),
21081            37 => Some(TricepsExtensionExerciseName::WeightedTabletopDip),
21082            38 => Some(TricepsExtensionExerciseName::TricepsExtensionOnFloor),
21083            39 => Some(TricepsExtensionExerciseName::TricepsPressdown),
21084            40 => Some(TricepsExtensionExerciseName::WeightedDip),
21085            41 => Some(TricepsExtensionExerciseName::AlternatingDumbbellLyingTricepsExtension),
21086            42 => Some(TricepsExtensionExerciseName::TricepsPress),
21087            43 => Some(TricepsExtensionExerciseName::DumbbellKickbackWheelchair),
21088            44 => Some(TricepsExtensionExerciseName::OverheadDumbbellTricepsExtensionWheelchair),
21089            _ => None,
21090        }
21091    }
21092
21093    /// Try to construct from the snake-case canonical name.
21094    pub fn from_str(name: &str) -> Option<Self> {
21095        match name {
21096            "bench_dip" => Some(TricepsExtensionExerciseName::BenchDip),
21097            "weighted_bench_dip" => Some(TricepsExtensionExerciseName::WeightedBenchDip),
21098            "body_weight_dip" => Some(TricepsExtensionExerciseName::BodyWeightDip),
21099            "cable_kickback" => Some(TricepsExtensionExerciseName::CableKickback),
21100            "cable_lying_triceps_extension" => {
21101                Some(TricepsExtensionExerciseName::CableLyingTricepsExtension)
21102            }
21103            "cable_overhead_triceps_extension" => {
21104                Some(TricepsExtensionExerciseName::CableOverheadTricepsExtension)
21105            }
21106            "dumbbell_kickback" => Some(TricepsExtensionExerciseName::DumbbellKickback),
21107            "dumbbell_lying_triceps_extension" => {
21108                Some(TricepsExtensionExerciseName::DumbbellLyingTricepsExtension)
21109            }
21110            "ez_bar_overhead_triceps_extension" => {
21111                Some(TricepsExtensionExerciseName::EzBarOverheadTricepsExtension)
21112            }
21113            "incline_dip" => Some(TricepsExtensionExerciseName::InclineDip),
21114            "weighted_incline_dip" => Some(TricepsExtensionExerciseName::WeightedInclineDip),
21115            "incline_ez_bar_lying_triceps_extension" => {
21116                Some(TricepsExtensionExerciseName::InclineEzBarLyingTricepsExtension)
21117            }
21118            "lying_dumbbell_pullover_to_extension" => {
21119                Some(TricepsExtensionExerciseName::LyingDumbbellPulloverToExtension)
21120            }
21121            "lying_ez_bar_triceps_extension" => {
21122                Some(TricepsExtensionExerciseName::LyingEzBarTricepsExtension)
21123            }
21124            "lying_triceps_extension_to_close_grip_bench_press" => {
21125                Some(TricepsExtensionExerciseName::LyingTricepsExtensionToCloseGripBenchPress)
21126            }
21127            "overhead_dumbbell_triceps_extension" => {
21128                Some(TricepsExtensionExerciseName::OverheadDumbbellTricepsExtension)
21129            }
21130            "reclining_triceps_press" => Some(TricepsExtensionExerciseName::RecliningTricepsPress),
21131            "reverse_grip_pressdown" => Some(TricepsExtensionExerciseName::ReverseGripPressdown),
21132            "reverse_grip_triceps_pressdown" => {
21133                Some(TricepsExtensionExerciseName::ReverseGripTricepsPressdown)
21134            }
21135            "rope_pressdown" => Some(TricepsExtensionExerciseName::RopePressdown),
21136            "seated_barbell_overhead_triceps_extension" => {
21137                Some(TricepsExtensionExerciseName::SeatedBarbellOverheadTricepsExtension)
21138            }
21139            "seated_dumbbell_overhead_triceps_extension" => {
21140                Some(TricepsExtensionExerciseName::SeatedDumbbellOverheadTricepsExtension)
21141            }
21142            "seated_ez_bar_overhead_triceps_extension" => {
21143                Some(TricepsExtensionExerciseName::SeatedEzBarOverheadTricepsExtension)
21144            }
21145            "seated_single_arm_overhead_dumbbell_extension" => {
21146                Some(TricepsExtensionExerciseName::SeatedSingleArmOverheadDumbbellExtension)
21147            }
21148            "single_arm_dumbbell_overhead_triceps_extension" => {
21149                Some(TricepsExtensionExerciseName::SingleArmDumbbellOverheadTricepsExtension)
21150            }
21151            "single_dumbbell_seated_overhead_triceps_extension" => {
21152                Some(TricepsExtensionExerciseName::SingleDumbbellSeatedOverheadTricepsExtension)
21153            }
21154            "single_leg_bench_dip_and_kick" => {
21155                Some(TricepsExtensionExerciseName::SingleLegBenchDipAndKick)
21156            }
21157            "weighted_single_leg_bench_dip_and_kick" => {
21158                Some(TricepsExtensionExerciseName::WeightedSingleLegBenchDipAndKick)
21159            }
21160            "single_leg_dip" => Some(TricepsExtensionExerciseName::SingleLegDip),
21161            "weighted_single_leg_dip" => Some(TricepsExtensionExerciseName::WeightedSingleLegDip),
21162            "static_lying_triceps_extension" => {
21163                Some(TricepsExtensionExerciseName::StaticLyingTricepsExtension)
21164            }
21165            "suspended_dip" => Some(TricepsExtensionExerciseName::SuspendedDip),
21166            "weighted_suspended_dip" => Some(TricepsExtensionExerciseName::WeightedSuspendedDip),
21167            "swiss_ball_dumbbell_lying_triceps_extension" => {
21168                Some(TricepsExtensionExerciseName::SwissBallDumbbellLyingTricepsExtension)
21169            }
21170            "swiss_ball_ez_bar_lying_triceps_extension" => {
21171                Some(TricepsExtensionExerciseName::SwissBallEzBarLyingTricepsExtension)
21172            }
21173            "swiss_ball_ez_bar_overhead_triceps_extension" => {
21174                Some(TricepsExtensionExerciseName::SwissBallEzBarOverheadTricepsExtension)
21175            }
21176            "tabletop_dip" => Some(TricepsExtensionExerciseName::TabletopDip),
21177            "weighted_tabletop_dip" => Some(TricepsExtensionExerciseName::WeightedTabletopDip),
21178            "triceps_extension_on_floor" => {
21179                Some(TricepsExtensionExerciseName::TricepsExtensionOnFloor)
21180            }
21181            "triceps_pressdown" => Some(TricepsExtensionExerciseName::TricepsPressdown),
21182            "weighted_dip" => Some(TricepsExtensionExerciseName::WeightedDip),
21183            "alternating_dumbbell_lying_triceps_extension" => {
21184                Some(TricepsExtensionExerciseName::AlternatingDumbbellLyingTricepsExtension)
21185            }
21186            "triceps_press" => Some(TricepsExtensionExerciseName::TricepsPress),
21187            "dumbbell_kickback_wheelchair" => {
21188                Some(TricepsExtensionExerciseName::DumbbellKickbackWheelchair)
21189            }
21190            "overhead_dumbbell_triceps_extension_wheelchair" => {
21191                Some(TricepsExtensionExerciseName::OverheadDumbbellTricepsExtensionWheelchair)
21192            }
21193            _ => None,
21194        }
21195    }
21196}
21197
21198#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
21199#[repr(u16)]
21200#[non_exhaustive]
21201pub enum WarmUpExerciseName {
21202    QuadrupedRocking = 0,
21203    NeckTilts = 1,
21204    AnkleCircles = 2,
21205    AnkleDorsiflexionWithBand = 3,
21206    AnkleInternalRotation = 4,
21207    ArmCircles = 5,
21208    BentOverReachToSky = 6,
21209    CatCamel = 7,
21210    ElbowToFootLunge = 8,
21211    ForwardAndBackwardLegSwings = 9,
21212    Groiners = 10,
21213    InvertedHamstringStretch = 11,
21214    LateralDuckUnder = 12,
21215    NeckRotations = 13,
21216    OppositeArmAndLegBalance = 14,
21217    ReachRollAndLift = 15,
21218    Scorpion = 16,
21219    ShoulderCircles = 17,
21220    SideToSideLegSwings = 18,
21221    SleeperStretch = 19,
21222    SlideOut = 20,
21223    SwissBallHipCrossover = 21,
21224    SwissBallReachRollAndLift = 22,
21225    SwissBallWindshieldWipers = 23,
21226    ThoracicRotation = 24,
21227    WalkingHighKicks = 25,
21228    WalkingHighKnees = 26,
21229    WalkingKneeHugs = 27,
21230    WalkingLegCradles = 28,
21231    Walkout = 29,
21232    WalkoutFromPushUpPosition = 30,
21233    BicepsStretch = 31,
21234    GlutesStretch = 32,
21235    StandingHamstringStretch = 33,
21236    Stretch9090 = 34,
21237    StretchAbs = 35,
21238    StretchButterfly = 36,
21239    StretchCalf = 37,
21240    StretchCatCow = 38,
21241    StretchChildsPose = 39,
21242    StretchCobra = 40,
21243    StretchForearms = 41,
21244    StretchForwardGlutes = 42,
21245    StretchFrontSplit = 43,
21246    StretchHamstring = 44,
21247    StretchHipFlexorAndQuad = 45,
21248    StretchLat = 46,
21249    StretchLevatorScapulae = 47,
21250    StretchLungeWithSpinalTwist = 48,
21251    StretchLungingHipFlexor = 49,
21252    StretchLyingAbduction = 50,
21253    StretchLyingItBand = 51,
21254    StretchLyingKneeToChest = 52,
21255    StretchLyingPiriformis = 53,
21256    StretchLyingSpinalTwist = 54,
21257    StretchNeck = 55,
21258    StretchObliques = 56,
21259    StretchOverUnderShoulder = 57,
21260    StretchPectoral = 58,
21261    StretchPigeonPose = 59,
21262    StretchPiriformis = 60,
21263    StretchQuad = 61,
21264    StretchScorpion = 62,
21265    StretchShoulder = 63,
21266    StretchSide = 64,
21267    StretchSideLunge = 65,
21268    StretchSideSplit = 66,
21269    StretchStandingItBand = 67,
21270    StretchStraddle = 68,
21271    StretchTriceps = 69,
21272    StretchWallChestAndShoulder = 70,
21273    NeckRotationsWheelchair = 71,
21274    HalfKneelingArmRotation = 72,
21275    ThreeWayAnkleMobilization = 73,
21276    NinetyNinetyHipSwitch = 74,
21277    ActiveFrog = 75,
21278    ShoulderSweeps = 76,
21279    AnkleLunges = 77,
21280    BackRollFoamRoller = 78,
21281    BearCrawl = 79,
21282    LatissimusDorsiFoamRoll = 80,
21283    ReverseTHipOpener = 81,
21284    ShoulderRolls = 82,
21285    ChestOpeners = 83,
21286    TricepsStretch = 84,
21287    UpperBackStretch = 85,
21288    HipCircles = 86,
21289    AnkleStretch = 87,
21290    MarchingInPlace = 88,
21291    TricepsStretchWheelchair = 89,
21292    UpperBackStretchWheelchair = 90,
21293}
21294
21295impl WarmUpExerciseName {
21296    /// Snake-case canonical name from Profile.xlsx.
21297    pub fn as_str(&self) -> &'static str {
21298        match self {
21299            WarmUpExerciseName::QuadrupedRocking => "quadruped_rocking",
21300            WarmUpExerciseName::NeckTilts => "neck_tilts",
21301            WarmUpExerciseName::AnkleCircles => "ankle_circles",
21302            WarmUpExerciseName::AnkleDorsiflexionWithBand => "ankle_dorsiflexion_with_band",
21303            WarmUpExerciseName::AnkleInternalRotation => "ankle_internal_rotation",
21304            WarmUpExerciseName::ArmCircles => "arm_circles",
21305            WarmUpExerciseName::BentOverReachToSky => "bent_over_reach_to_sky",
21306            WarmUpExerciseName::CatCamel => "cat_camel",
21307            WarmUpExerciseName::ElbowToFootLunge => "elbow_to_foot_lunge",
21308            WarmUpExerciseName::ForwardAndBackwardLegSwings => "forward_and_backward_leg_swings",
21309            WarmUpExerciseName::Groiners => "groiners",
21310            WarmUpExerciseName::InvertedHamstringStretch => "inverted_hamstring_stretch",
21311            WarmUpExerciseName::LateralDuckUnder => "lateral_duck_under",
21312            WarmUpExerciseName::NeckRotations => "neck_rotations",
21313            WarmUpExerciseName::OppositeArmAndLegBalance => "opposite_arm_and_leg_balance",
21314            WarmUpExerciseName::ReachRollAndLift => "reach_roll_and_lift",
21315            WarmUpExerciseName::Scorpion => "scorpion",
21316            WarmUpExerciseName::ShoulderCircles => "shoulder_circles",
21317            WarmUpExerciseName::SideToSideLegSwings => "side_to_side_leg_swings",
21318            WarmUpExerciseName::SleeperStretch => "sleeper_stretch",
21319            WarmUpExerciseName::SlideOut => "slide_out",
21320            WarmUpExerciseName::SwissBallHipCrossover => "swiss_ball_hip_crossover",
21321            WarmUpExerciseName::SwissBallReachRollAndLift => "swiss_ball_reach_roll_and_lift",
21322            WarmUpExerciseName::SwissBallWindshieldWipers => "swiss_ball_windshield_wipers",
21323            WarmUpExerciseName::ThoracicRotation => "thoracic_rotation",
21324            WarmUpExerciseName::WalkingHighKicks => "walking_high_kicks",
21325            WarmUpExerciseName::WalkingHighKnees => "walking_high_knees",
21326            WarmUpExerciseName::WalkingKneeHugs => "walking_knee_hugs",
21327            WarmUpExerciseName::WalkingLegCradles => "walking_leg_cradles",
21328            WarmUpExerciseName::Walkout => "walkout",
21329            WarmUpExerciseName::WalkoutFromPushUpPosition => "walkout_from_push_up_position",
21330            WarmUpExerciseName::BicepsStretch => "biceps_stretch",
21331            WarmUpExerciseName::GlutesStretch => "glutes_stretch",
21332            WarmUpExerciseName::StandingHamstringStretch => "standing_hamstring_stretch",
21333            WarmUpExerciseName::Stretch9090 => "stretch_90_90",
21334            WarmUpExerciseName::StretchAbs => "stretch_abs",
21335            WarmUpExerciseName::StretchButterfly => "stretch_butterfly",
21336            WarmUpExerciseName::StretchCalf => "stretch_calf",
21337            WarmUpExerciseName::StretchCatCow => "stretch_cat_cow",
21338            WarmUpExerciseName::StretchChildsPose => "stretch_childs_pose",
21339            WarmUpExerciseName::StretchCobra => "stretch_cobra",
21340            WarmUpExerciseName::StretchForearms => "stretch_forearms",
21341            WarmUpExerciseName::StretchForwardGlutes => "stretch_forward_glutes",
21342            WarmUpExerciseName::StretchFrontSplit => "stretch_front_split",
21343            WarmUpExerciseName::StretchHamstring => "stretch_hamstring",
21344            WarmUpExerciseName::StretchHipFlexorAndQuad => "stretch_hip_flexor_and_quad",
21345            WarmUpExerciseName::StretchLat => "stretch_lat",
21346            WarmUpExerciseName::StretchLevatorScapulae => "stretch_levator_scapulae",
21347            WarmUpExerciseName::StretchLungeWithSpinalTwist => "stretch_lunge_with_spinal_twist",
21348            WarmUpExerciseName::StretchLungingHipFlexor => "stretch_lunging_hip_flexor",
21349            WarmUpExerciseName::StretchLyingAbduction => "stretch_lying_abduction",
21350            WarmUpExerciseName::StretchLyingItBand => "stretch_lying_it_band",
21351            WarmUpExerciseName::StretchLyingKneeToChest => "stretch_lying_knee_to_chest",
21352            WarmUpExerciseName::StretchLyingPiriformis => "stretch_lying_piriformis",
21353            WarmUpExerciseName::StretchLyingSpinalTwist => "stretch_lying_spinal_twist",
21354            WarmUpExerciseName::StretchNeck => "stretch_neck",
21355            WarmUpExerciseName::StretchObliques => "stretch_obliques",
21356            WarmUpExerciseName::StretchOverUnderShoulder => "stretch_over_under_shoulder",
21357            WarmUpExerciseName::StretchPectoral => "stretch_pectoral",
21358            WarmUpExerciseName::StretchPigeonPose => "stretch_pigeon_pose",
21359            WarmUpExerciseName::StretchPiriformis => "stretch_piriformis",
21360            WarmUpExerciseName::StretchQuad => "stretch_quad",
21361            WarmUpExerciseName::StretchScorpion => "stretch_scorpion",
21362            WarmUpExerciseName::StretchShoulder => "stretch_shoulder",
21363            WarmUpExerciseName::StretchSide => "stretch_side",
21364            WarmUpExerciseName::StretchSideLunge => "stretch_side_lunge",
21365            WarmUpExerciseName::StretchSideSplit => "stretch_side_split",
21366            WarmUpExerciseName::StretchStandingItBand => "stretch_standing_it_band",
21367            WarmUpExerciseName::StretchStraddle => "stretch_straddle",
21368            WarmUpExerciseName::StretchTriceps => "stretch_triceps",
21369            WarmUpExerciseName::StretchWallChestAndShoulder => "stretch_wall_chest_and_shoulder",
21370            WarmUpExerciseName::NeckRotationsWheelchair => "neck_rotations_wheelchair",
21371            WarmUpExerciseName::HalfKneelingArmRotation => "half_kneeling_arm_rotation",
21372            WarmUpExerciseName::ThreeWayAnkleMobilization => "three_way_ankle_mobilization",
21373            WarmUpExerciseName::NinetyNinetyHipSwitch => "ninety_ninety_hip_switch",
21374            WarmUpExerciseName::ActiveFrog => "active_frog",
21375            WarmUpExerciseName::ShoulderSweeps => "shoulder_sweeps",
21376            WarmUpExerciseName::AnkleLunges => "ankle_lunges",
21377            WarmUpExerciseName::BackRollFoamRoller => "back_roll_foam_roller",
21378            WarmUpExerciseName::BearCrawl => "bear_crawl",
21379            WarmUpExerciseName::LatissimusDorsiFoamRoll => "latissimus_dorsi_foam_roll",
21380            WarmUpExerciseName::ReverseTHipOpener => "reverse_t_hip_opener",
21381            WarmUpExerciseName::ShoulderRolls => "shoulder_rolls",
21382            WarmUpExerciseName::ChestOpeners => "chest_openers",
21383            WarmUpExerciseName::TricepsStretch => "triceps_stretch",
21384            WarmUpExerciseName::UpperBackStretch => "upper_back_stretch",
21385            WarmUpExerciseName::HipCircles => "hip_circles",
21386            WarmUpExerciseName::AnkleStretch => "ankle_stretch",
21387            WarmUpExerciseName::MarchingInPlace => "marching_in_place",
21388            WarmUpExerciseName::TricepsStretchWheelchair => "triceps_stretch_wheelchair",
21389            WarmUpExerciseName::UpperBackStretchWheelchair => "upper_back_stretch_wheelchair",
21390        }
21391    }
21392
21393    /// Try to construct from the underlying numeric value.
21394    pub fn from_value(value: u16) -> Option<Self> {
21395        match value {
21396            0 => Some(WarmUpExerciseName::QuadrupedRocking),
21397            1 => Some(WarmUpExerciseName::NeckTilts),
21398            2 => Some(WarmUpExerciseName::AnkleCircles),
21399            3 => Some(WarmUpExerciseName::AnkleDorsiflexionWithBand),
21400            4 => Some(WarmUpExerciseName::AnkleInternalRotation),
21401            5 => Some(WarmUpExerciseName::ArmCircles),
21402            6 => Some(WarmUpExerciseName::BentOverReachToSky),
21403            7 => Some(WarmUpExerciseName::CatCamel),
21404            8 => Some(WarmUpExerciseName::ElbowToFootLunge),
21405            9 => Some(WarmUpExerciseName::ForwardAndBackwardLegSwings),
21406            10 => Some(WarmUpExerciseName::Groiners),
21407            11 => Some(WarmUpExerciseName::InvertedHamstringStretch),
21408            12 => Some(WarmUpExerciseName::LateralDuckUnder),
21409            13 => Some(WarmUpExerciseName::NeckRotations),
21410            14 => Some(WarmUpExerciseName::OppositeArmAndLegBalance),
21411            15 => Some(WarmUpExerciseName::ReachRollAndLift),
21412            16 => Some(WarmUpExerciseName::Scorpion),
21413            17 => Some(WarmUpExerciseName::ShoulderCircles),
21414            18 => Some(WarmUpExerciseName::SideToSideLegSwings),
21415            19 => Some(WarmUpExerciseName::SleeperStretch),
21416            20 => Some(WarmUpExerciseName::SlideOut),
21417            21 => Some(WarmUpExerciseName::SwissBallHipCrossover),
21418            22 => Some(WarmUpExerciseName::SwissBallReachRollAndLift),
21419            23 => Some(WarmUpExerciseName::SwissBallWindshieldWipers),
21420            24 => Some(WarmUpExerciseName::ThoracicRotation),
21421            25 => Some(WarmUpExerciseName::WalkingHighKicks),
21422            26 => Some(WarmUpExerciseName::WalkingHighKnees),
21423            27 => Some(WarmUpExerciseName::WalkingKneeHugs),
21424            28 => Some(WarmUpExerciseName::WalkingLegCradles),
21425            29 => Some(WarmUpExerciseName::Walkout),
21426            30 => Some(WarmUpExerciseName::WalkoutFromPushUpPosition),
21427            31 => Some(WarmUpExerciseName::BicepsStretch),
21428            32 => Some(WarmUpExerciseName::GlutesStretch),
21429            33 => Some(WarmUpExerciseName::StandingHamstringStretch),
21430            34 => Some(WarmUpExerciseName::Stretch9090),
21431            35 => Some(WarmUpExerciseName::StretchAbs),
21432            36 => Some(WarmUpExerciseName::StretchButterfly),
21433            37 => Some(WarmUpExerciseName::StretchCalf),
21434            38 => Some(WarmUpExerciseName::StretchCatCow),
21435            39 => Some(WarmUpExerciseName::StretchChildsPose),
21436            40 => Some(WarmUpExerciseName::StretchCobra),
21437            41 => Some(WarmUpExerciseName::StretchForearms),
21438            42 => Some(WarmUpExerciseName::StretchForwardGlutes),
21439            43 => Some(WarmUpExerciseName::StretchFrontSplit),
21440            44 => Some(WarmUpExerciseName::StretchHamstring),
21441            45 => Some(WarmUpExerciseName::StretchHipFlexorAndQuad),
21442            46 => Some(WarmUpExerciseName::StretchLat),
21443            47 => Some(WarmUpExerciseName::StretchLevatorScapulae),
21444            48 => Some(WarmUpExerciseName::StretchLungeWithSpinalTwist),
21445            49 => Some(WarmUpExerciseName::StretchLungingHipFlexor),
21446            50 => Some(WarmUpExerciseName::StretchLyingAbduction),
21447            51 => Some(WarmUpExerciseName::StretchLyingItBand),
21448            52 => Some(WarmUpExerciseName::StretchLyingKneeToChest),
21449            53 => Some(WarmUpExerciseName::StretchLyingPiriformis),
21450            54 => Some(WarmUpExerciseName::StretchLyingSpinalTwist),
21451            55 => Some(WarmUpExerciseName::StretchNeck),
21452            56 => Some(WarmUpExerciseName::StretchObliques),
21453            57 => Some(WarmUpExerciseName::StretchOverUnderShoulder),
21454            58 => Some(WarmUpExerciseName::StretchPectoral),
21455            59 => Some(WarmUpExerciseName::StretchPigeonPose),
21456            60 => Some(WarmUpExerciseName::StretchPiriformis),
21457            61 => Some(WarmUpExerciseName::StretchQuad),
21458            62 => Some(WarmUpExerciseName::StretchScorpion),
21459            63 => Some(WarmUpExerciseName::StretchShoulder),
21460            64 => Some(WarmUpExerciseName::StretchSide),
21461            65 => Some(WarmUpExerciseName::StretchSideLunge),
21462            66 => Some(WarmUpExerciseName::StretchSideSplit),
21463            67 => Some(WarmUpExerciseName::StretchStandingItBand),
21464            68 => Some(WarmUpExerciseName::StretchStraddle),
21465            69 => Some(WarmUpExerciseName::StretchTriceps),
21466            70 => Some(WarmUpExerciseName::StretchWallChestAndShoulder),
21467            71 => Some(WarmUpExerciseName::NeckRotationsWheelchair),
21468            72 => Some(WarmUpExerciseName::HalfKneelingArmRotation),
21469            73 => Some(WarmUpExerciseName::ThreeWayAnkleMobilization),
21470            74 => Some(WarmUpExerciseName::NinetyNinetyHipSwitch),
21471            75 => Some(WarmUpExerciseName::ActiveFrog),
21472            76 => Some(WarmUpExerciseName::ShoulderSweeps),
21473            77 => Some(WarmUpExerciseName::AnkleLunges),
21474            78 => Some(WarmUpExerciseName::BackRollFoamRoller),
21475            79 => Some(WarmUpExerciseName::BearCrawl),
21476            80 => Some(WarmUpExerciseName::LatissimusDorsiFoamRoll),
21477            81 => Some(WarmUpExerciseName::ReverseTHipOpener),
21478            82 => Some(WarmUpExerciseName::ShoulderRolls),
21479            83 => Some(WarmUpExerciseName::ChestOpeners),
21480            84 => Some(WarmUpExerciseName::TricepsStretch),
21481            85 => Some(WarmUpExerciseName::UpperBackStretch),
21482            86 => Some(WarmUpExerciseName::HipCircles),
21483            87 => Some(WarmUpExerciseName::AnkleStretch),
21484            88 => Some(WarmUpExerciseName::MarchingInPlace),
21485            89 => Some(WarmUpExerciseName::TricepsStretchWheelchair),
21486            90 => Some(WarmUpExerciseName::UpperBackStretchWheelchair),
21487            _ => None,
21488        }
21489    }
21490
21491    /// Try to construct from the snake-case canonical name.
21492    pub fn from_str(name: &str) -> Option<Self> {
21493        match name {
21494            "quadruped_rocking" => Some(WarmUpExerciseName::QuadrupedRocking),
21495            "neck_tilts" => Some(WarmUpExerciseName::NeckTilts),
21496            "ankle_circles" => Some(WarmUpExerciseName::AnkleCircles),
21497            "ankle_dorsiflexion_with_band" => Some(WarmUpExerciseName::AnkleDorsiflexionWithBand),
21498            "ankle_internal_rotation" => Some(WarmUpExerciseName::AnkleInternalRotation),
21499            "arm_circles" => Some(WarmUpExerciseName::ArmCircles),
21500            "bent_over_reach_to_sky" => Some(WarmUpExerciseName::BentOverReachToSky),
21501            "cat_camel" => Some(WarmUpExerciseName::CatCamel),
21502            "elbow_to_foot_lunge" => Some(WarmUpExerciseName::ElbowToFootLunge),
21503            "forward_and_backward_leg_swings" => {
21504                Some(WarmUpExerciseName::ForwardAndBackwardLegSwings)
21505            }
21506            "groiners" => Some(WarmUpExerciseName::Groiners),
21507            "inverted_hamstring_stretch" => Some(WarmUpExerciseName::InvertedHamstringStretch),
21508            "lateral_duck_under" => Some(WarmUpExerciseName::LateralDuckUnder),
21509            "neck_rotations" => Some(WarmUpExerciseName::NeckRotations),
21510            "opposite_arm_and_leg_balance" => Some(WarmUpExerciseName::OppositeArmAndLegBalance),
21511            "reach_roll_and_lift" => Some(WarmUpExerciseName::ReachRollAndLift),
21512            "scorpion" => Some(WarmUpExerciseName::Scorpion),
21513            "shoulder_circles" => Some(WarmUpExerciseName::ShoulderCircles),
21514            "side_to_side_leg_swings" => Some(WarmUpExerciseName::SideToSideLegSwings),
21515            "sleeper_stretch" => Some(WarmUpExerciseName::SleeperStretch),
21516            "slide_out" => Some(WarmUpExerciseName::SlideOut),
21517            "swiss_ball_hip_crossover" => Some(WarmUpExerciseName::SwissBallHipCrossover),
21518            "swiss_ball_reach_roll_and_lift" => Some(WarmUpExerciseName::SwissBallReachRollAndLift),
21519            "swiss_ball_windshield_wipers" => Some(WarmUpExerciseName::SwissBallWindshieldWipers),
21520            "thoracic_rotation" => Some(WarmUpExerciseName::ThoracicRotation),
21521            "walking_high_kicks" => Some(WarmUpExerciseName::WalkingHighKicks),
21522            "walking_high_knees" => Some(WarmUpExerciseName::WalkingHighKnees),
21523            "walking_knee_hugs" => Some(WarmUpExerciseName::WalkingKneeHugs),
21524            "walking_leg_cradles" => Some(WarmUpExerciseName::WalkingLegCradles),
21525            "walkout" => Some(WarmUpExerciseName::Walkout),
21526            "walkout_from_push_up_position" => Some(WarmUpExerciseName::WalkoutFromPushUpPosition),
21527            "biceps_stretch" => Some(WarmUpExerciseName::BicepsStretch),
21528            "glutes_stretch" => Some(WarmUpExerciseName::GlutesStretch),
21529            "standing_hamstring_stretch" => Some(WarmUpExerciseName::StandingHamstringStretch),
21530            "stretch_90_90" => Some(WarmUpExerciseName::Stretch9090),
21531            "stretch_abs" => Some(WarmUpExerciseName::StretchAbs),
21532            "stretch_butterfly" => Some(WarmUpExerciseName::StretchButterfly),
21533            "stretch_calf" => Some(WarmUpExerciseName::StretchCalf),
21534            "stretch_cat_cow" => Some(WarmUpExerciseName::StretchCatCow),
21535            "stretch_childs_pose" => Some(WarmUpExerciseName::StretchChildsPose),
21536            "stretch_cobra" => Some(WarmUpExerciseName::StretchCobra),
21537            "stretch_forearms" => Some(WarmUpExerciseName::StretchForearms),
21538            "stretch_forward_glutes" => Some(WarmUpExerciseName::StretchForwardGlutes),
21539            "stretch_front_split" => Some(WarmUpExerciseName::StretchFrontSplit),
21540            "stretch_hamstring" => Some(WarmUpExerciseName::StretchHamstring),
21541            "stretch_hip_flexor_and_quad" => Some(WarmUpExerciseName::StretchHipFlexorAndQuad),
21542            "stretch_lat" => Some(WarmUpExerciseName::StretchLat),
21543            "stretch_levator_scapulae" => Some(WarmUpExerciseName::StretchLevatorScapulae),
21544            "stretch_lunge_with_spinal_twist" => {
21545                Some(WarmUpExerciseName::StretchLungeWithSpinalTwist)
21546            }
21547            "stretch_lunging_hip_flexor" => Some(WarmUpExerciseName::StretchLungingHipFlexor),
21548            "stretch_lying_abduction" => Some(WarmUpExerciseName::StretchLyingAbduction),
21549            "stretch_lying_it_band" => Some(WarmUpExerciseName::StretchLyingItBand),
21550            "stretch_lying_knee_to_chest" => Some(WarmUpExerciseName::StretchLyingKneeToChest),
21551            "stretch_lying_piriformis" => Some(WarmUpExerciseName::StretchLyingPiriformis),
21552            "stretch_lying_spinal_twist" => Some(WarmUpExerciseName::StretchLyingSpinalTwist),
21553            "stretch_neck" => Some(WarmUpExerciseName::StretchNeck),
21554            "stretch_obliques" => Some(WarmUpExerciseName::StretchObliques),
21555            "stretch_over_under_shoulder" => Some(WarmUpExerciseName::StretchOverUnderShoulder),
21556            "stretch_pectoral" => Some(WarmUpExerciseName::StretchPectoral),
21557            "stretch_pigeon_pose" => Some(WarmUpExerciseName::StretchPigeonPose),
21558            "stretch_piriformis" => Some(WarmUpExerciseName::StretchPiriformis),
21559            "stretch_quad" => Some(WarmUpExerciseName::StretchQuad),
21560            "stretch_scorpion" => Some(WarmUpExerciseName::StretchScorpion),
21561            "stretch_shoulder" => Some(WarmUpExerciseName::StretchShoulder),
21562            "stretch_side" => Some(WarmUpExerciseName::StretchSide),
21563            "stretch_side_lunge" => Some(WarmUpExerciseName::StretchSideLunge),
21564            "stretch_side_split" => Some(WarmUpExerciseName::StretchSideSplit),
21565            "stretch_standing_it_band" => Some(WarmUpExerciseName::StretchStandingItBand),
21566            "stretch_straddle" => Some(WarmUpExerciseName::StretchStraddle),
21567            "stretch_triceps" => Some(WarmUpExerciseName::StretchTriceps),
21568            "stretch_wall_chest_and_shoulder" => {
21569                Some(WarmUpExerciseName::StretchWallChestAndShoulder)
21570            }
21571            "neck_rotations_wheelchair" => Some(WarmUpExerciseName::NeckRotationsWheelchair),
21572            "half_kneeling_arm_rotation" => Some(WarmUpExerciseName::HalfKneelingArmRotation),
21573            "three_way_ankle_mobilization" => Some(WarmUpExerciseName::ThreeWayAnkleMobilization),
21574            "ninety_ninety_hip_switch" => Some(WarmUpExerciseName::NinetyNinetyHipSwitch),
21575            "active_frog" => Some(WarmUpExerciseName::ActiveFrog),
21576            "shoulder_sweeps" => Some(WarmUpExerciseName::ShoulderSweeps),
21577            "ankle_lunges" => Some(WarmUpExerciseName::AnkleLunges),
21578            "back_roll_foam_roller" => Some(WarmUpExerciseName::BackRollFoamRoller),
21579            "bear_crawl" => Some(WarmUpExerciseName::BearCrawl),
21580            "latissimus_dorsi_foam_roll" => Some(WarmUpExerciseName::LatissimusDorsiFoamRoll),
21581            "reverse_t_hip_opener" => Some(WarmUpExerciseName::ReverseTHipOpener),
21582            "shoulder_rolls" => Some(WarmUpExerciseName::ShoulderRolls),
21583            "chest_openers" => Some(WarmUpExerciseName::ChestOpeners),
21584            "triceps_stretch" => Some(WarmUpExerciseName::TricepsStretch),
21585            "upper_back_stretch" => Some(WarmUpExerciseName::UpperBackStretch),
21586            "hip_circles" => Some(WarmUpExerciseName::HipCircles),
21587            "ankle_stretch" => Some(WarmUpExerciseName::AnkleStretch),
21588            "marching_in_place" => Some(WarmUpExerciseName::MarchingInPlace),
21589            "triceps_stretch_wheelchair" => Some(WarmUpExerciseName::TricepsStretchWheelchair),
21590            "upper_back_stretch_wheelchair" => Some(WarmUpExerciseName::UpperBackStretchWheelchair),
21591            _ => None,
21592        }
21593    }
21594}
21595
21596#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
21597#[repr(u16)]
21598#[non_exhaustive]
21599pub enum RunExerciseName {
21600    Run = 0,
21601    Walk = 1,
21602    Jog = 2,
21603    Sprint = 3,
21604    RunOrWalk = 4,
21605    SpeedWalk = 5,
21606    WarmUp = 6,
21607}
21608
21609impl RunExerciseName {
21610    /// Snake-case canonical name from Profile.xlsx.
21611    pub fn as_str(&self) -> &'static str {
21612        match self {
21613            RunExerciseName::Run => "run",
21614            RunExerciseName::Walk => "walk",
21615            RunExerciseName::Jog => "jog",
21616            RunExerciseName::Sprint => "sprint",
21617            RunExerciseName::RunOrWalk => "run_or_walk",
21618            RunExerciseName::SpeedWalk => "speed_walk",
21619            RunExerciseName::WarmUp => "warm_up",
21620        }
21621    }
21622
21623    /// Try to construct from the underlying numeric value.
21624    pub fn from_value(value: u16) -> Option<Self> {
21625        match value {
21626            0 => Some(RunExerciseName::Run),
21627            1 => Some(RunExerciseName::Walk),
21628            2 => Some(RunExerciseName::Jog),
21629            3 => Some(RunExerciseName::Sprint),
21630            4 => Some(RunExerciseName::RunOrWalk),
21631            5 => Some(RunExerciseName::SpeedWalk),
21632            6 => Some(RunExerciseName::WarmUp),
21633            _ => None,
21634        }
21635    }
21636
21637    /// Try to construct from the snake-case canonical name.
21638    pub fn from_str(name: &str) -> Option<Self> {
21639        match name {
21640            "run" => Some(RunExerciseName::Run),
21641            "walk" => Some(RunExerciseName::Walk),
21642            "jog" => Some(RunExerciseName::Jog),
21643            "sprint" => Some(RunExerciseName::Sprint),
21644            "run_or_walk" => Some(RunExerciseName::RunOrWalk),
21645            "speed_walk" => Some(RunExerciseName::SpeedWalk),
21646            "warm_up" => Some(RunExerciseName::WarmUp),
21647            _ => None,
21648        }
21649    }
21650}
21651
21652#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
21653#[repr(u16)]
21654#[non_exhaustive]
21655pub enum BikeExerciseName {
21656    Bike = 0,
21657    Ride = 1,
21658    Sprint = 2,
21659}
21660
21661impl BikeExerciseName {
21662    /// Snake-case canonical name from Profile.xlsx.
21663    pub fn as_str(&self) -> &'static str {
21664        match self {
21665            BikeExerciseName::Bike => "bike",
21666            BikeExerciseName::Ride => "ride",
21667            BikeExerciseName::Sprint => "sprint",
21668        }
21669    }
21670
21671    /// Try to construct from the underlying numeric value.
21672    pub fn from_value(value: u16) -> Option<Self> {
21673        match value {
21674            0 => Some(BikeExerciseName::Bike),
21675            1 => Some(BikeExerciseName::Ride),
21676            2 => Some(BikeExerciseName::Sprint),
21677            _ => None,
21678        }
21679    }
21680
21681    /// Try to construct from the snake-case canonical name.
21682    pub fn from_str(name: &str) -> Option<Self> {
21683        match name {
21684            "bike" => Some(BikeExerciseName::Bike),
21685            "ride" => Some(BikeExerciseName::Ride),
21686            "sprint" => Some(BikeExerciseName::Sprint),
21687            _ => None,
21688        }
21689    }
21690}
21691
21692#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
21693#[repr(u16)]
21694#[non_exhaustive]
21695pub enum BandedExercisesExerciseName {
21696    AbTwist = 1,
21697    BackExtension = 2,
21698    BicycleCrunch = 3,
21699    CalfRaises = 4,
21700    ChestPress = 5,
21701    ClamShells = 6,
21702    Curl = 7,
21703    Deadbug = 8,
21704    Deadlift = 9,
21705    DonkeyKick = 10,
21706    ExternalRotation = 11,
21707    ExternalRotationAt90DegreeAbduction = 12,
21708    FacePull = 13,
21709    FireHydrant = 14,
21710    Fly = 15,
21711    FrontRaise = 16,
21712    GluteBridge = 17,
21713    HamstringCurls = 18,
21714    HighPlankLegLifts = 19,
21715    HipExtension = 20,
21716    InternalRotation = 21,
21717    JumpingJack = 22,
21718    KneelingCrunch = 23,
21719    LateralBandWalks = 24,
21720    LateralRaise = 25,
21721    Latpull = 26,
21722    LegAbduction = 27,
21723    LegAdduction = 28,
21724    LegExtension = 29,
21725    Lunge = 30,
21726    Plank = 31,
21727    PullApart = 32,
21728    PushUps = 33,
21729    ReverseCrunch = 34,
21730    Row = 35,
21731    ShoulderAbduction = 36,
21732    ShoulderExtension = 37,
21733    ShoulderExternalRotation = 38,
21734    ShoulderFlexionTo90Degrees = 39,
21735    SidePlankLegLifts = 40,
21736    SideRaise = 41,
21737    Squat = 42,
21738    SquatToPress = 43,
21739    TricepExtension = 44,
21740    TricepKickback = 45,
21741    UprightRow = 46,
21742    WallCrawlWithExternalRotation = 47,
21743    LateralRaiseWheelchair = 49,
21744    TricepsExtensionWheelchair = 50,
21745    ChestFlyInclineWheelchair = 51,
21746    ChestFlyDeclineWheelchair = 52,
21747    PullDownWheelchair = 53,
21748    StraightArmPullDownWheelchair = 54,
21749    CurlWheelchair = 55,
21750    OverheadCurlWheelchair = 56,
21751    FacePullWheelchair = 57,
21752    AroundTheWorldWheelchair = 58,
21753    PullApartWheelchair = 59,
21754    SideCurlWheelchair = 60,
21755    OverheadPressWheelchair = 61,
21756}
21757
21758impl BandedExercisesExerciseName {
21759    /// Snake-case canonical name from Profile.xlsx.
21760    pub fn as_str(&self) -> &'static str {
21761        match self {
21762            BandedExercisesExerciseName::AbTwist => "ab_twist",
21763            BandedExercisesExerciseName::BackExtension => "back_extension",
21764            BandedExercisesExerciseName::BicycleCrunch => "bicycle_crunch",
21765            BandedExercisesExerciseName::CalfRaises => "calf_raises",
21766            BandedExercisesExerciseName::ChestPress => "chest_press",
21767            BandedExercisesExerciseName::ClamShells => "clam_shells",
21768            BandedExercisesExerciseName::Curl => "curl",
21769            BandedExercisesExerciseName::Deadbug => "deadbug",
21770            BandedExercisesExerciseName::Deadlift => "deadlift",
21771            BandedExercisesExerciseName::DonkeyKick => "donkey_kick",
21772            BandedExercisesExerciseName::ExternalRotation => "external_rotation",
21773            BandedExercisesExerciseName::ExternalRotationAt90DegreeAbduction => {
21774                "external_rotation_at_90_degree_abduction"
21775            }
21776            BandedExercisesExerciseName::FacePull => "face_pull",
21777            BandedExercisesExerciseName::FireHydrant => "fire_hydrant",
21778            BandedExercisesExerciseName::Fly => "fly",
21779            BandedExercisesExerciseName::FrontRaise => "front_raise",
21780            BandedExercisesExerciseName::GluteBridge => "glute_bridge",
21781            BandedExercisesExerciseName::HamstringCurls => "hamstring_curls",
21782            BandedExercisesExerciseName::HighPlankLegLifts => "high_plank_leg_lifts",
21783            BandedExercisesExerciseName::HipExtension => "hip_extension",
21784            BandedExercisesExerciseName::InternalRotation => "internal_rotation",
21785            BandedExercisesExerciseName::JumpingJack => "jumping_jack",
21786            BandedExercisesExerciseName::KneelingCrunch => "kneeling_crunch",
21787            BandedExercisesExerciseName::LateralBandWalks => "lateral_band_walks",
21788            BandedExercisesExerciseName::LateralRaise => "lateral_raise",
21789            BandedExercisesExerciseName::Latpull => "latpull",
21790            BandedExercisesExerciseName::LegAbduction => "leg_abduction",
21791            BandedExercisesExerciseName::LegAdduction => "leg_adduction",
21792            BandedExercisesExerciseName::LegExtension => "leg_extension",
21793            BandedExercisesExerciseName::Lunge => "lunge",
21794            BandedExercisesExerciseName::Plank => "plank",
21795            BandedExercisesExerciseName::PullApart => "pull_apart",
21796            BandedExercisesExerciseName::PushUps => "push_ups",
21797            BandedExercisesExerciseName::ReverseCrunch => "reverse_crunch",
21798            BandedExercisesExerciseName::Row => "row",
21799            BandedExercisesExerciseName::ShoulderAbduction => "shoulder_abduction",
21800            BandedExercisesExerciseName::ShoulderExtension => "shoulder_extension",
21801            BandedExercisesExerciseName::ShoulderExternalRotation => "shoulder_external_rotation",
21802            BandedExercisesExerciseName::ShoulderFlexionTo90Degrees => {
21803                "shoulder_flexion_to_90_degrees"
21804            }
21805            BandedExercisesExerciseName::SidePlankLegLifts => "side_plank_leg_lifts",
21806            BandedExercisesExerciseName::SideRaise => "side_raise",
21807            BandedExercisesExerciseName::Squat => "squat",
21808            BandedExercisesExerciseName::SquatToPress => "squat_to_press",
21809            BandedExercisesExerciseName::TricepExtension => "tricep_extension",
21810            BandedExercisesExerciseName::TricepKickback => "tricep_kickback",
21811            BandedExercisesExerciseName::UprightRow => "upright_row",
21812            BandedExercisesExerciseName::WallCrawlWithExternalRotation => {
21813                "wall_crawl_with_external_rotation"
21814            }
21815            BandedExercisesExerciseName::LateralRaiseWheelchair => "lateral_raise_wheelchair",
21816            BandedExercisesExerciseName::TricepsExtensionWheelchair => {
21817                "triceps_extension_wheelchair"
21818            }
21819            BandedExercisesExerciseName::ChestFlyInclineWheelchair => {
21820                "chest_fly_incline_wheelchair"
21821            }
21822            BandedExercisesExerciseName::ChestFlyDeclineWheelchair => {
21823                "chest_fly_decline_wheelchair"
21824            }
21825            BandedExercisesExerciseName::PullDownWheelchair => "pull_down_wheelchair",
21826            BandedExercisesExerciseName::StraightArmPullDownWheelchair => {
21827                "straight_arm_pull_down_wheelchair"
21828            }
21829            BandedExercisesExerciseName::CurlWheelchair => "curl_wheelchair",
21830            BandedExercisesExerciseName::OverheadCurlWheelchair => "overhead_curl_wheelchair",
21831            BandedExercisesExerciseName::FacePullWheelchair => "face_pull_wheelchair",
21832            BandedExercisesExerciseName::AroundTheWorldWheelchair => "around_the_world_wheelchair",
21833            BandedExercisesExerciseName::PullApartWheelchair => "pull_apart_wheelchair",
21834            BandedExercisesExerciseName::SideCurlWheelchair => "side_curl_wheelchair",
21835            BandedExercisesExerciseName::OverheadPressWheelchair => "overhead_press_wheelchair",
21836        }
21837    }
21838
21839    /// Try to construct from the underlying numeric value.
21840    pub fn from_value(value: u16) -> Option<Self> {
21841        match value {
21842            1 => Some(BandedExercisesExerciseName::AbTwist),
21843            2 => Some(BandedExercisesExerciseName::BackExtension),
21844            3 => Some(BandedExercisesExerciseName::BicycleCrunch),
21845            4 => Some(BandedExercisesExerciseName::CalfRaises),
21846            5 => Some(BandedExercisesExerciseName::ChestPress),
21847            6 => Some(BandedExercisesExerciseName::ClamShells),
21848            7 => Some(BandedExercisesExerciseName::Curl),
21849            8 => Some(BandedExercisesExerciseName::Deadbug),
21850            9 => Some(BandedExercisesExerciseName::Deadlift),
21851            10 => Some(BandedExercisesExerciseName::DonkeyKick),
21852            11 => Some(BandedExercisesExerciseName::ExternalRotation),
21853            12 => Some(BandedExercisesExerciseName::ExternalRotationAt90DegreeAbduction),
21854            13 => Some(BandedExercisesExerciseName::FacePull),
21855            14 => Some(BandedExercisesExerciseName::FireHydrant),
21856            15 => Some(BandedExercisesExerciseName::Fly),
21857            16 => Some(BandedExercisesExerciseName::FrontRaise),
21858            17 => Some(BandedExercisesExerciseName::GluteBridge),
21859            18 => Some(BandedExercisesExerciseName::HamstringCurls),
21860            19 => Some(BandedExercisesExerciseName::HighPlankLegLifts),
21861            20 => Some(BandedExercisesExerciseName::HipExtension),
21862            21 => Some(BandedExercisesExerciseName::InternalRotation),
21863            22 => Some(BandedExercisesExerciseName::JumpingJack),
21864            23 => Some(BandedExercisesExerciseName::KneelingCrunch),
21865            24 => Some(BandedExercisesExerciseName::LateralBandWalks),
21866            25 => Some(BandedExercisesExerciseName::LateralRaise),
21867            26 => Some(BandedExercisesExerciseName::Latpull),
21868            27 => Some(BandedExercisesExerciseName::LegAbduction),
21869            28 => Some(BandedExercisesExerciseName::LegAdduction),
21870            29 => Some(BandedExercisesExerciseName::LegExtension),
21871            30 => Some(BandedExercisesExerciseName::Lunge),
21872            31 => Some(BandedExercisesExerciseName::Plank),
21873            32 => Some(BandedExercisesExerciseName::PullApart),
21874            33 => Some(BandedExercisesExerciseName::PushUps),
21875            34 => Some(BandedExercisesExerciseName::ReverseCrunch),
21876            35 => Some(BandedExercisesExerciseName::Row),
21877            36 => Some(BandedExercisesExerciseName::ShoulderAbduction),
21878            37 => Some(BandedExercisesExerciseName::ShoulderExtension),
21879            38 => Some(BandedExercisesExerciseName::ShoulderExternalRotation),
21880            39 => Some(BandedExercisesExerciseName::ShoulderFlexionTo90Degrees),
21881            40 => Some(BandedExercisesExerciseName::SidePlankLegLifts),
21882            41 => Some(BandedExercisesExerciseName::SideRaise),
21883            42 => Some(BandedExercisesExerciseName::Squat),
21884            43 => Some(BandedExercisesExerciseName::SquatToPress),
21885            44 => Some(BandedExercisesExerciseName::TricepExtension),
21886            45 => Some(BandedExercisesExerciseName::TricepKickback),
21887            46 => Some(BandedExercisesExerciseName::UprightRow),
21888            47 => Some(BandedExercisesExerciseName::WallCrawlWithExternalRotation),
21889            49 => Some(BandedExercisesExerciseName::LateralRaiseWheelchair),
21890            50 => Some(BandedExercisesExerciseName::TricepsExtensionWheelchair),
21891            51 => Some(BandedExercisesExerciseName::ChestFlyInclineWheelchair),
21892            52 => Some(BandedExercisesExerciseName::ChestFlyDeclineWheelchair),
21893            53 => Some(BandedExercisesExerciseName::PullDownWheelchair),
21894            54 => Some(BandedExercisesExerciseName::StraightArmPullDownWheelchair),
21895            55 => Some(BandedExercisesExerciseName::CurlWheelchair),
21896            56 => Some(BandedExercisesExerciseName::OverheadCurlWheelchair),
21897            57 => Some(BandedExercisesExerciseName::FacePullWheelchair),
21898            58 => Some(BandedExercisesExerciseName::AroundTheWorldWheelchair),
21899            59 => Some(BandedExercisesExerciseName::PullApartWheelchair),
21900            60 => Some(BandedExercisesExerciseName::SideCurlWheelchair),
21901            61 => Some(BandedExercisesExerciseName::OverheadPressWheelchair),
21902            _ => None,
21903        }
21904    }
21905
21906    /// Try to construct from the snake-case canonical name.
21907    pub fn from_str(name: &str) -> Option<Self> {
21908        match name {
21909            "ab_twist" => Some(BandedExercisesExerciseName::AbTwist),
21910            "back_extension" => Some(BandedExercisesExerciseName::BackExtension),
21911            "bicycle_crunch" => Some(BandedExercisesExerciseName::BicycleCrunch),
21912            "calf_raises" => Some(BandedExercisesExerciseName::CalfRaises),
21913            "chest_press" => Some(BandedExercisesExerciseName::ChestPress),
21914            "clam_shells" => Some(BandedExercisesExerciseName::ClamShells),
21915            "curl" => Some(BandedExercisesExerciseName::Curl),
21916            "deadbug" => Some(BandedExercisesExerciseName::Deadbug),
21917            "deadlift" => Some(BandedExercisesExerciseName::Deadlift),
21918            "donkey_kick" => Some(BandedExercisesExerciseName::DonkeyKick),
21919            "external_rotation" => Some(BandedExercisesExerciseName::ExternalRotation),
21920            "external_rotation_at_90_degree_abduction" => {
21921                Some(BandedExercisesExerciseName::ExternalRotationAt90DegreeAbduction)
21922            }
21923            "face_pull" => Some(BandedExercisesExerciseName::FacePull),
21924            "fire_hydrant" => Some(BandedExercisesExerciseName::FireHydrant),
21925            "fly" => Some(BandedExercisesExerciseName::Fly),
21926            "front_raise" => Some(BandedExercisesExerciseName::FrontRaise),
21927            "glute_bridge" => Some(BandedExercisesExerciseName::GluteBridge),
21928            "hamstring_curls" => Some(BandedExercisesExerciseName::HamstringCurls),
21929            "high_plank_leg_lifts" => Some(BandedExercisesExerciseName::HighPlankLegLifts),
21930            "hip_extension" => Some(BandedExercisesExerciseName::HipExtension),
21931            "internal_rotation" => Some(BandedExercisesExerciseName::InternalRotation),
21932            "jumping_jack" => Some(BandedExercisesExerciseName::JumpingJack),
21933            "kneeling_crunch" => Some(BandedExercisesExerciseName::KneelingCrunch),
21934            "lateral_band_walks" => Some(BandedExercisesExerciseName::LateralBandWalks),
21935            "lateral_raise" => Some(BandedExercisesExerciseName::LateralRaise),
21936            "latpull" => Some(BandedExercisesExerciseName::Latpull),
21937            "leg_abduction" => Some(BandedExercisesExerciseName::LegAbduction),
21938            "leg_adduction" => Some(BandedExercisesExerciseName::LegAdduction),
21939            "leg_extension" => Some(BandedExercisesExerciseName::LegExtension),
21940            "lunge" => Some(BandedExercisesExerciseName::Lunge),
21941            "plank" => Some(BandedExercisesExerciseName::Plank),
21942            "pull_apart" => Some(BandedExercisesExerciseName::PullApart),
21943            "push_ups" => Some(BandedExercisesExerciseName::PushUps),
21944            "reverse_crunch" => Some(BandedExercisesExerciseName::ReverseCrunch),
21945            "row" => Some(BandedExercisesExerciseName::Row),
21946            "shoulder_abduction" => Some(BandedExercisesExerciseName::ShoulderAbduction),
21947            "shoulder_extension" => Some(BandedExercisesExerciseName::ShoulderExtension),
21948            "shoulder_external_rotation" => {
21949                Some(BandedExercisesExerciseName::ShoulderExternalRotation)
21950            }
21951            "shoulder_flexion_to_90_degrees" => {
21952                Some(BandedExercisesExerciseName::ShoulderFlexionTo90Degrees)
21953            }
21954            "side_plank_leg_lifts" => Some(BandedExercisesExerciseName::SidePlankLegLifts),
21955            "side_raise" => Some(BandedExercisesExerciseName::SideRaise),
21956            "squat" => Some(BandedExercisesExerciseName::Squat),
21957            "squat_to_press" => Some(BandedExercisesExerciseName::SquatToPress),
21958            "tricep_extension" => Some(BandedExercisesExerciseName::TricepExtension),
21959            "tricep_kickback" => Some(BandedExercisesExerciseName::TricepKickback),
21960            "upright_row" => Some(BandedExercisesExerciseName::UprightRow),
21961            "wall_crawl_with_external_rotation" => {
21962                Some(BandedExercisesExerciseName::WallCrawlWithExternalRotation)
21963            }
21964            "lateral_raise_wheelchair" => Some(BandedExercisesExerciseName::LateralRaiseWheelchair),
21965            "triceps_extension_wheelchair" => {
21966                Some(BandedExercisesExerciseName::TricepsExtensionWheelchair)
21967            }
21968            "chest_fly_incline_wheelchair" => {
21969                Some(BandedExercisesExerciseName::ChestFlyInclineWheelchair)
21970            }
21971            "chest_fly_decline_wheelchair" => {
21972                Some(BandedExercisesExerciseName::ChestFlyDeclineWheelchair)
21973            }
21974            "pull_down_wheelchair" => Some(BandedExercisesExerciseName::PullDownWheelchair),
21975            "straight_arm_pull_down_wheelchair" => {
21976                Some(BandedExercisesExerciseName::StraightArmPullDownWheelchair)
21977            }
21978            "curl_wheelchair" => Some(BandedExercisesExerciseName::CurlWheelchair),
21979            "overhead_curl_wheelchair" => Some(BandedExercisesExerciseName::OverheadCurlWheelchair),
21980            "face_pull_wheelchair" => Some(BandedExercisesExerciseName::FacePullWheelchair),
21981            "around_the_world_wheelchair" => {
21982                Some(BandedExercisesExerciseName::AroundTheWorldWheelchair)
21983            }
21984            "pull_apart_wheelchair" => Some(BandedExercisesExerciseName::PullApartWheelchair),
21985            "side_curl_wheelchair" => Some(BandedExercisesExerciseName::SideCurlWheelchair),
21986            "overhead_press_wheelchair" => {
21987                Some(BandedExercisesExerciseName::OverheadPressWheelchair)
21988            }
21989            _ => None,
21990        }
21991    }
21992}
21993
21994#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
21995#[repr(u16)]
21996#[non_exhaustive]
21997pub enum BattleRopeExerciseName {
21998    AlternatingFigureEight = 0,
21999    AlternatingJumpWave = 1,
22000    AlternatingKneelingToStandingWave = 2,
22001    AlternatingLungeWave = 3,
22002    AlternatingSquatWave = 4,
22003    AlternatingWave = 5,
22004    AlternatingWaveWithLateralShuffle = 6,
22005    ClapWave = 7,
22006    DoubleArmFigureEight = 8,
22007    DoubleArmSideToSideSnake = 9,
22008    DoubleArmSideWave = 10,
22009    DoubleArmSlam = 11,
22010    DoubleArmWave = 12,
22011    GrapplerToss = 13,
22012    HipToss = 14,
22013    InAndOutWave = 15,
22014    InsideCircle = 16,
22015    JumpingJacks = 17,
22016    OutsideCircle = 18,
22017    Rainbow = 19,
22018    SidePlankWave = 20,
22019    Sidewinder = 21,
22020    SittingRussianTwist = 22,
22021    SnakeWave = 23,
22022    SplitJack = 24,
22023    StageCoach = 25,
22024    UltimateWarrior = 26,
22025    UpperCuts = 27,
22026}
22027
22028impl BattleRopeExerciseName {
22029    /// Snake-case canonical name from Profile.xlsx.
22030    pub fn as_str(&self) -> &'static str {
22031        match self {
22032            BattleRopeExerciseName::AlternatingFigureEight => "alternating_figure_eight",
22033            BattleRopeExerciseName::AlternatingJumpWave => "alternating_jump_wave",
22034            BattleRopeExerciseName::AlternatingKneelingToStandingWave => {
22035                "alternating_kneeling_to_standing_wave"
22036            }
22037            BattleRopeExerciseName::AlternatingLungeWave => "alternating_lunge_wave",
22038            BattleRopeExerciseName::AlternatingSquatWave => "alternating_squat_wave",
22039            BattleRopeExerciseName::AlternatingWave => "alternating_wave",
22040            BattleRopeExerciseName::AlternatingWaveWithLateralShuffle => {
22041                "alternating_wave_with_lateral_shuffle"
22042            }
22043            BattleRopeExerciseName::ClapWave => "clap_wave",
22044            BattleRopeExerciseName::DoubleArmFigureEight => "double_arm_figure_eight",
22045            BattleRopeExerciseName::DoubleArmSideToSideSnake => "double_arm_side_to_side_snake",
22046            BattleRopeExerciseName::DoubleArmSideWave => "double_arm_side_wave",
22047            BattleRopeExerciseName::DoubleArmSlam => "double_arm_slam",
22048            BattleRopeExerciseName::DoubleArmWave => "double_arm_wave",
22049            BattleRopeExerciseName::GrapplerToss => "grappler_toss",
22050            BattleRopeExerciseName::HipToss => "hip_toss",
22051            BattleRopeExerciseName::InAndOutWave => "in_and_out_wave",
22052            BattleRopeExerciseName::InsideCircle => "inside_circle",
22053            BattleRopeExerciseName::JumpingJacks => "jumping_jacks",
22054            BattleRopeExerciseName::OutsideCircle => "outside_circle",
22055            BattleRopeExerciseName::Rainbow => "rainbow",
22056            BattleRopeExerciseName::SidePlankWave => "side_plank_wave",
22057            BattleRopeExerciseName::Sidewinder => "sidewinder",
22058            BattleRopeExerciseName::SittingRussianTwist => "sitting_russian_twist",
22059            BattleRopeExerciseName::SnakeWave => "snake_wave",
22060            BattleRopeExerciseName::SplitJack => "split_jack",
22061            BattleRopeExerciseName::StageCoach => "stage_coach",
22062            BattleRopeExerciseName::UltimateWarrior => "ultimate_warrior",
22063            BattleRopeExerciseName::UpperCuts => "upper_cuts",
22064        }
22065    }
22066
22067    /// Try to construct from the underlying numeric value.
22068    pub fn from_value(value: u16) -> Option<Self> {
22069        match value {
22070            0 => Some(BattleRopeExerciseName::AlternatingFigureEight),
22071            1 => Some(BattleRopeExerciseName::AlternatingJumpWave),
22072            2 => Some(BattleRopeExerciseName::AlternatingKneelingToStandingWave),
22073            3 => Some(BattleRopeExerciseName::AlternatingLungeWave),
22074            4 => Some(BattleRopeExerciseName::AlternatingSquatWave),
22075            5 => Some(BattleRopeExerciseName::AlternatingWave),
22076            6 => Some(BattleRopeExerciseName::AlternatingWaveWithLateralShuffle),
22077            7 => Some(BattleRopeExerciseName::ClapWave),
22078            8 => Some(BattleRopeExerciseName::DoubleArmFigureEight),
22079            9 => Some(BattleRopeExerciseName::DoubleArmSideToSideSnake),
22080            10 => Some(BattleRopeExerciseName::DoubleArmSideWave),
22081            11 => Some(BattleRopeExerciseName::DoubleArmSlam),
22082            12 => Some(BattleRopeExerciseName::DoubleArmWave),
22083            13 => Some(BattleRopeExerciseName::GrapplerToss),
22084            14 => Some(BattleRopeExerciseName::HipToss),
22085            15 => Some(BattleRopeExerciseName::InAndOutWave),
22086            16 => Some(BattleRopeExerciseName::InsideCircle),
22087            17 => Some(BattleRopeExerciseName::JumpingJacks),
22088            18 => Some(BattleRopeExerciseName::OutsideCircle),
22089            19 => Some(BattleRopeExerciseName::Rainbow),
22090            20 => Some(BattleRopeExerciseName::SidePlankWave),
22091            21 => Some(BattleRopeExerciseName::Sidewinder),
22092            22 => Some(BattleRopeExerciseName::SittingRussianTwist),
22093            23 => Some(BattleRopeExerciseName::SnakeWave),
22094            24 => Some(BattleRopeExerciseName::SplitJack),
22095            25 => Some(BattleRopeExerciseName::StageCoach),
22096            26 => Some(BattleRopeExerciseName::UltimateWarrior),
22097            27 => Some(BattleRopeExerciseName::UpperCuts),
22098            _ => None,
22099        }
22100    }
22101
22102    /// Try to construct from the snake-case canonical name.
22103    pub fn from_str(name: &str) -> Option<Self> {
22104        match name {
22105            "alternating_figure_eight" => Some(BattleRopeExerciseName::AlternatingFigureEight),
22106            "alternating_jump_wave" => Some(BattleRopeExerciseName::AlternatingJumpWave),
22107            "alternating_kneeling_to_standing_wave" => {
22108                Some(BattleRopeExerciseName::AlternatingKneelingToStandingWave)
22109            }
22110            "alternating_lunge_wave" => Some(BattleRopeExerciseName::AlternatingLungeWave),
22111            "alternating_squat_wave" => Some(BattleRopeExerciseName::AlternatingSquatWave),
22112            "alternating_wave" => Some(BattleRopeExerciseName::AlternatingWave),
22113            "alternating_wave_with_lateral_shuffle" => {
22114                Some(BattleRopeExerciseName::AlternatingWaveWithLateralShuffle)
22115            }
22116            "clap_wave" => Some(BattleRopeExerciseName::ClapWave),
22117            "double_arm_figure_eight" => Some(BattleRopeExerciseName::DoubleArmFigureEight),
22118            "double_arm_side_to_side_snake" => {
22119                Some(BattleRopeExerciseName::DoubleArmSideToSideSnake)
22120            }
22121            "double_arm_side_wave" => Some(BattleRopeExerciseName::DoubleArmSideWave),
22122            "double_arm_slam" => Some(BattleRopeExerciseName::DoubleArmSlam),
22123            "double_arm_wave" => Some(BattleRopeExerciseName::DoubleArmWave),
22124            "grappler_toss" => Some(BattleRopeExerciseName::GrapplerToss),
22125            "hip_toss" => Some(BattleRopeExerciseName::HipToss),
22126            "in_and_out_wave" => Some(BattleRopeExerciseName::InAndOutWave),
22127            "inside_circle" => Some(BattleRopeExerciseName::InsideCircle),
22128            "jumping_jacks" => Some(BattleRopeExerciseName::JumpingJacks),
22129            "outside_circle" => Some(BattleRopeExerciseName::OutsideCircle),
22130            "rainbow" => Some(BattleRopeExerciseName::Rainbow),
22131            "side_plank_wave" => Some(BattleRopeExerciseName::SidePlankWave),
22132            "sidewinder" => Some(BattleRopeExerciseName::Sidewinder),
22133            "sitting_russian_twist" => Some(BattleRopeExerciseName::SittingRussianTwist),
22134            "snake_wave" => Some(BattleRopeExerciseName::SnakeWave),
22135            "split_jack" => Some(BattleRopeExerciseName::SplitJack),
22136            "stage_coach" => Some(BattleRopeExerciseName::StageCoach),
22137            "ultimate_warrior" => Some(BattleRopeExerciseName::UltimateWarrior),
22138            "upper_cuts" => Some(BattleRopeExerciseName::UpperCuts),
22139            _ => None,
22140        }
22141    }
22142}
22143
22144#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
22145#[repr(u16)]
22146#[non_exhaustive]
22147pub enum EllipticalExerciseName {
22148    Elliptical = 0,
22149}
22150
22151impl EllipticalExerciseName {
22152    /// Snake-case canonical name from Profile.xlsx.
22153    pub fn as_str(&self) -> &'static str {
22154        match self {
22155            EllipticalExerciseName::Elliptical => "elliptical",
22156        }
22157    }
22158
22159    /// Try to construct from the underlying numeric value.
22160    pub fn from_value(value: u16) -> Option<Self> {
22161        match value {
22162            0 => Some(EllipticalExerciseName::Elliptical),
22163            _ => None,
22164        }
22165    }
22166
22167    /// Try to construct from the snake-case canonical name.
22168    pub fn from_str(name: &str) -> Option<Self> {
22169        match name {
22170            "elliptical" => Some(EllipticalExerciseName::Elliptical),
22171            _ => None,
22172        }
22173    }
22174}
22175
22176#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
22177#[repr(u16)]
22178#[non_exhaustive]
22179pub enum FloorClimbExerciseName {
22180    FloorClimb = 0,
22181}
22182
22183impl FloorClimbExerciseName {
22184    /// Snake-case canonical name from Profile.xlsx.
22185    pub fn as_str(&self) -> &'static str {
22186        match self {
22187            FloorClimbExerciseName::FloorClimb => "floor_climb",
22188        }
22189    }
22190
22191    /// Try to construct from the underlying numeric value.
22192    pub fn from_value(value: u16) -> Option<Self> {
22193        match value {
22194            0 => Some(FloorClimbExerciseName::FloorClimb),
22195            _ => None,
22196        }
22197    }
22198
22199    /// Try to construct from the snake-case canonical name.
22200    pub fn from_str(name: &str) -> Option<Self> {
22201        match name {
22202            "floor_climb" => Some(FloorClimbExerciseName::FloorClimb),
22203            _ => None,
22204        }
22205    }
22206}
22207
22208#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
22209#[repr(u16)]
22210#[non_exhaustive]
22211pub enum IndoorBikeExerciseName {
22212    AirBike = 0,
22213    AssaultBike = 1,
22214    StationaryBike = 3,
22215}
22216
22217impl IndoorBikeExerciseName {
22218    /// Snake-case canonical name from Profile.xlsx.
22219    pub fn as_str(&self) -> &'static str {
22220        match self {
22221            IndoorBikeExerciseName::AirBike => "air_bike",
22222            IndoorBikeExerciseName::AssaultBike => "assault_bike",
22223            IndoorBikeExerciseName::StationaryBike => "stationary_bike",
22224        }
22225    }
22226
22227    /// Try to construct from the underlying numeric value.
22228    pub fn from_value(value: u16) -> Option<Self> {
22229        match value {
22230            0 => Some(IndoorBikeExerciseName::AirBike),
22231            1 => Some(IndoorBikeExerciseName::AssaultBike),
22232            3 => Some(IndoorBikeExerciseName::StationaryBike),
22233            _ => None,
22234        }
22235    }
22236
22237    /// Try to construct from the snake-case canonical name.
22238    pub fn from_str(name: &str) -> Option<Self> {
22239        match name {
22240            "air_bike" => Some(IndoorBikeExerciseName::AirBike),
22241            "assault_bike" => Some(IndoorBikeExerciseName::AssaultBike),
22242            "stationary_bike" => Some(IndoorBikeExerciseName::StationaryBike),
22243            _ => None,
22244        }
22245    }
22246}
22247
22248#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
22249#[repr(u16)]
22250#[non_exhaustive]
22251pub enum IndoorRowExerciseName {
22252    RowingMachine = 0,
22253}
22254
22255impl IndoorRowExerciseName {
22256    /// Snake-case canonical name from Profile.xlsx.
22257    pub fn as_str(&self) -> &'static str {
22258        match self {
22259            IndoorRowExerciseName::RowingMachine => "rowing_machine",
22260        }
22261    }
22262
22263    /// Try to construct from the underlying numeric value.
22264    pub fn from_value(value: u16) -> Option<Self> {
22265        match value {
22266            0 => Some(IndoorRowExerciseName::RowingMachine),
22267            _ => None,
22268        }
22269    }
22270
22271    /// Try to construct from the snake-case canonical name.
22272    pub fn from_str(name: &str) -> Option<Self> {
22273        match name {
22274            "rowing_machine" => Some(IndoorRowExerciseName::RowingMachine),
22275            _ => None,
22276        }
22277    }
22278}
22279
22280#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
22281#[repr(u16)]
22282#[non_exhaustive]
22283pub enum LadderExerciseName {
22284    Agility = 0,
22285    Speed = 1,
22286}
22287
22288impl LadderExerciseName {
22289    /// Snake-case canonical name from Profile.xlsx.
22290    pub fn as_str(&self) -> &'static str {
22291        match self {
22292            LadderExerciseName::Agility => "agility",
22293            LadderExerciseName::Speed => "speed",
22294        }
22295    }
22296
22297    /// Try to construct from the underlying numeric value.
22298    pub fn from_value(value: u16) -> Option<Self> {
22299        match value {
22300            0 => Some(LadderExerciseName::Agility),
22301            1 => Some(LadderExerciseName::Speed),
22302            _ => None,
22303        }
22304    }
22305
22306    /// Try to construct from the snake-case canonical name.
22307    pub fn from_str(name: &str) -> Option<Self> {
22308        match name {
22309            "agility" => Some(LadderExerciseName::Agility),
22310            "speed" => Some(LadderExerciseName::Speed),
22311            _ => None,
22312        }
22313    }
22314}
22315
22316#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
22317#[repr(u16)]
22318#[non_exhaustive]
22319pub enum SandbagExerciseName {
22320    AroundTheWorld = 0,
22321    BackSquat = 1,
22322    BearCrawlPullThrough = 2,
22323    BearHugSquat = 3,
22324    Clean = 4,
22325    CleanAndPress = 5,
22326    Curl = 6,
22327    FrontCarry = 7,
22328    FrontSquat = 8,
22329    Lunge = 9,
22330    OverheadPress = 10,
22331    PlankPullThrough = 11,
22332    RotationalLunge = 12,
22333    Row = 13,
22334    RussianTwist = 14,
22335    Shouldering = 15,
22336    Shoveling = 16,
22337    SideLunge = 17,
22338    Sprint = 18,
22339    ZercherSquat = 19,
22340}
22341
22342impl SandbagExerciseName {
22343    /// Snake-case canonical name from Profile.xlsx.
22344    pub fn as_str(&self) -> &'static str {
22345        match self {
22346            SandbagExerciseName::AroundTheWorld => "around_the_world",
22347            SandbagExerciseName::BackSquat => "back_squat",
22348            SandbagExerciseName::BearCrawlPullThrough => "bear_crawl_pull_through",
22349            SandbagExerciseName::BearHugSquat => "bear_hug_squat",
22350            SandbagExerciseName::Clean => "clean",
22351            SandbagExerciseName::CleanAndPress => "clean_and_press",
22352            SandbagExerciseName::Curl => "curl",
22353            SandbagExerciseName::FrontCarry => "front_carry",
22354            SandbagExerciseName::FrontSquat => "front_squat",
22355            SandbagExerciseName::Lunge => "lunge",
22356            SandbagExerciseName::OverheadPress => "overhead_press",
22357            SandbagExerciseName::PlankPullThrough => "plank_pull_through",
22358            SandbagExerciseName::RotationalLunge => "rotational_lunge",
22359            SandbagExerciseName::Row => "row",
22360            SandbagExerciseName::RussianTwist => "russian_twist",
22361            SandbagExerciseName::Shouldering => "shouldering",
22362            SandbagExerciseName::Shoveling => "shoveling",
22363            SandbagExerciseName::SideLunge => "side_lunge",
22364            SandbagExerciseName::Sprint => "sprint",
22365            SandbagExerciseName::ZercherSquat => "zercher_squat",
22366        }
22367    }
22368
22369    /// Try to construct from the underlying numeric value.
22370    pub fn from_value(value: u16) -> Option<Self> {
22371        match value {
22372            0 => Some(SandbagExerciseName::AroundTheWorld),
22373            1 => Some(SandbagExerciseName::BackSquat),
22374            2 => Some(SandbagExerciseName::BearCrawlPullThrough),
22375            3 => Some(SandbagExerciseName::BearHugSquat),
22376            4 => Some(SandbagExerciseName::Clean),
22377            5 => Some(SandbagExerciseName::CleanAndPress),
22378            6 => Some(SandbagExerciseName::Curl),
22379            7 => Some(SandbagExerciseName::FrontCarry),
22380            8 => Some(SandbagExerciseName::FrontSquat),
22381            9 => Some(SandbagExerciseName::Lunge),
22382            10 => Some(SandbagExerciseName::OverheadPress),
22383            11 => Some(SandbagExerciseName::PlankPullThrough),
22384            12 => Some(SandbagExerciseName::RotationalLunge),
22385            13 => Some(SandbagExerciseName::Row),
22386            14 => Some(SandbagExerciseName::RussianTwist),
22387            15 => Some(SandbagExerciseName::Shouldering),
22388            16 => Some(SandbagExerciseName::Shoveling),
22389            17 => Some(SandbagExerciseName::SideLunge),
22390            18 => Some(SandbagExerciseName::Sprint),
22391            19 => Some(SandbagExerciseName::ZercherSquat),
22392            _ => None,
22393        }
22394    }
22395
22396    /// Try to construct from the snake-case canonical name.
22397    pub fn from_str(name: &str) -> Option<Self> {
22398        match name {
22399            "around_the_world" => Some(SandbagExerciseName::AroundTheWorld),
22400            "back_squat" => Some(SandbagExerciseName::BackSquat),
22401            "bear_crawl_pull_through" => Some(SandbagExerciseName::BearCrawlPullThrough),
22402            "bear_hug_squat" => Some(SandbagExerciseName::BearHugSquat),
22403            "clean" => Some(SandbagExerciseName::Clean),
22404            "clean_and_press" => Some(SandbagExerciseName::CleanAndPress),
22405            "curl" => Some(SandbagExerciseName::Curl),
22406            "front_carry" => Some(SandbagExerciseName::FrontCarry),
22407            "front_squat" => Some(SandbagExerciseName::FrontSquat),
22408            "lunge" => Some(SandbagExerciseName::Lunge),
22409            "overhead_press" => Some(SandbagExerciseName::OverheadPress),
22410            "plank_pull_through" => Some(SandbagExerciseName::PlankPullThrough),
22411            "rotational_lunge" => Some(SandbagExerciseName::RotationalLunge),
22412            "row" => Some(SandbagExerciseName::Row),
22413            "russian_twist" => Some(SandbagExerciseName::RussianTwist),
22414            "shouldering" => Some(SandbagExerciseName::Shouldering),
22415            "shoveling" => Some(SandbagExerciseName::Shoveling),
22416            "side_lunge" => Some(SandbagExerciseName::SideLunge),
22417            "sprint" => Some(SandbagExerciseName::Sprint),
22418            "zercher_squat" => Some(SandbagExerciseName::ZercherSquat),
22419            _ => None,
22420        }
22421    }
22422}
22423
22424#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
22425#[repr(u16)]
22426#[non_exhaustive]
22427pub enum SledExerciseName {
22428    BackwardDrag = 0,
22429    ChestPress = 1,
22430    ForwardDrag = 2,
22431    LowPush = 3,
22432    Push = 4,
22433    Row = 5,
22434}
22435
22436impl SledExerciseName {
22437    /// Snake-case canonical name from Profile.xlsx.
22438    pub fn as_str(&self) -> &'static str {
22439        match self {
22440            SledExerciseName::BackwardDrag => "backward_drag",
22441            SledExerciseName::ChestPress => "chest_press",
22442            SledExerciseName::ForwardDrag => "forward_drag",
22443            SledExerciseName::LowPush => "low_push",
22444            SledExerciseName::Push => "push",
22445            SledExerciseName::Row => "row",
22446        }
22447    }
22448
22449    /// Try to construct from the underlying numeric value.
22450    pub fn from_value(value: u16) -> Option<Self> {
22451        match value {
22452            0 => Some(SledExerciseName::BackwardDrag),
22453            1 => Some(SledExerciseName::ChestPress),
22454            2 => Some(SledExerciseName::ForwardDrag),
22455            3 => Some(SledExerciseName::LowPush),
22456            4 => Some(SledExerciseName::Push),
22457            5 => Some(SledExerciseName::Row),
22458            _ => None,
22459        }
22460    }
22461
22462    /// Try to construct from the snake-case canonical name.
22463    pub fn from_str(name: &str) -> Option<Self> {
22464        match name {
22465            "backward_drag" => Some(SledExerciseName::BackwardDrag),
22466            "chest_press" => Some(SledExerciseName::ChestPress),
22467            "forward_drag" => Some(SledExerciseName::ForwardDrag),
22468            "low_push" => Some(SledExerciseName::LowPush),
22469            "push" => Some(SledExerciseName::Push),
22470            "row" => Some(SledExerciseName::Row),
22471            _ => None,
22472        }
22473    }
22474}
22475
22476#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
22477#[repr(u16)]
22478#[non_exhaustive]
22479pub enum SledgeHammerExerciseName {
22480    LateralSwing = 0,
22481    HammerSlam = 1,
22482}
22483
22484impl SledgeHammerExerciseName {
22485    /// Snake-case canonical name from Profile.xlsx.
22486    pub fn as_str(&self) -> &'static str {
22487        match self {
22488            SledgeHammerExerciseName::LateralSwing => "lateral_swing",
22489            SledgeHammerExerciseName::HammerSlam => "hammer_slam",
22490        }
22491    }
22492
22493    /// Try to construct from the underlying numeric value.
22494    pub fn from_value(value: u16) -> Option<Self> {
22495        match value {
22496            0 => Some(SledgeHammerExerciseName::LateralSwing),
22497            1 => Some(SledgeHammerExerciseName::HammerSlam),
22498            _ => None,
22499        }
22500    }
22501
22502    /// Try to construct from the snake-case canonical name.
22503    pub fn from_str(name: &str) -> Option<Self> {
22504        match name {
22505            "lateral_swing" => Some(SledgeHammerExerciseName::LateralSwing),
22506            "hammer_slam" => Some(SledgeHammerExerciseName::HammerSlam),
22507            _ => None,
22508        }
22509    }
22510}
22511
22512#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
22513#[repr(u16)]
22514#[non_exhaustive]
22515pub enum StairStepperExerciseName {
22516    StairStepper = 0,
22517}
22518
22519impl StairStepperExerciseName {
22520    /// Snake-case canonical name from Profile.xlsx.
22521    pub fn as_str(&self) -> &'static str {
22522        match self {
22523            StairStepperExerciseName::StairStepper => "stair_stepper",
22524        }
22525    }
22526
22527    /// Try to construct from the underlying numeric value.
22528    pub fn from_value(value: u16) -> Option<Self> {
22529        match value {
22530            0 => Some(StairStepperExerciseName::StairStepper),
22531            _ => None,
22532        }
22533    }
22534
22535    /// Try to construct from the snake-case canonical name.
22536    pub fn from_str(name: &str) -> Option<Self> {
22537        match name {
22538            "stair_stepper" => Some(StairStepperExerciseName::StairStepper),
22539            _ => None,
22540        }
22541    }
22542}
22543
22544#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
22545#[repr(u16)]
22546#[non_exhaustive]
22547pub enum SuspensionExerciseName {
22548    ChestFly = 0,
22549    ChestPress = 1,
22550    Crunch = 2,
22551    Curl = 3,
22552    Dip = 4,
22553    FacePull = 5,
22554    GluteBridge = 6,
22555    HamstringCurl = 7,
22556    HipDrop = 8,
22557    InvertedRow = 9,
22558    KneeDriveJump = 10,
22559    KneeToChest = 11,
22560    LatPullover = 12,
22561    Lunge = 13,
22562    MountainClimber = 14,
22563    Pendulum = 15,
22564    Pike = 16,
22565    Plank = 17,
22566    PowerPull = 18,
22567    PullUp = 19,
22568    PushUp = 20,
22569    ReverseMountainClimber = 21,
22570    ReversePlank = 22,
22571    Rollout = 23,
22572    Row = 24,
22573    SideLunge = 25,
22574    SidePlank = 26,
22575    SingleLegDeadlift = 27,
22576    SingleLegSquat = 28,
22577    SitUp = 29,
22578    Split = 30,
22579    Squat = 31,
22580    SquatJump = 32,
22581    TricepPress = 33,
22582    YFly = 34,
22583}
22584
22585impl SuspensionExerciseName {
22586    /// Snake-case canonical name from Profile.xlsx.
22587    pub fn as_str(&self) -> &'static str {
22588        match self {
22589            SuspensionExerciseName::ChestFly => "chest_fly",
22590            SuspensionExerciseName::ChestPress => "chest_press",
22591            SuspensionExerciseName::Crunch => "crunch",
22592            SuspensionExerciseName::Curl => "curl",
22593            SuspensionExerciseName::Dip => "dip",
22594            SuspensionExerciseName::FacePull => "face_pull",
22595            SuspensionExerciseName::GluteBridge => "glute_bridge",
22596            SuspensionExerciseName::HamstringCurl => "hamstring_curl",
22597            SuspensionExerciseName::HipDrop => "hip_drop",
22598            SuspensionExerciseName::InvertedRow => "inverted_row",
22599            SuspensionExerciseName::KneeDriveJump => "knee_drive_jump",
22600            SuspensionExerciseName::KneeToChest => "knee_to_chest",
22601            SuspensionExerciseName::LatPullover => "lat_pullover",
22602            SuspensionExerciseName::Lunge => "lunge",
22603            SuspensionExerciseName::MountainClimber => "mountain_climber",
22604            SuspensionExerciseName::Pendulum => "pendulum",
22605            SuspensionExerciseName::Pike => "pike",
22606            SuspensionExerciseName::Plank => "plank",
22607            SuspensionExerciseName::PowerPull => "power_pull",
22608            SuspensionExerciseName::PullUp => "pull_up",
22609            SuspensionExerciseName::PushUp => "push_up",
22610            SuspensionExerciseName::ReverseMountainClimber => "reverse_mountain_climber",
22611            SuspensionExerciseName::ReversePlank => "reverse_plank",
22612            SuspensionExerciseName::Rollout => "rollout",
22613            SuspensionExerciseName::Row => "row",
22614            SuspensionExerciseName::SideLunge => "side_lunge",
22615            SuspensionExerciseName::SidePlank => "side_plank",
22616            SuspensionExerciseName::SingleLegDeadlift => "single_leg_deadlift",
22617            SuspensionExerciseName::SingleLegSquat => "single_leg_squat",
22618            SuspensionExerciseName::SitUp => "sit_up",
22619            SuspensionExerciseName::Split => "split",
22620            SuspensionExerciseName::Squat => "squat",
22621            SuspensionExerciseName::SquatJump => "squat_jump",
22622            SuspensionExerciseName::TricepPress => "tricep_press",
22623            SuspensionExerciseName::YFly => "y_fly",
22624        }
22625    }
22626
22627    /// Try to construct from the underlying numeric value.
22628    pub fn from_value(value: u16) -> Option<Self> {
22629        match value {
22630            0 => Some(SuspensionExerciseName::ChestFly),
22631            1 => Some(SuspensionExerciseName::ChestPress),
22632            2 => Some(SuspensionExerciseName::Crunch),
22633            3 => Some(SuspensionExerciseName::Curl),
22634            4 => Some(SuspensionExerciseName::Dip),
22635            5 => Some(SuspensionExerciseName::FacePull),
22636            6 => Some(SuspensionExerciseName::GluteBridge),
22637            7 => Some(SuspensionExerciseName::HamstringCurl),
22638            8 => Some(SuspensionExerciseName::HipDrop),
22639            9 => Some(SuspensionExerciseName::InvertedRow),
22640            10 => Some(SuspensionExerciseName::KneeDriveJump),
22641            11 => Some(SuspensionExerciseName::KneeToChest),
22642            12 => Some(SuspensionExerciseName::LatPullover),
22643            13 => Some(SuspensionExerciseName::Lunge),
22644            14 => Some(SuspensionExerciseName::MountainClimber),
22645            15 => Some(SuspensionExerciseName::Pendulum),
22646            16 => Some(SuspensionExerciseName::Pike),
22647            17 => Some(SuspensionExerciseName::Plank),
22648            18 => Some(SuspensionExerciseName::PowerPull),
22649            19 => Some(SuspensionExerciseName::PullUp),
22650            20 => Some(SuspensionExerciseName::PushUp),
22651            21 => Some(SuspensionExerciseName::ReverseMountainClimber),
22652            22 => Some(SuspensionExerciseName::ReversePlank),
22653            23 => Some(SuspensionExerciseName::Rollout),
22654            24 => Some(SuspensionExerciseName::Row),
22655            25 => Some(SuspensionExerciseName::SideLunge),
22656            26 => Some(SuspensionExerciseName::SidePlank),
22657            27 => Some(SuspensionExerciseName::SingleLegDeadlift),
22658            28 => Some(SuspensionExerciseName::SingleLegSquat),
22659            29 => Some(SuspensionExerciseName::SitUp),
22660            30 => Some(SuspensionExerciseName::Split),
22661            31 => Some(SuspensionExerciseName::Squat),
22662            32 => Some(SuspensionExerciseName::SquatJump),
22663            33 => Some(SuspensionExerciseName::TricepPress),
22664            34 => Some(SuspensionExerciseName::YFly),
22665            _ => None,
22666        }
22667    }
22668
22669    /// Try to construct from the snake-case canonical name.
22670    pub fn from_str(name: &str) -> Option<Self> {
22671        match name {
22672            "chest_fly" => Some(SuspensionExerciseName::ChestFly),
22673            "chest_press" => Some(SuspensionExerciseName::ChestPress),
22674            "crunch" => Some(SuspensionExerciseName::Crunch),
22675            "curl" => Some(SuspensionExerciseName::Curl),
22676            "dip" => Some(SuspensionExerciseName::Dip),
22677            "face_pull" => Some(SuspensionExerciseName::FacePull),
22678            "glute_bridge" => Some(SuspensionExerciseName::GluteBridge),
22679            "hamstring_curl" => Some(SuspensionExerciseName::HamstringCurl),
22680            "hip_drop" => Some(SuspensionExerciseName::HipDrop),
22681            "inverted_row" => Some(SuspensionExerciseName::InvertedRow),
22682            "knee_drive_jump" => Some(SuspensionExerciseName::KneeDriveJump),
22683            "knee_to_chest" => Some(SuspensionExerciseName::KneeToChest),
22684            "lat_pullover" => Some(SuspensionExerciseName::LatPullover),
22685            "lunge" => Some(SuspensionExerciseName::Lunge),
22686            "mountain_climber" => Some(SuspensionExerciseName::MountainClimber),
22687            "pendulum" => Some(SuspensionExerciseName::Pendulum),
22688            "pike" => Some(SuspensionExerciseName::Pike),
22689            "plank" => Some(SuspensionExerciseName::Plank),
22690            "power_pull" => Some(SuspensionExerciseName::PowerPull),
22691            "pull_up" => Some(SuspensionExerciseName::PullUp),
22692            "push_up" => Some(SuspensionExerciseName::PushUp),
22693            "reverse_mountain_climber" => Some(SuspensionExerciseName::ReverseMountainClimber),
22694            "reverse_plank" => Some(SuspensionExerciseName::ReversePlank),
22695            "rollout" => Some(SuspensionExerciseName::Rollout),
22696            "row" => Some(SuspensionExerciseName::Row),
22697            "side_lunge" => Some(SuspensionExerciseName::SideLunge),
22698            "side_plank" => Some(SuspensionExerciseName::SidePlank),
22699            "single_leg_deadlift" => Some(SuspensionExerciseName::SingleLegDeadlift),
22700            "single_leg_squat" => Some(SuspensionExerciseName::SingleLegSquat),
22701            "sit_up" => Some(SuspensionExerciseName::SitUp),
22702            "split" => Some(SuspensionExerciseName::Split),
22703            "squat" => Some(SuspensionExerciseName::Squat),
22704            "squat_jump" => Some(SuspensionExerciseName::SquatJump),
22705            "tricep_press" => Some(SuspensionExerciseName::TricepPress),
22706            "y_fly" => Some(SuspensionExerciseName::YFly),
22707            _ => None,
22708        }
22709    }
22710}
22711
22712#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
22713#[repr(u16)]
22714#[non_exhaustive]
22715pub enum TireExerciseName {
22716    Flip = 0,
22717}
22718
22719impl TireExerciseName {
22720    /// Snake-case canonical name from Profile.xlsx.
22721    pub fn as_str(&self) -> &'static str {
22722        match self {
22723            TireExerciseName::Flip => "flip",
22724        }
22725    }
22726
22727    /// Try to construct from the underlying numeric value.
22728    pub fn from_value(value: u16) -> Option<Self> {
22729        match value {
22730            0 => Some(TireExerciseName::Flip),
22731            _ => None,
22732        }
22733    }
22734
22735    /// Try to construct from the snake-case canonical name.
22736    pub fn from_str(name: &str) -> Option<Self> {
22737        match name {
22738            "flip" => Some(TireExerciseName::Flip),
22739            _ => None,
22740        }
22741    }
22742}
22743
22744#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
22745#[repr(u16)]
22746#[non_exhaustive]
22747pub enum BikeOutdoorExerciseName {
22748    Bike = 0,
22749}
22750
22751impl BikeOutdoorExerciseName {
22752    /// Snake-case canonical name from Profile.xlsx.
22753    pub fn as_str(&self) -> &'static str {
22754        match self {
22755            BikeOutdoorExerciseName::Bike => "bike",
22756        }
22757    }
22758
22759    /// Try to construct from the underlying numeric value.
22760    pub fn from_value(value: u16) -> Option<Self> {
22761        match value {
22762            0 => Some(BikeOutdoorExerciseName::Bike),
22763            _ => None,
22764        }
22765    }
22766
22767    /// Try to construct from the snake-case canonical name.
22768    pub fn from_str(name: &str) -> Option<Self> {
22769        match name {
22770            "bike" => Some(BikeOutdoorExerciseName::Bike),
22771            _ => None,
22772        }
22773    }
22774}
22775
22776#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
22777#[repr(u16)]
22778#[non_exhaustive]
22779pub enum RunIndoorExerciseName {
22780    IndoorTrackRun = 0,
22781    Treadmill = 1,
22782}
22783
22784impl RunIndoorExerciseName {
22785    /// Snake-case canonical name from Profile.xlsx.
22786    pub fn as_str(&self) -> &'static str {
22787        match self {
22788            RunIndoorExerciseName::IndoorTrackRun => "indoor_track_run",
22789            RunIndoorExerciseName::Treadmill => "treadmill",
22790        }
22791    }
22792
22793    /// Try to construct from the underlying numeric value.
22794    pub fn from_value(value: u16) -> Option<Self> {
22795        match value {
22796            0 => Some(RunIndoorExerciseName::IndoorTrackRun),
22797            1 => Some(RunIndoorExerciseName::Treadmill),
22798            _ => None,
22799        }
22800    }
22801
22802    /// Try to construct from the snake-case canonical name.
22803    pub fn from_str(name: &str) -> Option<Self> {
22804        match name {
22805            "indoor_track_run" => Some(RunIndoorExerciseName::IndoorTrackRun),
22806            "treadmill" => Some(RunIndoorExerciseName::Treadmill),
22807            _ => None,
22808        }
22809    }
22810}
22811
22812#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
22813#[repr(u8)]
22814#[non_exhaustive]
22815pub enum WaterType {
22816    Fresh = 0,
22817    Salt = 1,
22818    En13319 = 2,
22819    Custom = 3,
22820}
22821
22822impl WaterType {
22823    /// Snake-case canonical name from Profile.xlsx.
22824    pub fn as_str(&self) -> &'static str {
22825        match self {
22826            WaterType::Fresh => "fresh",
22827            WaterType::Salt => "salt",
22828            WaterType::En13319 => "en13319",
22829            WaterType::Custom => "custom",
22830        }
22831    }
22832
22833    /// Try to construct from the underlying numeric value.
22834    pub fn from_value(value: u8) -> Option<Self> {
22835        match value {
22836            0 => Some(WaterType::Fresh),
22837            1 => Some(WaterType::Salt),
22838            2 => Some(WaterType::En13319),
22839            3 => Some(WaterType::Custom),
22840            _ => None,
22841        }
22842    }
22843
22844    /// Try to construct from the snake-case canonical name.
22845    pub fn from_str(name: &str) -> Option<Self> {
22846        match name {
22847            "fresh" => Some(WaterType::Fresh),
22848            "salt" => Some(WaterType::Salt),
22849            "en13319" => Some(WaterType::En13319),
22850            "custom" => Some(WaterType::Custom),
22851            _ => None,
22852        }
22853    }
22854}
22855
22856#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
22857#[repr(u8)]
22858#[non_exhaustive]
22859pub enum TissueModelType {
22860    Zhl16c = 0,
22861}
22862
22863impl TissueModelType {
22864    /// Snake-case canonical name from Profile.xlsx.
22865    pub fn as_str(&self) -> &'static str {
22866        match self {
22867            TissueModelType::Zhl16c => "zhl_16c",
22868        }
22869    }
22870
22871    /// Try to construct from the underlying numeric value.
22872    pub fn from_value(value: u8) -> Option<Self> {
22873        match value {
22874            0 => Some(TissueModelType::Zhl16c),
22875            _ => None,
22876        }
22877    }
22878
22879    /// Try to construct from the snake-case canonical name.
22880    pub fn from_str(name: &str) -> Option<Self> {
22881        match name {
22882            "zhl_16c" => Some(TissueModelType::Zhl16c),
22883            _ => None,
22884        }
22885    }
22886}
22887
22888#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
22889#[repr(u8)]
22890#[non_exhaustive]
22891pub enum DiveGasStatus {
22892    Disabled = 0,
22893    Enabled = 1,
22894    BackupOnly = 2,
22895}
22896
22897impl DiveGasStatus {
22898    /// Snake-case canonical name from Profile.xlsx.
22899    pub fn as_str(&self) -> &'static str {
22900        match self {
22901            DiveGasStatus::Disabled => "disabled",
22902            DiveGasStatus::Enabled => "enabled",
22903            DiveGasStatus::BackupOnly => "backup_only",
22904        }
22905    }
22906
22907    /// Try to construct from the underlying numeric value.
22908    pub fn from_value(value: u8) -> Option<Self> {
22909        match value {
22910            0 => Some(DiveGasStatus::Disabled),
22911            1 => Some(DiveGasStatus::Enabled),
22912            2 => Some(DiveGasStatus::BackupOnly),
22913            _ => None,
22914        }
22915    }
22916
22917    /// Try to construct from the snake-case canonical name.
22918    pub fn from_str(name: &str) -> Option<Self> {
22919        match name {
22920            "disabled" => Some(DiveGasStatus::Disabled),
22921            "enabled" => Some(DiveGasStatus::Enabled),
22922            "backup_only" => Some(DiveGasStatus::BackupOnly),
22923            _ => None,
22924        }
22925    }
22926}
22927
22928#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
22929#[repr(u8)]
22930#[non_exhaustive]
22931pub enum DiveAlert {
22932    NdlReached = 0,
22933    GasSwitchPrompted = 1,
22934    NearSurface = 2,
22935    ApproachingNdl = 3,
22936    Po2Warn = 4,
22937    Po2CritHigh = 5,
22938    Po2CritLow = 6,
22939    TimeAlert = 7,
22940    DepthAlert = 8,
22941    DecoCeilingBroken = 9,
22942    DecoComplete = 10,
22943    SafetyStopBroken = 11,
22944    SafetyStopComplete = 12,
22945    CnsWarning = 13,
22946    CnsCritical = 14,
22947    OtuWarning = 15,
22948    OtuCritical = 16,
22949    AscentCritical = 17,
22950    AlertDismissedByKey = 18,
22951    AlertDismissedByTimeout = 19,
22952    BatteryLow = 20,
22953    BatteryCritical = 21,
22954    SafetyStopStarted = 22,
22955    ApproachingFirstDecoStop = 23,
22956    SetpointSwitchAutoLow = 24,
22957    SetpointSwitchAutoHigh = 25,
22958    SetpointSwitchManualLow = 26,
22959    SetpointSwitchManualHigh = 27,
22960    AutoSetpointSwitchIgnored = 28,
22961    SwitchedToOpenCircuit = 29,
22962    SwitchedToClosedCircuit = 30,
22963    TankBatteryLow = 32,
22964    Po2CcrDilLow = 33,
22965    DecoStopCleared = 34,
22966    ApneaNeutralBuoyancy = 35,
22967    ApneaTargetDepth = 36,
22968    ApneaSurface = 37,
22969    ApneaHighSpeed = 38,
22970    ApneaLowSpeed = 39,
22971}
22972
22973impl DiveAlert {
22974    /// Snake-case canonical name from Profile.xlsx.
22975    pub fn as_str(&self) -> &'static str {
22976        match self {
22977            DiveAlert::NdlReached => "ndl_reached",
22978            DiveAlert::GasSwitchPrompted => "gas_switch_prompted",
22979            DiveAlert::NearSurface => "near_surface",
22980            DiveAlert::ApproachingNdl => "approaching_ndl",
22981            DiveAlert::Po2Warn => "po2_warn",
22982            DiveAlert::Po2CritHigh => "po2_crit_high",
22983            DiveAlert::Po2CritLow => "po2_crit_low",
22984            DiveAlert::TimeAlert => "time_alert",
22985            DiveAlert::DepthAlert => "depth_alert",
22986            DiveAlert::DecoCeilingBroken => "deco_ceiling_broken",
22987            DiveAlert::DecoComplete => "deco_complete",
22988            DiveAlert::SafetyStopBroken => "safety_stop_broken",
22989            DiveAlert::SafetyStopComplete => "safety_stop_complete",
22990            DiveAlert::CnsWarning => "cns_warning",
22991            DiveAlert::CnsCritical => "cns_critical",
22992            DiveAlert::OtuWarning => "otu_warning",
22993            DiveAlert::OtuCritical => "otu_critical",
22994            DiveAlert::AscentCritical => "ascent_critical",
22995            DiveAlert::AlertDismissedByKey => "alert_dismissed_by_key",
22996            DiveAlert::AlertDismissedByTimeout => "alert_dismissed_by_timeout",
22997            DiveAlert::BatteryLow => "battery_low",
22998            DiveAlert::BatteryCritical => "battery_critical",
22999            DiveAlert::SafetyStopStarted => "safety_stop_started",
23000            DiveAlert::ApproachingFirstDecoStop => "approaching_first_deco_stop",
23001            DiveAlert::SetpointSwitchAutoLow => "setpoint_switch_auto_low",
23002            DiveAlert::SetpointSwitchAutoHigh => "setpoint_switch_auto_high",
23003            DiveAlert::SetpointSwitchManualLow => "setpoint_switch_manual_low",
23004            DiveAlert::SetpointSwitchManualHigh => "setpoint_switch_manual_high",
23005            DiveAlert::AutoSetpointSwitchIgnored => "auto_setpoint_switch_ignored",
23006            DiveAlert::SwitchedToOpenCircuit => "switched_to_open_circuit",
23007            DiveAlert::SwitchedToClosedCircuit => "switched_to_closed_circuit",
23008            DiveAlert::TankBatteryLow => "tank_battery_low",
23009            DiveAlert::Po2CcrDilLow => "po2_ccr_dil_low",
23010            DiveAlert::DecoStopCleared => "deco_stop_cleared",
23011            DiveAlert::ApneaNeutralBuoyancy => "apnea_neutral_buoyancy",
23012            DiveAlert::ApneaTargetDepth => "apnea_target_depth",
23013            DiveAlert::ApneaSurface => "apnea_surface",
23014            DiveAlert::ApneaHighSpeed => "apnea_high_speed",
23015            DiveAlert::ApneaLowSpeed => "apnea_low_speed",
23016        }
23017    }
23018
23019    /// Try to construct from the underlying numeric value.
23020    pub fn from_value(value: u8) -> Option<Self> {
23021        match value {
23022            0 => Some(DiveAlert::NdlReached),
23023            1 => Some(DiveAlert::GasSwitchPrompted),
23024            2 => Some(DiveAlert::NearSurface),
23025            3 => Some(DiveAlert::ApproachingNdl),
23026            4 => Some(DiveAlert::Po2Warn),
23027            5 => Some(DiveAlert::Po2CritHigh),
23028            6 => Some(DiveAlert::Po2CritLow),
23029            7 => Some(DiveAlert::TimeAlert),
23030            8 => Some(DiveAlert::DepthAlert),
23031            9 => Some(DiveAlert::DecoCeilingBroken),
23032            10 => Some(DiveAlert::DecoComplete),
23033            11 => Some(DiveAlert::SafetyStopBroken),
23034            12 => Some(DiveAlert::SafetyStopComplete),
23035            13 => Some(DiveAlert::CnsWarning),
23036            14 => Some(DiveAlert::CnsCritical),
23037            15 => Some(DiveAlert::OtuWarning),
23038            16 => Some(DiveAlert::OtuCritical),
23039            17 => Some(DiveAlert::AscentCritical),
23040            18 => Some(DiveAlert::AlertDismissedByKey),
23041            19 => Some(DiveAlert::AlertDismissedByTimeout),
23042            20 => Some(DiveAlert::BatteryLow),
23043            21 => Some(DiveAlert::BatteryCritical),
23044            22 => Some(DiveAlert::SafetyStopStarted),
23045            23 => Some(DiveAlert::ApproachingFirstDecoStop),
23046            24 => Some(DiveAlert::SetpointSwitchAutoLow),
23047            25 => Some(DiveAlert::SetpointSwitchAutoHigh),
23048            26 => Some(DiveAlert::SetpointSwitchManualLow),
23049            27 => Some(DiveAlert::SetpointSwitchManualHigh),
23050            28 => Some(DiveAlert::AutoSetpointSwitchIgnored),
23051            29 => Some(DiveAlert::SwitchedToOpenCircuit),
23052            30 => Some(DiveAlert::SwitchedToClosedCircuit),
23053            32 => Some(DiveAlert::TankBatteryLow),
23054            33 => Some(DiveAlert::Po2CcrDilLow),
23055            34 => Some(DiveAlert::DecoStopCleared),
23056            35 => Some(DiveAlert::ApneaNeutralBuoyancy),
23057            36 => Some(DiveAlert::ApneaTargetDepth),
23058            37 => Some(DiveAlert::ApneaSurface),
23059            38 => Some(DiveAlert::ApneaHighSpeed),
23060            39 => Some(DiveAlert::ApneaLowSpeed),
23061            _ => None,
23062        }
23063    }
23064
23065    /// Try to construct from the snake-case canonical name.
23066    pub fn from_str(name: &str) -> Option<Self> {
23067        match name {
23068            "ndl_reached" => Some(DiveAlert::NdlReached),
23069            "gas_switch_prompted" => Some(DiveAlert::GasSwitchPrompted),
23070            "near_surface" => Some(DiveAlert::NearSurface),
23071            "approaching_ndl" => Some(DiveAlert::ApproachingNdl),
23072            "po2_warn" => Some(DiveAlert::Po2Warn),
23073            "po2_crit_high" => Some(DiveAlert::Po2CritHigh),
23074            "po2_crit_low" => Some(DiveAlert::Po2CritLow),
23075            "time_alert" => Some(DiveAlert::TimeAlert),
23076            "depth_alert" => Some(DiveAlert::DepthAlert),
23077            "deco_ceiling_broken" => Some(DiveAlert::DecoCeilingBroken),
23078            "deco_complete" => Some(DiveAlert::DecoComplete),
23079            "safety_stop_broken" => Some(DiveAlert::SafetyStopBroken),
23080            "safety_stop_complete" => Some(DiveAlert::SafetyStopComplete),
23081            "cns_warning" => Some(DiveAlert::CnsWarning),
23082            "cns_critical" => Some(DiveAlert::CnsCritical),
23083            "otu_warning" => Some(DiveAlert::OtuWarning),
23084            "otu_critical" => Some(DiveAlert::OtuCritical),
23085            "ascent_critical" => Some(DiveAlert::AscentCritical),
23086            "alert_dismissed_by_key" => Some(DiveAlert::AlertDismissedByKey),
23087            "alert_dismissed_by_timeout" => Some(DiveAlert::AlertDismissedByTimeout),
23088            "battery_low" => Some(DiveAlert::BatteryLow),
23089            "battery_critical" => Some(DiveAlert::BatteryCritical),
23090            "safety_stop_started" => Some(DiveAlert::SafetyStopStarted),
23091            "approaching_first_deco_stop" => Some(DiveAlert::ApproachingFirstDecoStop),
23092            "setpoint_switch_auto_low" => Some(DiveAlert::SetpointSwitchAutoLow),
23093            "setpoint_switch_auto_high" => Some(DiveAlert::SetpointSwitchAutoHigh),
23094            "setpoint_switch_manual_low" => Some(DiveAlert::SetpointSwitchManualLow),
23095            "setpoint_switch_manual_high" => Some(DiveAlert::SetpointSwitchManualHigh),
23096            "auto_setpoint_switch_ignored" => Some(DiveAlert::AutoSetpointSwitchIgnored),
23097            "switched_to_open_circuit" => Some(DiveAlert::SwitchedToOpenCircuit),
23098            "switched_to_closed_circuit" => Some(DiveAlert::SwitchedToClosedCircuit),
23099            "tank_battery_low" => Some(DiveAlert::TankBatteryLow),
23100            "po2_ccr_dil_low" => Some(DiveAlert::Po2CcrDilLow),
23101            "deco_stop_cleared" => Some(DiveAlert::DecoStopCleared),
23102            "apnea_neutral_buoyancy" => Some(DiveAlert::ApneaNeutralBuoyancy),
23103            "apnea_target_depth" => Some(DiveAlert::ApneaTargetDepth),
23104            "apnea_surface" => Some(DiveAlert::ApneaSurface),
23105            "apnea_high_speed" => Some(DiveAlert::ApneaHighSpeed),
23106            "apnea_low_speed" => Some(DiveAlert::ApneaLowSpeed),
23107            _ => None,
23108        }
23109    }
23110}
23111
23112#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
23113#[repr(u8)]
23114#[non_exhaustive]
23115pub enum DiveAlarmType {
23116    Depth = 0,
23117    Time = 1,
23118    Speed = 2,
23119}
23120
23121impl DiveAlarmType {
23122    /// Snake-case canonical name from Profile.xlsx.
23123    pub fn as_str(&self) -> &'static str {
23124        match self {
23125            DiveAlarmType::Depth => "depth",
23126            DiveAlarmType::Time => "time",
23127            DiveAlarmType::Speed => "speed",
23128        }
23129    }
23130
23131    /// Try to construct from the underlying numeric value.
23132    pub fn from_value(value: u8) -> Option<Self> {
23133        match value {
23134            0 => Some(DiveAlarmType::Depth),
23135            1 => Some(DiveAlarmType::Time),
23136            2 => Some(DiveAlarmType::Speed),
23137            _ => None,
23138        }
23139    }
23140
23141    /// Try to construct from the snake-case canonical name.
23142    pub fn from_str(name: &str) -> Option<Self> {
23143        match name {
23144            "depth" => Some(DiveAlarmType::Depth),
23145            "time" => Some(DiveAlarmType::Time),
23146            "speed" => Some(DiveAlarmType::Speed),
23147            _ => None,
23148        }
23149    }
23150}
23151
23152#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
23153#[repr(u8)]
23154#[non_exhaustive]
23155pub enum DiveBacklightMode {
23156    AtDepth = 0,
23157    AlwaysOn = 1,
23158}
23159
23160impl DiveBacklightMode {
23161    /// Snake-case canonical name from Profile.xlsx.
23162    pub fn as_str(&self) -> &'static str {
23163        match self {
23164            DiveBacklightMode::AtDepth => "at_depth",
23165            DiveBacklightMode::AlwaysOn => "always_on",
23166        }
23167    }
23168
23169    /// Try to construct from the underlying numeric value.
23170    pub fn from_value(value: u8) -> Option<Self> {
23171        match value {
23172            0 => Some(DiveBacklightMode::AtDepth),
23173            1 => Some(DiveBacklightMode::AlwaysOn),
23174            _ => None,
23175        }
23176    }
23177
23178    /// Try to construct from the snake-case canonical name.
23179    pub fn from_str(name: &str) -> Option<Self> {
23180        match name {
23181            "at_depth" => Some(DiveBacklightMode::AtDepth),
23182            "always_on" => Some(DiveBacklightMode::AlwaysOn),
23183            _ => None,
23184        }
23185    }
23186}
23187
23188#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
23189#[repr(u8)]
23190#[non_exhaustive]
23191pub enum SleepLevel {
23192    Unmeasurable = 0,
23193    Awake = 1,
23194    Light = 2,
23195    Deep = 3,
23196    Rem = 4,
23197}
23198
23199impl SleepLevel {
23200    /// Snake-case canonical name from Profile.xlsx.
23201    pub fn as_str(&self) -> &'static str {
23202        match self {
23203            SleepLevel::Unmeasurable => "unmeasurable",
23204            SleepLevel::Awake => "awake",
23205            SleepLevel::Light => "light",
23206            SleepLevel::Deep => "deep",
23207            SleepLevel::Rem => "rem",
23208        }
23209    }
23210
23211    /// Try to construct from the underlying numeric value.
23212    pub fn from_value(value: u8) -> Option<Self> {
23213        match value {
23214            0 => Some(SleepLevel::Unmeasurable),
23215            1 => Some(SleepLevel::Awake),
23216            2 => Some(SleepLevel::Light),
23217            3 => Some(SleepLevel::Deep),
23218            4 => Some(SleepLevel::Rem),
23219            _ => None,
23220        }
23221    }
23222
23223    /// Try to construct from the snake-case canonical name.
23224    pub fn from_str(name: &str) -> Option<Self> {
23225        match name {
23226            "unmeasurable" => Some(SleepLevel::Unmeasurable),
23227            "awake" => Some(SleepLevel::Awake),
23228            "light" => Some(SleepLevel::Light),
23229            "deep" => Some(SleepLevel::Deep),
23230            "rem" => Some(SleepLevel::Rem),
23231            _ => None,
23232        }
23233    }
23234}
23235
23236#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
23237#[repr(u8)]
23238#[non_exhaustive]
23239pub enum Spo2MeasurementType {
23240    OffWrist = 0,
23241    SpotCheck = 1,
23242    ContinuousCheck = 2,
23243    Periodic = 3,
23244}
23245
23246impl Spo2MeasurementType {
23247    /// Snake-case canonical name from Profile.xlsx.
23248    pub fn as_str(&self) -> &'static str {
23249        match self {
23250            Spo2MeasurementType::OffWrist => "off_wrist",
23251            Spo2MeasurementType::SpotCheck => "spot_check",
23252            Spo2MeasurementType::ContinuousCheck => "continuous_check",
23253            Spo2MeasurementType::Periodic => "periodic",
23254        }
23255    }
23256
23257    /// Try to construct from the underlying numeric value.
23258    pub fn from_value(value: u8) -> Option<Self> {
23259        match value {
23260            0 => Some(Spo2MeasurementType::OffWrist),
23261            1 => Some(Spo2MeasurementType::SpotCheck),
23262            2 => Some(Spo2MeasurementType::ContinuousCheck),
23263            3 => Some(Spo2MeasurementType::Periodic),
23264            _ => None,
23265        }
23266    }
23267
23268    /// Try to construct from the snake-case canonical name.
23269    pub fn from_str(name: &str) -> Option<Self> {
23270        match name {
23271            "off_wrist" => Some(Spo2MeasurementType::OffWrist),
23272            "spot_check" => Some(Spo2MeasurementType::SpotCheck),
23273            "continuous_check" => Some(Spo2MeasurementType::ContinuousCheck),
23274            "periodic" => Some(Spo2MeasurementType::Periodic),
23275            _ => None,
23276        }
23277    }
23278}
23279
23280#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
23281#[repr(u8)]
23282#[non_exhaustive]
23283pub enum CcrSetpointSwitchMode {
23284    Manual = 0,
23285    Automatic = 1,
23286}
23287
23288impl CcrSetpointSwitchMode {
23289    /// Snake-case canonical name from Profile.xlsx.
23290    pub fn as_str(&self) -> &'static str {
23291        match self {
23292            CcrSetpointSwitchMode::Manual => "manual",
23293            CcrSetpointSwitchMode::Automatic => "automatic",
23294        }
23295    }
23296
23297    /// Try to construct from the underlying numeric value.
23298    pub fn from_value(value: u8) -> Option<Self> {
23299        match value {
23300            0 => Some(CcrSetpointSwitchMode::Manual),
23301            1 => Some(CcrSetpointSwitchMode::Automatic),
23302            _ => None,
23303        }
23304    }
23305
23306    /// Try to construct from the snake-case canonical name.
23307    pub fn from_str(name: &str) -> Option<Self> {
23308        match name {
23309            "manual" => Some(CcrSetpointSwitchMode::Manual),
23310            "automatic" => Some(CcrSetpointSwitchMode::Automatic),
23311            _ => None,
23312        }
23313    }
23314}
23315
23316#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
23317#[repr(u8)]
23318#[non_exhaustive]
23319pub enum DiveGasMode {
23320    OpenCircuit = 0,
23321    ClosedCircuitDiluent = 1,
23322}
23323
23324impl DiveGasMode {
23325    /// Snake-case canonical name from Profile.xlsx.
23326    pub fn as_str(&self) -> &'static str {
23327        match self {
23328            DiveGasMode::OpenCircuit => "open_circuit",
23329            DiveGasMode::ClosedCircuitDiluent => "closed_circuit_diluent",
23330        }
23331    }
23332
23333    /// Try to construct from the underlying numeric value.
23334    pub fn from_value(value: u8) -> Option<Self> {
23335        match value {
23336            0 => Some(DiveGasMode::OpenCircuit),
23337            1 => Some(DiveGasMode::ClosedCircuitDiluent),
23338            _ => None,
23339        }
23340    }
23341
23342    /// Try to construct from the snake-case canonical name.
23343    pub fn from_str(name: &str) -> Option<Self> {
23344        match name {
23345            "open_circuit" => Some(DiveGasMode::OpenCircuit),
23346            "closed_circuit_diluent" => Some(DiveGasMode::ClosedCircuitDiluent),
23347            _ => None,
23348        }
23349    }
23350}
23351
23352#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
23353#[repr(u8)]
23354#[non_exhaustive]
23355pub enum ProjectileType {
23356    Arrow = 0,
23357    RifleCartridge = 1,
23358    PistolCartridge = 2,
23359    Shotshell = 3,
23360    AirRiflePellet = 4,
23361    Other = 5,
23362}
23363
23364impl ProjectileType {
23365    /// Snake-case canonical name from Profile.xlsx.
23366    pub fn as_str(&self) -> &'static str {
23367        match self {
23368            ProjectileType::Arrow => "arrow",
23369            ProjectileType::RifleCartridge => "rifle_cartridge",
23370            ProjectileType::PistolCartridge => "pistol_cartridge",
23371            ProjectileType::Shotshell => "shotshell",
23372            ProjectileType::AirRiflePellet => "air_rifle_pellet",
23373            ProjectileType::Other => "other",
23374        }
23375    }
23376
23377    /// Try to construct from the underlying numeric value.
23378    pub fn from_value(value: u8) -> Option<Self> {
23379        match value {
23380            0 => Some(ProjectileType::Arrow),
23381            1 => Some(ProjectileType::RifleCartridge),
23382            2 => Some(ProjectileType::PistolCartridge),
23383            3 => Some(ProjectileType::Shotshell),
23384            4 => Some(ProjectileType::AirRiflePellet),
23385            5 => Some(ProjectileType::Other),
23386            _ => None,
23387        }
23388    }
23389
23390    /// Try to construct from the snake-case canonical name.
23391    pub fn from_str(name: &str) -> Option<Self> {
23392        match name {
23393            "arrow" => Some(ProjectileType::Arrow),
23394            "rifle_cartridge" => Some(ProjectileType::RifleCartridge),
23395            "pistol_cartridge" => Some(ProjectileType::PistolCartridge),
23396            "shotshell" => Some(ProjectileType::Shotshell),
23397            "air_rifle_pellet" => Some(ProjectileType::AirRiflePellet),
23398            "other" => Some(ProjectileType::Other),
23399            _ => None,
23400        }
23401    }
23402}
23403
23404#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
23405#[repr(u16)]
23406#[non_exhaustive]
23407pub enum FaveroProduct {
23408    AssiomaUno = 10,
23409    AssiomaDuo = 12,
23410}
23411
23412impl FaveroProduct {
23413    /// Snake-case canonical name from Profile.xlsx.
23414    pub fn as_str(&self) -> &'static str {
23415        match self {
23416            FaveroProduct::AssiomaUno => "assioma_uno",
23417            FaveroProduct::AssiomaDuo => "assioma_duo",
23418        }
23419    }
23420
23421    /// Try to construct from the underlying numeric value.
23422    pub fn from_value(value: u16) -> Option<Self> {
23423        match value {
23424            10 => Some(FaveroProduct::AssiomaUno),
23425            12 => Some(FaveroProduct::AssiomaDuo),
23426            _ => None,
23427        }
23428    }
23429
23430    /// Try to construct from the snake-case canonical name.
23431    pub fn from_str(name: &str) -> Option<Self> {
23432        match name {
23433            "assioma_uno" => Some(FaveroProduct::AssiomaUno),
23434            "assioma_duo" => Some(FaveroProduct::AssiomaDuo),
23435            _ => None,
23436        }
23437    }
23438}
23439
23440#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
23441#[repr(u8)]
23442#[non_exhaustive]
23443pub enum SplitType {
23444    AscentSplit = 1,
23445    DescentSplit = 2,
23446    IntervalActive = 3,
23447    IntervalRest = 4,
23448    IntervalWarmup = 5,
23449    IntervalCooldown = 6,
23450    IntervalRecovery = 7,
23451    IntervalOther = 8,
23452    ClimbActive = 9,
23453    ClimbRest = 10,
23454    SurfActive = 11,
23455    RunActive = 12,
23456    RunRest = 13,
23457    WorkoutRound = 14,
23458    RwdRun = 17,
23459    RwdWalk = 18,
23460    WindsurfActive = 21,
23461    RwdStand = 22,
23462    Transition = 23,
23463    SkiLiftSplit = 28,
23464    SkiRunSplit = 29,
23465}
23466
23467impl SplitType {
23468    /// Snake-case canonical name from Profile.xlsx.
23469    pub fn as_str(&self) -> &'static str {
23470        match self {
23471            SplitType::AscentSplit => "ascent_split",
23472            SplitType::DescentSplit => "descent_split",
23473            SplitType::IntervalActive => "interval_active",
23474            SplitType::IntervalRest => "interval_rest",
23475            SplitType::IntervalWarmup => "interval_warmup",
23476            SplitType::IntervalCooldown => "interval_cooldown",
23477            SplitType::IntervalRecovery => "interval_recovery",
23478            SplitType::IntervalOther => "interval_other",
23479            SplitType::ClimbActive => "climb_active",
23480            SplitType::ClimbRest => "climb_rest",
23481            SplitType::SurfActive => "surf_active",
23482            SplitType::RunActive => "run_active",
23483            SplitType::RunRest => "run_rest",
23484            SplitType::WorkoutRound => "workout_round",
23485            SplitType::RwdRun => "rwd_run",
23486            SplitType::RwdWalk => "rwd_walk",
23487            SplitType::WindsurfActive => "windsurf_active",
23488            SplitType::RwdStand => "rwd_stand",
23489            SplitType::Transition => "transition",
23490            SplitType::SkiLiftSplit => "ski_lift_split",
23491            SplitType::SkiRunSplit => "ski_run_split",
23492        }
23493    }
23494
23495    /// Try to construct from the underlying numeric value.
23496    pub fn from_value(value: u8) -> Option<Self> {
23497        match value {
23498            1 => Some(SplitType::AscentSplit),
23499            2 => Some(SplitType::DescentSplit),
23500            3 => Some(SplitType::IntervalActive),
23501            4 => Some(SplitType::IntervalRest),
23502            5 => Some(SplitType::IntervalWarmup),
23503            6 => Some(SplitType::IntervalCooldown),
23504            7 => Some(SplitType::IntervalRecovery),
23505            8 => Some(SplitType::IntervalOther),
23506            9 => Some(SplitType::ClimbActive),
23507            10 => Some(SplitType::ClimbRest),
23508            11 => Some(SplitType::SurfActive),
23509            12 => Some(SplitType::RunActive),
23510            13 => Some(SplitType::RunRest),
23511            14 => Some(SplitType::WorkoutRound),
23512            17 => Some(SplitType::RwdRun),
23513            18 => Some(SplitType::RwdWalk),
23514            21 => Some(SplitType::WindsurfActive),
23515            22 => Some(SplitType::RwdStand),
23516            23 => Some(SplitType::Transition),
23517            28 => Some(SplitType::SkiLiftSplit),
23518            29 => Some(SplitType::SkiRunSplit),
23519            _ => None,
23520        }
23521    }
23522
23523    /// Try to construct from the snake-case canonical name.
23524    pub fn from_str(name: &str) -> Option<Self> {
23525        match name {
23526            "ascent_split" => Some(SplitType::AscentSplit),
23527            "descent_split" => Some(SplitType::DescentSplit),
23528            "interval_active" => Some(SplitType::IntervalActive),
23529            "interval_rest" => Some(SplitType::IntervalRest),
23530            "interval_warmup" => Some(SplitType::IntervalWarmup),
23531            "interval_cooldown" => Some(SplitType::IntervalCooldown),
23532            "interval_recovery" => Some(SplitType::IntervalRecovery),
23533            "interval_other" => Some(SplitType::IntervalOther),
23534            "climb_active" => Some(SplitType::ClimbActive),
23535            "climb_rest" => Some(SplitType::ClimbRest),
23536            "surf_active" => Some(SplitType::SurfActive),
23537            "run_active" => Some(SplitType::RunActive),
23538            "run_rest" => Some(SplitType::RunRest),
23539            "workout_round" => Some(SplitType::WorkoutRound),
23540            "rwd_run" => Some(SplitType::RwdRun),
23541            "rwd_walk" => Some(SplitType::RwdWalk),
23542            "windsurf_active" => Some(SplitType::WindsurfActive),
23543            "rwd_stand" => Some(SplitType::RwdStand),
23544            "transition" => Some(SplitType::Transition),
23545            "ski_lift_split" => Some(SplitType::SkiLiftSplit),
23546            "ski_run_split" => Some(SplitType::SkiRunSplit),
23547            _ => None,
23548        }
23549    }
23550}
23551
23552#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
23553#[repr(u8)]
23554#[non_exhaustive]
23555pub enum ClimbProEvent {
23556    Approach = 0,
23557    Start = 1,
23558    Complete = 2,
23559}
23560
23561impl ClimbProEvent {
23562    /// Snake-case canonical name from Profile.xlsx.
23563    pub fn as_str(&self) -> &'static str {
23564        match self {
23565            ClimbProEvent::Approach => "approach",
23566            ClimbProEvent::Start => "start",
23567            ClimbProEvent::Complete => "complete",
23568        }
23569    }
23570
23571    /// Try to construct from the underlying numeric value.
23572    pub fn from_value(value: u8) -> Option<Self> {
23573        match value {
23574            0 => Some(ClimbProEvent::Approach),
23575            1 => Some(ClimbProEvent::Start),
23576            2 => Some(ClimbProEvent::Complete),
23577            _ => None,
23578        }
23579    }
23580
23581    /// Try to construct from the snake-case canonical name.
23582    pub fn from_str(name: &str) -> Option<Self> {
23583        match name {
23584            "approach" => Some(ClimbProEvent::Approach),
23585            "start" => Some(ClimbProEvent::Start),
23586            "complete" => Some(ClimbProEvent::Complete),
23587            _ => None,
23588        }
23589    }
23590}
23591
23592#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
23593#[repr(u8)]
23594#[non_exhaustive]
23595pub enum GasConsumptionRateType {
23596    PressureSac = 0,
23597    VolumeSac = 1,
23598    Rmv = 2,
23599}
23600
23601impl GasConsumptionRateType {
23602    /// Snake-case canonical name from Profile.xlsx.
23603    pub fn as_str(&self) -> &'static str {
23604        match self {
23605            GasConsumptionRateType::PressureSac => "pressure_sac",
23606            GasConsumptionRateType::VolumeSac => "volume_sac",
23607            GasConsumptionRateType::Rmv => "rmv",
23608        }
23609    }
23610
23611    /// Try to construct from the underlying numeric value.
23612    pub fn from_value(value: u8) -> Option<Self> {
23613        match value {
23614            0 => Some(GasConsumptionRateType::PressureSac),
23615            1 => Some(GasConsumptionRateType::VolumeSac),
23616            2 => Some(GasConsumptionRateType::Rmv),
23617            _ => None,
23618        }
23619    }
23620
23621    /// Try to construct from the snake-case canonical name.
23622    pub fn from_str(name: &str) -> Option<Self> {
23623        match name {
23624            "pressure_sac" => Some(GasConsumptionRateType::PressureSac),
23625            "volume_sac" => Some(GasConsumptionRateType::VolumeSac),
23626            "rmv" => Some(GasConsumptionRateType::Rmv),
23627            _ => None,
23628        }
23629    }
23630}
23631
23632#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
23633#[repr(u8)]
23634#[non_exhaustive]
23635pub enum TapSensitivity {
23636    High = 0,
23637    Medium = 1,
23638    Low = 2,
23639}
23640
23641impl TapSensitivity {
23642    /// Snake-case canonical name from Profile.xlsx.
23643    pub fn as_str(&self) -> &'static str {
23644        match self {
23645            TapSensitivity::High => "high",
23646            TapSensitivity::Medium => "medium",
23647            TapSensitivity::Low => "low",
23648        }
23649    }
23650
23651    /// Try to construct from the underlying numeric value.
23652    pub fn from_value(value: u8) -> Option<Self> {
23653        match value {
23654            0 => Some(TapSensitivity::High),
23655            1 => Some(TapSensitivity::Medium),
23656            2 => Some(TapSensitivity::Low),
23657            _ => None,
23658        }
23659    }
23660
23661    /// Try to construct from the snake-case canonical name.
23662    pub fn from_str(name: &str) -> Option<Self> {
23663        match name {
23664            "high" => Some(TapSensitivity::High),
23665            "medium" => Some(TapSensitivity::Medium),
23666            "low" => Some(TapSensitivity::Low),
23667            _ => None,
23668        }
23669    }
23670}
23671
23672#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
23673#[repr(u8)]
23674#[non_exhaustive]
23675pub enum RadarThreatLevelType {
23676    ThreatUnknown = 0,
23677    ThreatNone = 1,
23678    ThreatApproaching = 2,
23679    ThreatApproachingFast = 3,
23680}
23681
23682impl RadarThreatLevelType {
23683    /// Snake-case canonical name from Profile.xlsx.
23684    pub fn as_str(&self) -> &'static str {
23685        match self {
23686            RadarThreatLevelType::ThreatUnknown => "threat_unknown",
23687            RadarThreatLevelType::ThreatNone => "threat_none",
23688            RadarThreatLevelType::ThreatApproaching => "threat_approaching",
23689            RadarThreatLevelType::ThreatApproachingFast => "threat_approaching_fast",
23690        }
23691    }
23692
23693    /// Try to construct from the underlying numeric value.
23694    pub fn from_value(value: u8) -> Option<Self> {
23695        match value {
23696            0 => Some(RadarThreatLevelType::ThreatUnknown),
23697            1 => Some(RadarThreatLevelType::ThreatNone),
23698            2 => Some(RadarThreatLevelType::ThreatApproaching),
23699            3 => Some(RadarThreatLevelType::ThreatApproachingFast),
23700            _ => None,
23701        }
23702    }
23703
23704    /// Try to construct from the snake-case canonical name.
23705    pub fn from_str(name: &str) -> Option<Self> {
23706        match name {
23707            "threat_unknown" => Some(RadarThreatLevelType::ThreatUnknown),
23708            "threat_none" => Some(RadarThreatLevelType::ThreatNone),
23709            "threat_approaching" => Some(RadarThreatLevelType::ThreatApproaching),
23710            "threat_approaching_fast" => Some(RadarThreatLevelType::ThreatApproachingFast),
23711            _ => None,
23712        }
23713    }
23714}
23715
23716#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
23717#[repr(u8)]
23718#[non_exhaustive]
23719pub enum SleepDisruptionSeverity {
23720    None = 0,
23721    Low = 1,
23722    Medium = 2,
23723    High = 3,
23724}
23725
23726impl SleepDisruptionSeverity {
23727    /// Snake-case canonical name from Profile.xlsx.
23728    pub fn as_str(&self) -> &'static str {
23729        match self {
23730            SleepDisruptionSeverity::None => "none",
23731            SleepDisruptionSeverity::Low => "low",
23732            SleepDisruptionSeverity::Medium => "medium",
23733            SleepDisruptionSeverity::High => "high",
23734        }
23735    }
23736
23737    /// Try to construct from the underlying numeric value.
23738    pub fn from_value(value: u8) -> Option<Self> {
23739        match value {
23740            0 => Some(SleepDisruptionSeverity::None),
23741            1 => Some(SleepDisruptionSeverity::Low),
23742            2 => Some(SleepDisruptionSeverity::Medium),
23743            3 => Some(SleepDisruptionSeverity::High),
23744            _ => None,
23745        }
23746    }
23747
23748    /// Try to construct from the snake-case canonical name.
23749    pub fn from_str(name: &str) -> Option<Self> {
23750        match name {
23751            "none" => Some(SleepDisruptionSeverity::None),
23752            "low" => Some(SleepDisruptionSeverity::Low),
23753            "medium" => Some(SleepDisruptionSeverity::Medium),
23754            "high" => Some(SleepDisruptionSeverity::High),
23755            _ => None,
23756        }
23757    }
23758}
23759
23760#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
23761#[repr(u8)]
23762#[non_exhaustive]
23763pub enum NapPeriodFeedback {
23764    None = 0,
23765    MultipleNapsDuringDay = 1,
23766    JetlagIdealTimingIdealDuration = 2,
23767    JetlagIdealTimingLongDuration = 3,
23768    JetlagLateTimingIdealDuration = 4,
23769    JetlagLateTimingLongDuration = 5,
23770    IdealTimingIdealDurationLowNeed = 6,
23771    IdealTimingIdealDurationHighNeed = 7,
23772    IdealTimingLongDurationLowNeed = 8,
23773    IdealTimingLongDurationHighNeed = 9,
23774    LateTimingIdealDurationLowNeed = 10,
23775    LateTimingIdealDurationHighNeed = 11,
23776    LateTimingLongDurationLowNeed = 12,
23777    LateTimingLongDurationHighNeed = 13,
23778    IdealDurationLowNeed = 14,
23779    IdealDurationHighNeed = 15,
23780    LongDurationLowNeed = 16,
23781    LongDurationHighNeed = 17,
23782}
23783
23784impl NapPeriodFeedback {
23785    /// Snake-case canonical name from Profile.xlsx.
23786    pub fn as_str(&self) -> &'static str {
23787        match self {
23788            NapPeriodFeedback::None => "none",
23789            NapPeriodFeedback::MultipleNapsDuringDay => "multiple_naps_during_day",
23790            NapPeriodFeedback::JetlagIdealTimingIdealDuration => {
23791                "jetlag_ideal_timing_ideal_duration"
23792            }
23793            NapPeriodFeedback::JetlagIdealTimingLongDuration => "jetlag_ideal_timing_long_duration",
23794            NapPeriodFeedback::JetlagLateTimingIdealDuration => "jetlag_late_timing_ideal_duration",
23795            NapPeriodFeedback::JetlagLateTimingLongDuration => "jetlag_late_timing_long_duration",
23796            NapPeriodFeedback::IdealTimingIdealDurationLowNeed => {
23797                "ideal_timing_ideal_duration_low_need"
23798            }
23799            NapPeriodFeedback::IdealTimingIdealDurationHighNeed => {
23800                "ideal_timing_ideal_duration_high_need"
23801            }
23802            NapPeriodFeedback::IdealTimingLongDurationLowNeed => {
23803                "ideal_timing_long_duration_low_need"
23804            }
23805            NapPeriodFeedback::IdealTimingLongDurationHighNeed => {
23806                "ideal_timing_long_duration_high_need"
23807            }
23808            NapPeriodFeedback::LateTimingIdealDurationLowNeed => {
23809                "late_timing_ideal_duration_low_need"
23810            }
23811            NapPeriodFeedback::LateTimingIdealDurationHighNeed => {
23812                "late_timing_ideal_duration_high_need"
23813            }
23814            NapPeriodFeedback::LateTimingLongDurationLowNeed => {
23815                "late_timing_long_duration_low_need"
23816            }
23817            NapPeriodFeedback::LateTimingLongDurationHighNeed => {
23818                "late_timing_long_duration_high_need"
23819            }
23820            NapPeriodFeedback::IdealDurationLowNeed => "ideal_duration_low_need",
23821            NapPeriodFeedback::IdealDurationHighNeed => "ideal_duration_high_need",
23822            NapPeriodFeedback::LongDurationLowNeed => "long_duration_low_need",
23823            NapPeriodFeedback::LongDurationHighNeed => "long_duration_high_need",
23824        }
23825    }
23826
23827    /// Try to construct from the underlying numeric value.
23828    pub fn from_value(value: u8) -> Option<Self> {
23829        match value {
23830            0 => Some(NapPeriodFeedback::None),
23831            1 => Some(NapPeriodFeedback::MultipleNapsDuringDay),
23832            2 => Some(NapPeriodFeedback::JetlagIdealTimingIdealDuration),
23833            3 => Some(NapPeriodFeedback::JetlagIdealTimingLongDuration),
23834            4 => Some(NapPeriodFeedback::JetlagLateTimingIdealDuration),
23835            5 => Some(NapPeriodFeedback::JetlagLateTimingLongDuration),
23836            6 => Some(NapPeriodFeedback::IdealTimingIdealDurationLowNeed),
23837            7 => Some(NapPeriodFeedback::IdealTimingIdealDurationHighNeed),
23838            8 => Some(NapPeriodFeedback::IdealTimingLongDurationLowNeed),
23839            9 => Some(NapPeriodFeedback::IdealTimingLongDurationHighNeed),
23840            10 => Some(NapPeriodFeedback::LateTimingIdealDurationLowNeed),
23841            11 => Some(NapPeriodFeedback::LateTimingIdealDurationHighNeed),
23842            12 => Some(NapPeriodFeedback::LateTimingLongDurationLowNeed),
23843            13 => Some(NapPeriodFeedback::LateTimingLongDurationHighNeed),
23844            14 => Some(NapPeriodFeedback::IdealDurationLowNeed),
23845            15 => Some(NapPeriodFeedback::IdealDurationHighNeed),
23846            16 => Some(NapPeriodFeedback::LongDurationLowNeed),
23847            17 => Some(NapPeriodFeedback::LongDurationHighNeed),
23848            _ => None,
23849        }
23850    }
23851
23852    /// Try to construct from the snake-case canonical name.
23853    pub fn from_str(name: &str) -> Option<Self> {
23854        match name {
23855            "none" => Some(NapPeriodFeedback::None),
23856            "multiple_naps_during_day" => Some(NapPeriodFeedback::MultipleNapsDuringDay),
23857            "jetlag_ideal_timing_ideal_duration" => {
23858                Some(NapPeriodFeedback::JetlagIdealTimingIdealDuration)
23859            }
23860            "jetlag_ideal_timing_long_duration" => {
23861                Some(NapPeriodFeedback::JetlagIdealTimingLongDuration)
23862            }
23863            "jetlag_late_timing_ideal_duration" => {
23864                Some(NapPeriodFeedback::JetlagLateTimingIdealDuration)
23865            }
23866            "jetlag_late_timing_long_duration" => {
23867                Some(NapPeriodFeedback::JetlagLateTimingLongDuration)
23868            }
23869            "ideal_timing_ideal_duration_low_need" => {
23870                Some(NapPeriodFeedback::IdealTimingIdealDurationLowNeed)
23871            }
23872            "ideal_timing_ideal_duration_high_need" => {
23873                Some(NapPeriodFeedback::IdealTimingIdealDurationHighNeed)
23874            }
23875            "ideal_timing_long_duration_low_need" => {
23876                Some(NapPeriodFeedback::IdealTimingLongDurationLowNeed)
23877            }
23878            "ideal_timing_long_duration_high_need" => {
23879                Some(NapPeriodFeedback::IdealTimingLongDurationHighNeed)
23880            }
23881            "late_timing_ideal_duration_low_need" => {
23882                Some(NapPeriodFeedback::LateTimingIdealDurationLowNeed)
23883            }
23884            "late_timing_ideal_duration_high_need" => {
23885                Some(NapPeriodFeedback::LateTimingIdealDurationHighNeed)
23886            }
23887            "late_timing_long_duration_low_need" => {
23888                Some(NapPeriodFeedback::LateTimingLongDurationLowNeed)
23889            }
23890            "late_timing_long_duration_high_need" => {
23891                Some(NapPeriodFeedback::LateTimingLongDurationHighNeed)
23892            }
23893            "ideal_duration_low_need" => Some(NapPeriodFeedback::IdealDurationLowNeed),
23894            "ideal_duration_high_need" => Some(NapPeriodFeedback::IdealDurationHighNeed),
23895            "long_duration_low_need" => Some(NapPeriodFeedback::LongDurationLowNeed),
23896            "long_duration_high_need" => Some(NapPeriodFeedback::LongDurationHighNeed),
23897            _ => None,
23898        }
23899    }
23900}
23901
23902#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
23903#[repr(u8)]
23904#[non_exhaustive]
23905pub enum NapSource {
23906    Automatic = 0,
23907    ManualDevice = 1,
23908    ManualGc = 2,
23909}
23910
23911impl NapSource {
23912    /// Snake-case canonical name from Profile.xlsx.
23913    pub fn as_str(&self) -> &'static str {
23914        match self {
23915            NapSource::Automatic => "automatic",
23916            NapSource::ManualDevice => "manual_device",
23917            NapSource::ManualGc => "manual_gc",
23918        }
23919    }
23920
23921    /// Try to construct from the underlying numeric value.
23922    pub fn from_value(value: u8) -> Option<Self> {
23923        match value {
23924            0 => Some(NapSource::Automatic),
23925            1 => Some(NapSource::ManualDevice),
23926            2 => Some(NapSource::ManualGc),
23927            _ => None,
23928        }
23929    }
23930
23931    /// Try to construct from the snake-case canonical name.
23932    pub fn from_str(name: &str) -> Option<Self> {
23933        match name {
23934            "automatic" => Some(NapSource::Automatic),
23935            "manual_device" => Some(NapSource::ManualDevice),
23936            "manual_gc" => Some(NapSource::ManualGc),
23937            _ => None,
23938        }
23939    }
23940}
23941
23942#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
23943#[repr(u8)]
23944#[non_exhaustive]
23945pub enum MaxMetSpeedSource {
23946    OnboardGps = 0,
23947    ConnectedGps = 1,
23948    Cadence = 2,
23949}
23950
23951impl MaxMetSpeedSource {
23952    /// Snake-case canonical name from Profile.xlsx.
23953    pub fn as_str(&self) -> &'static str {
23954        match self {
23955            MaxMetSpeedSource::OnboardGps => "onboard_gps",
23956            MaxMetSpeedSource::ConnectedGps => "connected_gps",
23957            MaxMetSpeedSource::Cadence => "cadence",
23958        }
23959    }
23960
23961    /// Try to construct from the underlying numeric value.
23962    pub fn from_value(value: u8) -> Option<Self> {
23963        match value {
23964            0 => Some(MaxMetSpeedSource::OnboardGps),
23965            1 => Some(MaxMetSpeedSource::ConnectedGps),
23966            2 => Some(MaxMetSpeedSource::Cadence),
23967            _ => None,
23968        }
23969    }
23970
23971    /// Try to construct from the snake-case canonical name.
23972    pub fn from_str(name: &str) -> Option<Self> {
23973        match name {
23974            "onboard_gps" => Some(MaxMetSpeedSource::OnboardGps),
23975            "connected_gps" => Some(MaxMetSpeedSource::ConnectedGps),
23976            "cadence" => Some(MaxMetSpeedSource::Cadence),
23977            _ => None,
23978        }
23979    }
23980}
23981
23982#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
23983#[repr(u8)]
23984#[non_exhaustive]
23985pub enum MaxMetHeartRateSource {
23986    Whr = 0,
23987    Hrm = 1,
23988}
23989
23990impl MaxMetHeartRateSource {
23991    /// Snake-case canonical name from Profile.xlsx.
23992    pub fn as_str(&self) -> &'static str {
23993        match self {
23994            MaxMetHeartRateSource::Whr => "whr",
23995            MaxMetHeartRateSource::Hrm => "hrm",
23996        }
23997    }
23998
23999    /// Try to construct from the underlying numeric value.
24000    pub fn from_value(value: u8) -> Option<Self> {
24001        match value {
24002            0 => Some(MaxMetHeartRateSource::Whr),
24003            1 => Some(MaxMetHeartRateSource::Hrm),
24004            _ => None,
24005        }
24006    }
24007
24008    /// Try to construct from the snake-case canonical name.
24009    pub fn from_str(name: &str) -> Option<Self> {
24010        match name {
24011            "whr" => Some(MaxMetHeartRateSource::Whr),
24012            "hrm" => Some(MaxMetHeartRateSource::Hrm),
24013            _ => None,
24014        }
24015    }
24016}
24017
24018#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
24019#[repr(u8)]
24020#[non_exhaustive]
24021pub enum HrvStatus {
24022    None = 0,
24023    Poor = 1,
24024    Low = 2,
24025    Unbalanced = 3,
24026    Balanced = 4,
24027}
24028
24029impl HrvStatus {
24030    /// Snake-case canonical name from Profile.xlsx.
24031    pub fn as_str(&self) -> &'static str {
24032        match self {
24033            HrvStatus::None => "none",
24034            HrvStatus::Poor => "poor",
24035            HrvStatus::Low => "low",
24036            HrvStatus::Unbalanced => "unbalanced",
24037            HrvStatus::Balanced => "balanced",
24038        }
24039    }
24040
24041    /// Try to construct from the underlying numeric value.
24042    pub fn from_value(value: u8) -> Option<Self> {
24043        match value {
24044            0 => Some(HrvStatus::None),
24045            1 => Some(HrvStatus::Poor),
24046            2 => Some(HrvStatus::Low),
24047            3 => Some(HrvStatus::Unbalanced),
24048            4 => Some(HrvStatus::Balanced),
24049            _ => None,
24050        }
24051    }
24052
24053    /// Try to construct from the snake-case canonical name.
24054    pub fn from_str(name: &str) -> Option<Self> {
24055        match name {
24056            "none" => Some(HrvStatus::None),
24057            "poor" => Some(HrvStatus::Poor),
24058            "low" => Some(HrvStatus::Low),
24059            "unbalanced" => Some(HrvStatus::Unbalanced),
24060            "balanced" => Some(HrvStatus::Balanced),
24061            _ => None,
24062        }
24063    }
24064}
24065
24066#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
24067#[repr(u8)]
24068#[non_exhaustive]
24069pub enum NoFlyTimeMode {
24070    Standard = 0,
24071    Flat24Hours = 1,
24072}
24073
24074impl NoFlyTimeMode {
24075    /// Snake-case canonical name from Profile.xlsx.
24076    pub fn as_str(&self) -> &'static str {
24077        match self {
24078            NoFlyTimeMode::Standard => "standard",
24079            NoFlyTimeMode::Flat24Hours => "flat_24_hours",
24080        }
24081    }
24082
24083    /// Try to construct from the underlying numeric value.
24084    pub fn from_value(value: u8) -> Option<Self> {
24085        match value {
24086            0 => Some(NoFlyTimeMode::Standard),
24087            1 => Some(NoFlyTimeMode::Flat24Hours),
24088            _ => None,
24089        }
24090    }
24091
24092    /// Try to construct from the snake-case canonical name.
24093    pub fn from_str(name: &str) -> Option<Self> {
24094        match name {
24095            "standard" => Some(NoFlyTimeMode::Standard),
24096            "flat_24_hours" => Some(NoFlyTimeMode::Flat24Hours),
24097            _ => None,
24098        }
24099    }
24100}
24101
24102/// Resolve the canonical snake_case name for `(type_name, value)`. Used by
24103/// the M5 transform pipeline when `convert_types_to_strings` is enabled.
24104pub fn enum_str_by_value(type_name: &str, value: u64) -> Option<&'static str> {
24105    match type_name {
24106        "mesg_num" => MesgNum::from_value(value as u16).map(|v| v.as_str()),
24107        "file" => File::from_value(value as u8).map(|v| v.as_str()),
24108        "checksum" => Checksum::from_value(value as u8).map(|v| v.as_str()),
24109        "file_flags" => FileFlags::from_value(value as u8).map(|v| v.as_str()),
24110        "mesg_count" => MesgCount::from_value(value as u8).map(|v| v.as_str()),
24111        "date_time" => DateTime::from_value(value as u32).map(|v| v.as_str()),
24112        "local_date_time" => LocalDateTime::from_value(value as u32).map(|v| v.as_str()),
24113        "message_index" => MessageIndex::from_value(value as u16).map(|v| v.as_str()),
24114        "device_index" => DeviceIndex::from_value(value as u8).map(|v| v.as_str()),
24115        "gender" => Gender::from_value(value as u8).map(|v| v.as_str()),
24116        "language" => Language::from_value(value as u8).map(|v| v.as_str()),
24117        "language_bits_0" => LanguageBits0::from_value(value as u8).map(|v| v.as_str()),
24118        "language_bits_1" => LanguageBits1::from_value(value as u8).map(|v| v.as_str()),
24119        "language_bits_2" => LanguageBits2::from_value(value as u8).map(|v| v.as_str()),
24120        "language_bits_3" => LanguageBits3::from_value(value as u8).map(|v| v.as_str()),
24121        "language_bits_4" => LanguageBits4::from_value(value as u8).map(|v| v.as_str()),
24122        "time_zone" => TimeZone::from_value(value as u8).map(|v| v.as_str()),
24123        "display_measure" => DisplayMeasure::from_value(value as u8).map(|v| v.as_str()),
24124        "display_heart" => DisplayHeart::from_value(value as u8).map(|v| v.as_str()),
24125        "display_power" => DisplayPower::from_value(value as u8).map(|v| v.as_str()),
24126        "display_position" => DisplayPosition::from_value(value as u8).map(|v| v.as_str()),
24127        "switch" => Switch::from_value(value as u8).map(|v| v.as_str()),
24128        "sport" => Sport::from_value(value as u8).map(|v| v.as_str()),
24129        "sport_bits_0" => SportBits0::from_value(value as u8).map(|v| v.as_str()),
24130        "sport_bits_1" => SportBits1::from_value(value as u8).map(|v| v.as_str()),
24131        "sport_bits_2" => SportBits2::from_value(value as u8).map(|v| v.as_str()),
24132        "sport_bits_3" => SportBits3::from_value(value as u8).map(|v| v.as_str()),
24133        "sport_bits_4" => SportBits4::from_value(value as u8).map(|v| v.as_str()),
24134        "sport_bits_5" => SportBits5::from_value(value as u8).map(|v| v.as_str()),
24135        "sport_bits_6" => SportBits6::from_value(value as u8).map(|v| v.as_str()),
24136        "sub_sport" => SubSport::from_value(value as u8).map(|v| v.as_str()),
24137        "sport_event" => SportEvent::from_value(value as u8).map(|v| v.as_str()),
24138        "activity" => Activity::from_value(value as u8).map(|v| v.as_str()),
24139        "intensity" => Intensity::from_value(value as u8).map(|v| v.as_str()),
24140        "session_trigger" => SessionTrigger::from_value(value as u8).map(|v| v.as_str()),
24141        "autolap_trigger" => AutolapTrigger::from_value(value as u8).map(|v| v.as_str()),
24142        "lap_trigger" => LapTrigger::from_value(value as u8).map(|v| v.as_str()),
24143        "time_mode" => TimeMode::from_value(value as u8).map(|v| v.as_str()),
24144        "backlight_mode" => BacklightMode::from_value(value as u8).map(|v| v.as_str()),
24145        "date_mode" => DateMode::from_value(value as u8).map(|v| v.as_str()),
24146        "backlight_timeout" => BacklightTimeout::from_value(value as u8).map(|v| v.as_str()),
24147        "event" => Event::from_value(value as u8).map(|v| v.as_str()),
24148        "event_type" => EventType::from_value(value as u8).map(|v| v.as_str()),
24149        "timer_trigger" => TimerTrigger::from_value(value as u8).map(|v| v.as_str()),
24150        "fitness_equipment_state" => {
24151            FitnessEquipmentState::from_value(value as u8).map(|v| v.as_str())
24152        }
24153        "tone" => Tone::from_value(value as u8).map(|v| v.as_str()),
24154        "autoscroll" => Autoscroll::from_value(value as u8).map(|v| v.as_str()),
24155        "activity_class" => ActivityClass::from_value(value as u8).map(|v| v.as_str()),
24156        "hr_zone_calc" => HrZoneCalc::from_value(value as u8).map(|v| v.as_str()),
24157        "pwr_zone_calc" => PwrZoneCalc::from_value(value as u8).map(|v| v.as_str()),
24158        "wkt_step_duration" => WktStepDuration::from_value(value as u8).map(|v| v.as_str()),
24159        "wkt_step_target" => WktStepTarget::from_value(value as u8).map(|v| v.as_str()),
24160        "goal" => Goal::from_value(value as u8).map(|v| v.as_str()),
24161        "goal_recurrence" => GoalRecurrence::from_value(value as u8).map(|v| v.as_str()),
24162        "goal_source" => GoalSource::from_value(value as u8).map(|v| v.as_str()),
24163        "schedule" => Schedule::from_value(value as u8).map(|v| v.as_str()),
24164        "course_point" => CoursePoint::from_value(value as u8).map(|v| v.as_str()),
24165        "manufacturer" => Manufacturer::from_value(value as u16).map(|v| v.as_str()),
24166        "garmin_product" => GarminProduct::from_value(value as u16).map(|v| v.as_str()),
24167        "antplus_device_type" => AntplusDeviceType::from_value(value as u8).map(|v| v.as_str()),
24168        "ant_network" => AntNetwork::from_value(value as u8).map(|v| v.as_str()),
24169        "workout_capabilities" => WorkoutCapabilities::from_value(value as u32).map(|v| v.as_str()),
24170        "battery_status" => BatteryStatus::from_value(value as u8).map(|v| v.as_str()),
24171        "hr_type" => HrType::from_value(value as u8).map(|v| v.as_str()),
24172        "course_capabilities" => CourseCapabilities::from_value(value as u32).map(|v| v.as_str()),
24173        "weight" => Weight::from_value(value as u16).map(|v| v.as_str()),
24174        "workout_hr" => WorkoutHr::from_value(value as u32).map(|v| v.as_str()),
24175        "workout_power" => WorkoutPower::from_value(value as u32).map(|v| v.as_str()),
24176        "bp_status" => BpStatus::from_value(value as u8).map(|v| v.as_str()),
24177        "user_local_id" => UserLocalId::from_value(value as u16).map(|v| v.as_str()),
24178        "swim_stroke" => SwimStroke::from_value(value as u8).map(|v| v.as_str()),
24179        "activity_type" => ActivityType::from_value(value as u8).map(|v| v.as_str()),
24180        "activity_subtype" => ActivitySubtype::from_value(value as u8).map(|v| v.as_str()),
24181        "activity_level" => ActivityLevel::from_value(value as u8).map(|v| v.as_str()),
24182        "side" => Side::from_value(value as u8).map(|v| v.as_str()),
24183        "left_right_balance" => LeftRightBalance::from_value(value as u8).map(|v| v.as_str()),
24184        "left_right_balance_100" => {
24185            LeftRightBalance100::from_value(value as u16).map(|v| v.as_str())
24186        }
24187        "length_type" => LengthType::from_value(value as u8).map(|v| v.as_str()),
24188        "day_of_week" => DayOfWeek::from_value(value as u8).map(|v| v.as_str()),
24189        "connectivity_capabilities" => {
24190            ConnectivityCapabilities::from_value(value as u32).map(|v| v.as_str())
24191        }
24192        "weather_report" => WeatherReport::from_value(value as u8).map(|v| v.as_str()),
24193        "weather_status" => WeatherStatus::from_value(value as u8).map(|v| v.as_str()),
24194        "weather_severity" => WeatherSeverity::from_value(value as u8).map(|v| v.as_str()),
24195        "weather_severe_type" => WeatherSevereType::from_value(value as u8).map(|v| v.as_str()),
24196        "stroke_type" => StrokeType::from_value(value as u8).map(|v| v.as_str()),
24197        "body_location" => BodyLocation::from_value(value as u8).map(|v| v.as_str()),
24198        "segment_lap_status" => SegmentLapStatus::from_value(value as u8).map(|v| v.as_str()),
24199        "segment_leaderboard_type" => {
24200            SegmentLeaderboardType::from_value(value as u8).map(|v| v.as_str())
24201        }
24202        "segment_delete_status" => SegmentDeleteStatus::from_value(value as u8).map(|v| v.as_str()),
24203        "segment_selection_type" => {
24204            SegmentSelectionType::from_value(value as u8).map(|v| v.as_str())
24205        }
24206        "source_type" => SourceType::from_value(value as u8).map(|v| v.as_str()),
24207        "local_device_type" => LocalDeviceType::from_value(value as u8).map(|v| v.as_str()),
24208        "ble_device_type" => BleDeviceType::from_value(value as u8).map(|v| v.as_str()),
24209        "ant_channel_id" => AntChannelId::from_value(value as u32).map(|v| v.as_str()),
24210        "display_orientation" => DisplayOrientation::from_value(value as u8).map(|v| v.as_str()),
24211        "workout_equipment" => WorkoutEquipment::from_value(value as u8).map(|v| v.as_str()),
24212        "watchface_mode" => WatchfaceMode::from_value(value as u8).map(|v| v.as_str()),
24213        "digital_watchface_layout" => {
24214            DigitalWatchfaceLayout::from_value(value as u8).map(|v| v.as_str())
24215        }
24216        "analog_watchface_layout" => {
24217            AnalogWatchfaceLayout::from_value(value as u8).map(|v| v.as_str())
24218        }
24219        "rider_position_type" => RiderPositionType::from_value(value as u8).map(|v| v.as_str()),
24220        "power_phase_type" => PowerPhaseType::from_value(value as u8).map(|v| v.as_str()),
24221        "camera_event_type" => CameraEventType::from_value(value as u8).map(|v| v.as_str()),
24222        "sensor_type" => SensorType::from_value(value as u8).map(|v| v.as_str()),
24223        "bike_light_network_config_type" => {
24224            BikeLightNetworkConfigType::from_value(value as u8).map(|v| v.as_str())
24225        }
24226        "comm_timeout_type" => CommTimeoutType::from_value(value as u16).map(|v| v.as_str()),
24227        "camera_orientation_type" => {
24228            CameraOrientationType::from_value(value as u8).map(|v| v.as_str())
24229        }
24230        "attitude_stage" => AttitudeStage::from_value(value as u8).map(|v| v.as_str()),
24231        "attitude_validity" => AttitudeValidity::from_value(value as u16).map(|v| v.as_str()),
24232        "auto_sync_frequency" => AutoSyncFrequency::from_value(value as u8).map(|v| v.as_str()),
24233        "exd_layout" => ExdLayout::from_value(value as u8).map(|v| v.as_str()),
24234        "exd_display_type" => ExdDisplayType::from_value(value as u8).map(|v| v.as_str()),
24235        "exd_data_units" => ExdDataUnits::from_value(value as u8).map(|v| v.as_str()),
24236        "exd_qualifiers" => ExdQualifiers::from_value(value as u8).map(|v| v.as_str()),
24237        "exd_descriptors" => ExdDescriptors::from_value(value as u8).map(|v| v.as_str()),
24238        "auto_activity_detect" => AutoActivityDetect::from_value(value as u32).map(|v| v.as_str()),
24239        "supported_exd_screen_layouts" => {
24240            SupportedExdScreenLayouts::from_value(value as u32).map(|v| v.as_str())
24241        }
24242        "fit_base_type" => FitBaseType::from_value(value as u8).map(|v| v.as_str()),
24243        "turn_type" => TurnType::from_value(value as u8).map(|v| v.as_str()),
24244        "bike_light_beam_angle_mode" => {
24245            BikeLightBeamAngleMode::from_value(value as u8).map(|v| v.as_str())
24246        }
24247        "fit_base_unit" => FitBaseUnit::from_value(value as u16).map(|v| v.as_str()),
24248        "set_type" => SetType::from_value(value as u8).map(|v| v.as_str()),
24249        "max_met_category" => MaxMetCategory::from_value(value as u8).map(|v| v.as_str()),
24250        "exercise_category" => ExerciseCategory::from_value(value as u16).map(|v| v.as_str()),
24251        "bench_press_exercise_name" => {
24252            BenchPressExerciseName::from_value(value as u16).map(|v| v.as_str())
24253        }
24254        "calf_raise_exercise_name" => {
24255            CalfRaiseExerciseName::from_value(value as u16).map(|v| v.as_str())
24256        }
24257        "cardio_exercise_name" => CardioExerciseName::from_value(value as u16).map(|v| v.as_str()),
24258        "carry_exercise_name" => CarryExerciseName::from_value(value as u16).map(|v| v.as_str()),
24259        "chop_exercise_name" => ChopExerciseName::from_value(value as u16).map(|v| v.as_str()),
24260        "core_exercise_name" => CoreExerciseName::from_value(value as u16).map(|v| v.as_str()),
24261        "crunch_exercise_name" => CrunchExerciseName::from_value(value as u16).map(|v| v.as_str()),
24262        "curl_exercise_name" => CurlExerciseName::from_value(value as u16).map(|v| v.as_str()),
24263        "deadlift_exercise_name" => {
24264            DeadliftExerciseName::from_value(value as u16).map(|v| v.as_str())
24265        }
24266        "flye_exercise_name" => FlyeExerciseName::from_value(value as u16).map(|v| v.as_str()),
24267        "hip_raise_exercise_name" => {
24268            HipRaiseExerciseName::from_value(value as u16).map(|v| v.as_str())
24269        }
24270        "hip_stability_exercise_name" => {
24271            HipStabilityExerciseName::from_value(value as u16).map(|v| v.as_str())
24272        }
24273        "hip_swing_exercise_name" => {
24274            HipSwingExerciseName::from_value(value as u16).map(|v| v.as_str())
24275        }
24276        "hyperextension_exercise_name" => {
24277            HyperextensionExerciseName::from_value(value as u16).map(|v| v.as_str())
24278        }
24279        "lateral_raise_exercise_name" => {
24280            LateralRaiseExerciseName::from_value(value as u16).map(|v| v.as_str())
24281        }
24282        "leg_curl_exercise_name" => {
24283            LegCurlExerciseName::from_value(value as u16).map(|v| v.as_str())
24284        }
24285        "leg_raise_exercise_name" => {
24286            LegRaiseExerciseName::from_value(value as u16).map(|v| v.as_str())
24287        }
24288        "lunge_exercise_name" => LungeExerciseName::from_value(value as u16).map(|v| v.as_str()),
24289        "olympic_lift_exercise_name" => {
24290            OlympicLiftExerciseName::from_value(value as u16).map(|v| v.as_str())
24291        }
24292        "plank_exercise_name" => PlankExerciseName::from_value(value as u16).map(|v| v.as_str()),
24293        "plyo_exercise_name" => PlyoExerciseName::from_value(value as u16).map(|v| v.as_str()),
24294        "pull_up_exercise_name" => PullUpExerciseName::from_value(value as u16).map(|v| v.as_str()),
24295        "push_up_exercise_name" => PushUpExerciseName::from_value(value as u16).map(|v| v.as_str()),
24296        "row_exercise_name" => RowExerciseName::from_value(value as u16).map(|v| v.as_str()),
24297        "shoulder_press_exercise_name" => {
24298            ShoulderPressExerciseName::from_value(value as u16).map(|v| v.as_str())
24299        }
24300        "shoulder_stability_exercise_name" => {
24301            ShoulderStabilityExerciseName::from_value(value as u16).map(|v| v.as_str())
24302        }
24303        "shrug_exercise_name" => ShrugExerciseName::from_value(value as u16).map(|v| v.as_str()),
24304        "sit_up_exercise_name" => SitUpExerciseName::from_value(value as u16).map(|v| v.as_str()),
24305        "squat_exercise_name" => SquatExerciseName::from_value(value as u16).map(|v| v.as_str()),
24306        "total_body_exercise_name" => {
24307            TotalBodyExerciseName::from_value(value as u16).map(|v| v.as_str())
24308        }
24309        "move_exercise_name" => MoveExerciseName::from_value(value as u16).map(|v| v.as_str()),
24310        "pose_exercise_name" => PoseExerciseName::from_value(value as u16).map(|v| v.as_str()),
24311        "triceps_extension_exercise_name" => {
24312            TricepsExtensionExerciseName::from_value(value as u16).map(|v| v.as_str())
24313        }
24314        "warm_up_exercise_name" => WarmUpExerciseName::from_value(value as u16).map(|v| v.as_str()),
24315        "run_exercise_name" => RunExerciseName::from_value(value as u16).map(|v| v.as_str()),
24316        "bike_exercise_name" => BikeExerciseName::from_value(value as u16).map(|v| v.as_str()),
24317        "banded_exercises_exercise_name" => {
24318            BandedExercisesExerciseName::from_value(value as u16).map(|v| v.as_str())
24319        }
24320        "battle_rope_exercise_name" => {
24321            BattleRopeExerciseName::from_value(value as u16).map(|v| v.as_str())
24322        }
24323        "elliptical_exercise_name" => {
24324            EllipticalExerciseName::from_value(value as u16).map(|v| v.as_str())
24325        }
24326        "floor_climb_exercise_name" => {
24327            FloorClimbExerciseName::from_value(value as u16).map(|v| v.as_str())
24328        }
24329        "indoor_bike_exercise_name" => {
24330            IndoorBikeExerciseName::from_value(value as u16).map(|v| v.as_str())
24331        }
24332        "indoor_row_exercise_name" => {
24333            IndoorRowExerciseName::from_value(value as u16).map(|v| v.as_str())
24334        }
24335        "ladder_exercise_name" => LadderExerciseName::from_value(value as u16).map(|v| v.as_str()),
24336        "sandbag_exercise_name" => {
24337            SandbagExerciseName::from_value(value as u16).map(|v| v.as_str())
24338        }
24339        "sled_exercise_name" => SledExerciseName::from_value(value as u16).map(|v| v.as_str()),
24340        "sledge_hammer_exercise_name" => {
24341            SledgeHammerExerciseName::from_value(value as u16).map(|v| v.as_str())
24342        }
24343        "stair_stepper_exercise_name" => {
24344            StairStepperExerciseName::from_value(value as u16).map(|v| v.as_str())
24345        }
24346        "suspension_exercise_name" => {
24347            SuspensionExerciseName::from_value(value as u16).map(|v| v.as_str())
24348        }
24349        "tire_exercise_name" => TireExerciseName::from_value(value as u16).map(|v| v.as_str()),
24350        "bike_outdoor_exercise_name" => {
24351            BikeOutdoorExerciseName::from_value(value as u16).map(|v| v.as_str())
24352        }
24353        "run_indoor_exercise_name" => {
24354            RunIndoorExerciseName::from_value(value as u16).map(|v| v.as_str())
24355        }
24356        "water_type" => WaterType::from_value(value as u8).map(|v| v.as_str()),
24357        "tissue_model_type" => TissueModelType::from_value(value as u8).map(|v| v.as_str()),
24358        "dive_gas_status" => DiveGasStatus::from_value(value as u8).map(|v| v.as_str()),
24359        "dive_alert" => DiveAlert::from_value(value as u8).map(|v| v.as_str()),
24360        "dive_alarm_type" => DiveAlarmType::from_value(value as u8).map(|v| v.as_str()),
24361        "dive_backlight_mode" => DiveBacklightMode::from_value(value as u8).map(|v| v.as_str()),
24362        "sleep_level" => SleepLevel::from_value(value as u8).map(|v| v.as_str()),
24363        "spo2_measurement_type" => Spo2MeasurementType::from_value(value as u8).map(|v| v.as_str()),
24364        "ccr_setpoint_switch_mode" => {
24365            CcrSetpointSwitchMode::from_value(value as u8).map(|v| v.as_str())
24366        }
24367        "dive_gas_mode" => DiveGasMode::from_value(value as u8).map(|v| v.as_str()),
24368        "projectile_type" => ProjectileType::from_value(value as u8).map(|v| v.as_str()),
24369        "favero_product" => FaveroProduct::from_value(value as u16).map(|v| v.as_str()),
24370        "split_type" => SplitType::from_value(value as u8).map(|v| v.as_str()),
24371        "climb_pro_event" => ClimbProEvent::from_value(value as u8).map(|v| v.as_str()),
24372        "gas_consumption_rate_type" => {
24373            GasConsumptionRateType::from_value(value as u8).map(|v| v.as_str())
24374        }
24375        "tap_sensitivity" => TapSensitivity::from_value(value as u8).map(|v| v.as_str()),
24376        "radar_threat_level_type" => {
24377            RadarThreatLevelType::from_value(value as u8).map(|v| v.as_str())
24378        }
24379        "sleep_disruption_severity" => {
24380            SleepDisruptionSeverity::from_value(value as u8).map(|v| v.as_str())
24381        }
24382        "nap_period_feedback" => NapPeriodFeedback::from_value(value as u8).map(|v| v.as_str()),
24383        "nap_source" => NapSource::from_value(value as u8).map(|v| v.as_str()),
24384        "max_met_speed_source" => MaxMetSpeedSource::from_value(value as u8).map(|v| v.as_str()),
24385        "max_met_heart_rate_source" => {
24386            MaxMetHeartRateSource::from_value(value as u8).map(|v| v.as_str())
24387        }
24388        "hrv_status" => HrvStatus::from_value(value as u8).map(|v| v.as_str()),
24389        "no_fly_time_mode" => NoFlyTimeMode::from_value(value as u8).map(|v| v.as_str()),
24390        _ => None,
24391    }
24392}
24393
24394/// Resolve the numeric value for `(type_name, snake_case_name)`. Used by
24395/// the encoder to reverse enum-string lookups.
24396pub fn enum_value_by_str(type_name: &str, name: &str) -> Option<u64> {
24397    match type_name {
24398        "mesg_num" => MesgNum::from_name(name).map(|v| v as u64),
24399        "file" => File::from_str(name).map(|v| v as u64),
24400        "checksum" => Checksum::from_str(name).map(|v| v as u64),
24401        "file_flags" => FileFlags::from_str(name).map(|v| v as u64),
24402        "mesg_count" => MesgCount::from_str(name).map(|v| v as u64),
24403        "date_time" => DateTime::from_str(name).map(|v| v as u64),
24404        "local_date_time" => LocalDateTime::from_str(name).map(|v| v as u64),
24405        "message_index" => MessageIndex::from_str(name).map(|v| v as u64),
24406        "device_index" => DeviceIndex::from_str(name).map(|v| v as u64),
24407        "gender" => Gender::from_str(name).map(|v| v as u64),
24408        "language" => Language::from_str(name).map(|v| v as u64),
24409        "language_bits_0" => LanguageBits0::from_str(name).map(|v| v as u64),
24410        "language_bits_1" => LanguageBits1::from_str(name).map(|v| v as u64),
24411        "language_bits_2" => LanguageBits2::from_str(name).map(|v| v as u64),
24412        "language_bits_3" => LanguageBits3::from_str(name).map(|v| v as u64),
24413        "language_bits_4" => LanguageBits4::from_str(name).map(|v| v as u64),
24414        "time_zone" => TimeZone::from_str(name).map(|v| v as u64),
24415        "display_measure" => DisplayMeasure::from_str(name).map(|v| v as u64),
24416        "display_heart" => DisplayHeart::from_str(name).map(|v| v as u64),
24417        "display_power" => DisplayPower::from_str(name).map(|v| v as u64),
24418        "display_position" => DisplayPosition::from_str(name).map(|v| v as u64),
24419        "switch" => Switch::from_str(name).map(|v| v as u64),
24420        "sport" => Sport::from_str(name).map(|v| v as u64),
24421        "sport_bits_0" => SportBits0::from_str(name).map(|v| v as u64),
24422        "sport_bits_1" => SportBits1::from_str(name).map(|v| v as u64),
24423        "sport_bits_2" => SportBits2::from_str(name).map(|v| v as u64),
24424        "sport_bits_3" => SportBits3::from_str(name).map(|v| v as u64),
24425        "sport_bits_4" => SportBits4::from_str(name).map(|v| v as u64),
24426        "sport_bits_5" => SportBits5::from_str(name).map(|v| v as u64),
24427        "sport_bits_6" => SportBits6::from_str(name).map(|v| v as u64),
24428        "sub_sport" => SubSport::from_str(name).map(|v| v as u64),
24429        "sport_event" => SportEvent::from_str(name).map(|v| v as u64),
24430        "activity" => Activity::from_str(name).map(|v| v as u64),
24431        "intensity" => Intensity::from_str(name).map(|v| v as u64),
24432        "session_trigger" => SessionTrigger::from_str(name).map(|v| v as u64),
24433        "autolap_trigger" => AutolapTrigger::from_str(name).map(|v| v as u64),
24434        "lap_trigger" => LapTrigger::from_str(name).map(|v| v as u64),
24435        "time_mode" => TimeMode::from_str(name).map(|v| v as u64),
24436        "backlight_mode" => BacklightMode::from_str(name).map(|v| v as u64),
24437        "date_mode" => DateMode::from_str(name).map(|v| v as u64),
24438        "backlight_timeout" => BacklightTimeout::from_str(name).map(|v| v as u64),
24439        "event" => Event::from_str(name).map(|v| v as u64),
24440        "event_type" => EventType::from_str(name).map(|v| v as u64),
24441        "timer_trigger" => TimerTrigger::from_str(name).map(|v| v as u64),
24442        "fitness_equipment_state" => FitnessEquipmentState::from_str(name).map(|v| v as u64),
24443        "tone" => Tone::from_str(name).map(|v| v as u64),
24444        "autoscroll" => Autoscroll::from_str(name).map(|v| v as u64),
24445        "activity_class" => ActivityClass::from_str(name).map(|v| v as u64),
24446        "hr_zone_calc" => HrZoneCalc::from_str(name).map(|v| v as u64),
24447        "pwr_zone_calc" => PwrZoneCalc::from_str(name).map(|v| v as u64),
24448        "wkt_step_duration" => WktStepDuration::from_str(name).map(|v| v as u64),
24449        "wkt_step_target" => WktStepTarget::from_str(name).map(|v| v as u64),
24450        "goal" => Goal::from_str(name).map(|v| v as u64),
24451        "goal_recurrence" => GoalRecurrence::from_str(name).map(|v| v as u64),
24452        "goal_source" => GoalSource::from_str(name).map(|v| v as u64),
24453        "schedule" => Schedule::from_str(name).map(|v| v as u64),
24454        "course_point" => CoursePoint::from_str(name).map(|v| v as u64),
24455        "manufacturer" => Manufacturer::from_str(name).map(|v| v as u64),
24456        "garmin_product" => GarminProduct::from_str(name).map(|v| v as u64),
24457        "antplus_device_type" => AntplusDeviceType::from_str(name).map(|v| v as u64),
24458        "ant_network" => AntNetwork::from_str(name).map(|v| v as u64),
24459        "workout_capabilities" => WorkoutCapabilities::from_str(name).map(|v| v as u64),
24460        "battery_status" => BatteryStatus::from_str(name).map(|v| v as u64),
24461        "hr_type" => HrType::from_str(name).map(|v| v as u64),
24462        "course_capabilities" => CourseCapabilities::from_str(name).map(|v| v as u64),
24463        "weight" => Weight::from_str(name).map(|v| v as u64),
24464        "workout_hr" => WorkoutHr::from_str(name).map(|v| v as u64),
24465        "workout_power" => WorkoutPower::from_str(name).map(|v| v as u64),
24466        "bp_status" => BpStatus::from_str(name).map(|v| v as u64),
24467        "user_local_id" => UserLocalId::from_str(name).map(|v| v as u64),
24468        "swim_stroke" => SwimStroke::from_str(name).map(|v| v as u64),
24469        "activity_type" => ActivityType::from_str(name).map(|v| v as u64),
24470        "activity_subtype" => ActivitySubtype::from_str(name).map(|v| v as u64),
24471        "activity_level" => ActivityLevel::from_str(name).map(|v| v as u64),
24472        "side" => Side::from_str(name).map(|v| v as u64),
24473        "left_right_balance" => LeftRightBalance::from_str(name).map(|v| v as u64),
24474        "left_right_balance_100" => LeftRightBalance100::from_str(name).map(|v| v as u64),
24475        "length_type" => LengthType::from_str(name).map(|v| v as u64),
24476        "day_of_week" => DayOfWeek::from_str(name).map(|v| v as u64),
24477        "connectivity_capabilities" => ConnectivityCapabilities::from_str(name).map(|v| v as u64),
24478        "weather_report" => WeatherReport::from_str(name).map(|v| v as u64),
24479        "weather_status" => WeatherStatus::from_str(name).map(|v| v as u64),
24480        "weather_severity" => WeatherSeverity::from_str(name).map(|v| v as u64),
24481        "weather_severe_type" => WeatherSevereType::from_str(name).map(|v| v as u64),
24482        "stroke_type" => StrokeType::from_str(name).map(|v| v as u64),
24483        "body_location" => BodyLocation::from_str(name).map(|v| v as u64),
24484        "segment_lap_status" => SegmentLapStatus::from_str(name).map(|v| v as u64),
24485        "segment_leaderboard_type" => SegmentLeaderboardType::from_str(name).map(|v| v as u64),
24486        "segment_delete_status" => SegmentDeleteStatus::from_str(name).map(|v| v as u64),
24487        "segment_selection_type" => SegmentSelectionType::from_str(name).map(|v| v as u64),
24488        "source_type" => SourceType::from_str(name).map(|v| v as u64),
24489        "local_device_type" => LocalDeviceType::from_str(name).map(|v| v as u64),
24490        "ble_device_type" => BleDeviceType::from_str(name).map(|v| v as u64),
24491        "ant_channel_id" => AntChannelId::from_str(name).map(|v| v as u64),
24492        "display_orientation" => DisplayOrientation::from_str(name).map(|v| v as u64),
24493        "workout_equipment" => WorkoutEquipment::from_str(name).map(|v| v as u64),
24494        "watchface_mode" => WatchfaceMode::from_str(name).map(|v| v as u64),
24495        "digital_watchface_layout" => DigitalWatchfaceLayout::from_str(name).map(|v| v as u64),
24496        "analog_watchface_layout" => AnalogWatchfaceLayout::from_str(name).map(|v| v as u64),
24497        "rider_position_type" => RiderPositionType::from_str(name).map(|v| v as u64),
24498        "power_phase_type" => PowerPhaseType::from_str(name).map(|v| v as u64),
24499        "camera_event_type" => CameraEventType::from_str(name).map(|v| v as u64),
24500        "sensor_type" => SensorType::from_str(name).map(|v| v as u64),
24501        "bike_light_network_config_type" => {
24502            BikeLightNetworkConfigType::from_str(name).map(|v| v as u64)
24503        }
24504        "comm_timeout_type" => CommTimeoutType::from_str(name).map(|v| v as u64),
24505        "camera_orientation_type" => CameraOrientationType::from_str(name).map(|v| v as u64),
24506        "attitude_stage" => AttitudeStage::from_str(name).map(|v| v as u64),
24507        "attitude_validity" => AttitudeValidity::from_str(name).map(|v| v as u64),
24508        "auto_sync_frequency" => AutoSyncFrequency::from_str(name).map(|v| v as u64),
24509        "exd_layout" => ExdLayout::from_str(name).map(|v| v as u64),
24510        "exd_display_type" => ExdDisplayType::from_str(name).map(|v| v as u64),
24511        "exd_data_units" => ExdDataUnits::from_str(name).map(|v| v as u64),
24512        "exd_qualifiers" => ExdQualifiers::from_str(name).map(|v| v as u64),
24513        "exd_descriptors" => ExdDescriptors::from_str(name).map(|v| v as u64),
24514        "auto_activity_detect" => AutoActivityDetect::from_str(name).map(|v| v as u64),
24515        "supported_exd_screen_layouts" => {
24516            SupportedExdScreenLayouts::from_str(name).map(|v| v as u64)
24517        }
24518        "fit_base_type" => FitBaseType::from_str(name).map(|v| v as u64),
24519        "turn_type" => TurnType::from_str(name).map(|v| v as u64),
24520        "bike_light_beam_angle_mode" => BikeLightBeamAngleMode::from_str(name).map(|v| v as u64),
24521        "fit_base_unit" => FitBaseUnit::from_str(name).map(|v| v as u64),
24522        "set_type" => SetType::from_str(name).map(|v| v as u64),
24523        "max_met_category" => MaxMetCategory::from_str(name).map(|v| v as u64),
24524        "exercise_category" => ExerciseCategory::from_str(name).map(|v| v as u64),
24525        "bench_press_exercise_name" => BenchPressExerciseName::from_str(name).map(|v| v as u64),
24526        "calf_raise_exercise_name" => CalfRaiseExerciseName::from_str(name).map(|v| v as u64),
24527        "cardio_exercise_name" => CardioExerciseName::from_str(name).map(|v| v as u64),
24528        "carry_exercise_name" => CarryExerciseName::from_str(name).map(|v| v as u64),
24529        "chop_exercise_name" => ChopExerciseName::from_str(name).map(|v| v as u64),
24530        "core_exercise_name" => CoreExerciseName::from_str(name).map(|v| v as u64),
24531        "crunch_exercise_name" => CrunchExerciseName::from_str(name).map(|v| v as u64),
24532        "curl_exercise_name" => CurlExerciseName::from_str(name).map(|v| v as u64),
24533        "deadlift_exercise_name" => DeadliftExerciseName::from_str(name).map(|v| v as u64),
24534        "flye_exercise_name" => FlyeExerciseName::from_str(name).map(|v| v as u64),
24535        "hip_raise_exercise_name" => HipRaiseExerciseName::from_str(name).map(|v| v as u64),
24536        "hip_stability_exercise_name" => HipStabilityExerciseName::from_str(name).map(|v| v as u64),
24537        "hip_swing_exercise_name" => HipSwingExerciseName::from_str(name).map(|v| v as u64),
24538        "hyperextension_exercise_name" => {
24539            HyperextensionExerciseName::from_str(name).map(|v| v as u64)
24540        }
24541        "lateral_raise_exercise_name" => LateralRaiseExerciseName::from_str(name).map(|v| v as u64),
24542        "leg_curl_exercise_name" => LegCurlExerciseName::from_str(name).map(|v| v as u64),
24543        "leg_raise_exercise_name" => LegRaiseExerciseName::from_str(name).map(|v| v as u64),
24544        "lunge_exercise_name" => LungeExerciseName::from_str(name).map(|v| v as u64),
24545        "olympic_lift_exercise_name" => OlympicLiftExerciseName::from_str(name).map(|v| v as u64),
24546        "plank_exercise_name" => PlankExerciseName::from_str(name).map(|v| v as u64),
24547        "plyo_exercise_name" => PlyoExerciseName::from_str(name).map(|v| v as u64),
24548        "pull_up_exercise_name" => PullUpExerciseName::from_str(name).map(|v| v as u64),
24549        "push_up_exercise_name" => PushUpExerciseName::from_str(name).map(|v| v as u64),
24550        "row_exercise_name" => RowExerciseName::from_str(name).map(|v| v as u64),
24551        "shoulder_press_exercise_name" => {
24552            ShoulderPressExerciseName::from_str(name).map(|v| v as u64)
24553        }
24554        "shoulder_stability_exercise_name" => {
24555            ShoulderStabilityExerciseName::from_str(name).map(|v| v as u64)
24556        }
24557        "shrug_exercise_name" => ShrugExerciseName::from_str(name).map(|v| v as u64),
24558        "sit_up_exercise_name" => SitUpExerciseName::from_str(name).map(|v| v as u64),
24559        "squat_exercise_name" => SquatExerciseName::from_str(name).map(|v| v as u64),
24560        "total_body_exercise_name" => TotalBodyExerciseName::from_str(name).map(|v| v as u64),
24561        "move_exercise_name" => MoveExerciseName::from_str(name).map(|v| v as u64),
24562        "pose_exercise_name" => PoseExerciseName::from_str(name).map(|v| v as u64),
24563        "triceps_extension_exercise_name" => {
24564            TricepsExtensionExerciseName::from_str(name).map(|v| v as u64)
24565        }
24566        "warm_up_exercise_name" => WarmUpExerciseName::from_str(name).map(|v| v as u64),
24567        "run_exercise_name" => RunExerciseName::from_str(name).map(|v| v as u64),
24568        "bike_exercise_name" => BikeExerciseName::from_str(name).map(|v| v as u64),
24569        "banded_exercises_exercise_name" => {
24570            BandedExercisesExerciseName::from_str(name).map(|v| v as u64)
24571        }
24572        "battle_rope_exercise_name" => BattleRopeExerciseName::from_str(name).map(|v| v as u64),
24573        "elliptical_exercise_name" => EllipticalExerciseName::from_str(name).map(|v| v as u64),
24574        "floor_climb_exercise_name" => FloorClimbExerciseName::from_str(name).map(|v| v as u64),
24575        "indoor_bike_exercise_name" => IndoorBikeExerciseName::from_str(name).map(|v| v as u64),
24576        "indoor_row_exercise_name" => IndoorRowExerciseName::from_str(name).map(|v| v as u64),
24577        "ladder_exercise_name" => LadderExerciseName::from_str(name).map(|v| v as u64),
24578        "sandbag_exercise_name" => SandbagExerciseName::from_str(name).map(|v| v as u64),
24579        "sled_exercise_name" => SledExerciseName::from_str(name).map(|v| v as u64),
24580        "sledge_hammer_exercise_name" => SledgeHammerExerciseName::from_str(name).map(|v| v as u64),
24581        "stair_stepper_exercise_name" => StairStepperExerciseName::from_str(name).map(|v| v as u64),
24582        "suspension_exercise_name" => SuspensionExerciseName::from_str(name).map(|v| v as u64),
24583        "tire_exercise_name" => TireExerciseName::from_str(name).map(|v| v as u64),
24584        "bike_outdoor_exercise_name" => BikeOutdoorExerciseName::from_str(name).map(|v| v as u64),
24585        "run_indoor_exercise_name" => RunIndoorExerciseName::from_str(name).map(|v| v as u64),
24586        "water_type" => WaterType::from_str(name).map(|v| v as u64),
24587        "tissue_model_type" => TissueModelType::from_str(name).map(|v| v as u64),
24588        "dive_gas_status" => DiveGasStatus::from_str(name).map(|v| v as u64),
24589        "dive_alert" => DiveAlert::from_str(name).map(|v| v as u64),
24590        "dive_alarm_type" => DiveAlarmType::from_str(name).map(|v| v as u64),
24591        "dive_backlight_mode" => DiveBacklightMode::from_str(name).map(|v| v as u64),
24592        "sleep_level" => SleepLevel::from_str(name).map(|v| v as u64),
24593        "spo2_measurement_type" => Spo2MeasurementType::from_str(name).map(|v| v as u64),
24594        "ccr_setpoint_switch_mode" => CcrSetpointSwitchMode::from_str(name).map(|v| v as u64),
24595        "dive_gas_mode" => DiveGasMode::from_str(name).map(|v| v as u64),
24596        "projectile_type" => ProjectileType::from_str(name).map(|v| v as u64),
24597        "favero_product" => FaveroProduct::from_str(name).map(|v| v as u64),
24598        "split_type" => SplitType::from_str(name).map(|v| v as u64),
24599        "climb_pro_event" => ClimbProEvent::from_str(name).map(|v| v as u64),
24600        "gas_consumption_rate_type" => GasConsumptionRateType::from_str(name).map(|v| v as u64),
24601        "tap_sensitivity" => TapSensitivity::from_str(name).map(|v| v as u64),
24602        "radar_threat_level_type" => RadarThreatLevelType::from_str(name).map(|v| v as u64),
24603        "sleep_disruption_severity" => SleepDisruptionSeverity::from_str(name).map(|v| v as u64),
24604        "nap_period_feedback" => NapPeriodFeedback::from_str(name).map(|v| v as u64),
24605        "nap_source" => NapSource::from_str(name).map(|v| v as u64),
24606        "max_met_speed_source" => MaxMetSpeedSource::from_str(name).map(|v| v as u64),
24607        "max_met_heart_rate_source" => MaxMetHeartRateSource::from_str(name).map(|v| v as u64),
24608        "hrv_status" => HrvStatus::from_str(name).map(|v| v as u64),
24609        "no_fly_time_mode" => NoFlyTimeMode::from_str(name).map(|v| v as u64),
24610        _ => None,
24611    }
24612}
24613
24614/// Map a Profile type_name to its underlying wire [`crate::base_type::BaseType`].
24615/// Returns `None` for raw base type names like `"uint16"` (those
24616/// are resolved separately by the encoder) and for unknown names.
24617pub fn base_type_for_type_name(type_name: &str) -> Option<crate::base_type::BaseType> {
24618    use crate::base_type::BaseType;
24619    match type_name {
24620        "mesg_num" => Some(BaseType::UInt16),
24621        "file" => Some(BaseType::Enum),
24622        "checksum" => Some(BaseType::UInt8),
24623        "file_flags" => Some(BaseType::UInt8z),
24624        "mesg_count" => Some(BaseType::Enum),
24625        "date_time" => Some(BaseType::UInt32),
24626        "local_date_time" => Some(BaseType::UInt32),
24627        "message_index" => Some(BaseType::UInt16),
24628        "device_index" => Some(BaseType::UInt8),
24629        "gender" => Some(BaseType::Enum),
24630        "language" => Some(BaseType::Enum),
24631        "language_bits_0" => Some(BaseType::UInt8z),
24632        "language_bits_1" => Some(BaseType::UInt8z),
24633        "language_bits_2" => Some(BaseType::UInt8z),
24634        "language_bits_3" => Some(BaseType::UInt8z),
24635        "language_bits_4" => Some(BaseType::UInt8z),
24636        "time_zone" => Some(BaseType::Enum),
24637        "display_measure" => Some(BaseType::Enum),
24638        "display_heart" => Some(BaseType::Enum),
24639        "display_power" => Some(BaseType::Enum),
24640        "display_position" => Some(BaseType::Enum),
24641        "switch" => Some(BaseType::Enum),
24642        "sport" => Some(BaseType::Enum),
24643        "sport_bits_0" => Some(BaseType::UInt8z),
24644        "sport_bits_1" => Some(BaseType::UInt8z),
24645        "sport_bits_2" => Some(BaseType::UInt8z),
24646        "sport_bits_3" => Some(BaseType::UInt8z),
24647        "sport_bits_4" => Some(BaseType::UInt8z),
24648        "sport_bits_5" => Some(BaseType::UInt8z),
24649        "sport_bits_6" => Some(BaseType::UInt8z),
24650        "sub_sport" => Some(BaseType::Enum),
24651        "sport_event" => Some(BaseType::Enum),
24652        "activity" => Some(BaseType::Enum),
24653        "intensity" => Some(BaseType::Enum),
24654        "session_trigger" => Some(BaseType::Enum),
24655        "autolap_trigger" => Some(BaseType::Enum),
24656        "lap_trigger" => Some(BaseType::Enum),
24657        "time_mode" => Some(BaseType::Enum),
24658        "backlight_mode" => Some(BaseType::Enum),
24659        "date_mode" => Some(BaseType::Enum),
24660        "backlight_timeout" => Some(BaseType::UInt8),
24661        "event" => Some(BaseType::Enum),
24662        "event_type" => Some(BaseType::Enum),
24663        "timer_trigger" => Some(BaseType::Enum),
24664        "fitness_equipment_state" => Some(BaseType::Enum),
24665        "tone" => Some(BaseType::Enum),
24666        "autoscroll" => Some(BaseType::Enum),
24667        "activity_class" => Some(BaseType::Enum),
24668        "hr_zone_calc" => Some(BaseType::Enum),
24669        "pwr_zone_calc" => Some(BaseType::Enum),
24670        "wkt_step_duration" => Some(BaseType::Enum),
24671        "wkt_step_target" => Some(BaseType::Enum),
24672        "goal" => Some(BaseType::Enum),
24673        "goal_recurrence" => Some(BaseType::Enum),
24674        "goal_source" => Some(BaseType::Enum),
24675        "schedule" => Some(BaseType::Enum),
24676        "course_point" => Some(BaseType::Enum),
24677        "manufacturer" => Some(BaseType::UInt16),
24678        "garmin_product" => Some(BaseType::UInt16),
24679        "antplus_device_type" => Some(BaseType::UInt8),
24680        "ant_network" => Some(BaseType::Enum),
24681        "workout_capabilities" => Some(BaseType::UInt32z),
24682        "battery_status" => Some(BaseType::UInt8),
24683        "hr_type" => Some(BaseType::Enum),
24684        "course_capabilities" => Some(BaseType::UInt32z),
24685        "weight" => Some(BaseType::UInt16),
24686        "workout_hr" => Some(BaseType::UInt32),
24687        "workout_power" => Some(BaseType::UInt32),
24688        "bp_status" => Some(BaseType::Enum),
24689        "user_local_id" => Some(BaseType::UInt16),
24690        "swim_stroke" => Some(BaseType::Enum),
24691        "activity_type" => Some(BaseType::Enum),
24692        "activity_subtype" => Some(BaseType::Enum),
24693        "activity_level" => Some(BaseType::Enum),
24694        "side" => Some(BaseType::Enum),
24695        "left_right_balance" => Some(BaseType::UInt8),
24696        "left_right_balance_100" => Some(BaseType::UInt16),
24697        "length_type" => Some(BaseType::Enum),
24698        "day_of_week" => Some(BaseType::Enum),
24699        "connectivity_capabilities" => Some(BaseType::UInt32z),
24700        "weather_report" => Some(BaseType::Enum),
24701        "weather_status" => Some(BaseType::Enum),
24702        "weather_severity" => Some(BaseType::Enum),
24703        "weather_severe_type" => Some(BaseType::Enum),
24704        "stroke_type" => Some(BaseType::Enum),
24705        "body_location" => Some(BaseType::Enum),
24706        "segment_lap_status" => Some(BaseType::Enum),
24707        "segment_leaderboard_type" => Some(BaseType::Enum),
24708        "segment_delete_status" => Some(BaseType::Enum),
24709        "segment_selection_type" => Some(BaseType::Enum),
24710        "source_type" => Some(BaseType::Enum),
24711        "local_device_type" => Some(BaseType::UInt8),
24712        "ble_device_type" => Some(BaseType::UInt8),
24713        "ant_channel_id" => Some(BaseType::UInt32z),
24714        "display_orientation" => Some(BaseType::Enum),
24715        "workout_equipment" => Some(BaseType::Enum),
24716        "watchface_mode" => Some(BaseType::Enum),
24717        "digital_watchface_layout" => Some(BaseType::Enum),
24718        "analog_watchface_layout" => Some(BaseType::Enum),
24719        "rider_position_type" => Some(BaseType::Enum),
24720        "power_phase_type" => Some(BaseType::Enum),
24721        "camera_event_type" => Some(BaseType::Enum),
24722        "sensor_type" => Some(BaseType::Enum),
24723        "bike_light_network_config_type" => Some(BaseType::Enum),
24724        "comm_timeout_type" => Some(BaseType::UInt16),
24725        "camera_orientation_type" => Some(BaseType::Enum),
24726        "attitude_stage" => Some(BaseType::Enum),
24727        "attitude_validity" => Some(BaseType::UInt16),
24728        "auto_sync_frequency" => Some(BaseType::Enum),
24729        "exd_layout" => Some(BaseType::Enum),
24730        "exd_display_type" => Some(BaseType::Enum),
24731        "exd_data_units" => Some(BaseType::Enum),
24732        "exd_qualifiers" => Some(BaseType::Enum),
24733        "exd_descriptors" => Some(BaseType::Enum),
24734        "auto_activity_detect" => Some(BaseType::UInt32),
24735        "supported_exd_screen_layouts" => Some(BaseType::UInt32z),
24736        "fit_base_type" => Some(BaseType::UInt8),
24737        "turn_type" => Some(BaseType::Enum),
24738        "bike_light_beam_angle_mode" => Some(BaseType::UInt8),
24739        "fit_base_unit" => Some(BaseType::UInt16),
24740        "set_type" => Some(BaseType::UInt8),
24741        "max_met_category" => Some(BaseType::Enum),
24742        "exercise_category" => Some(BaseType::UInt16),
24743        "bench_press_exercise_name" => Some(BaseType::UInt16),
24744        "calf_raise_exercise_name" => Some(BaseType::UInt16),
24745        "cardio_exercise_name" => Some(BaseType::UInt16),
24746        "carry_exercise_name" => Some(BaseType::UInt16),
24747        "chop_exercise_name" => Some(BaseType::UInt16),
24748        "core_exercise_name" => Some(BaseType::UInt16),
24749        "crunch_exercise_name" => Some(BaseType::UInt16),
24750        "curl_exercise_name" => Some(BaseType::UInt16),
24751        "deadlift_exercise_name" => Some(BaseType::UInt16),
24752        "flye_exercise_name" => Some(BaseType::UInt16),
24753        "hip_raise_exercise_name" => Some(BaseType::UInt16),
24754        "hip_stability_exercise_name" => Some(BaseType::UInt16),
24755        "hip_swing_exercise_name" => Some(BaseType::UInt16),
24756        "hyperextension_exercise_name" => Some(BaseType::UInt16),
24757        "lateral_raise_exercise_name" => Some(BaseType::UInt16),
24758        "leg_curl_exercise_name" => Some(BaseType::UInt16),
24759        "leg_raise_exercise_name" => Some(BaseType::UInt16),
24760        "lunge_exercise_name" => Some(BaseType::UInt16),
24761        "olympic_lift_exercise_name" => Some(BaseType::UInt16),
24762        "plank_exercise_name" => Some(BaseType::UInt16),
24763        "plyo_exercise_name" => Some(BaseType::UInt16),
24764        "pull_up_exercise_name" => Some(BaseType::UInt16),
24765        "push_up_exercise_name" => Some(BaseType::UInt16),
24766        "row_exercise_name" => Some(BaseType::UInt16),
24767        "shoulder_press_exercise_name" => Some(BaseType::UInt16),
24768        "shoulder_stability_exercise_name" => Some(BaseType::UInt16),
24769        "shrug_exercise_name" => Some(BaseType::UInt16),
24770        "sit_up_exercise_name" => Some(BaseType::UInt16),
24771        "squat_exercise_name" => Some(BaseType::UInt16),
24772        "total_body_exercise_name" => Some(BaseType::UInt16),
24773        "move_exercise_name" => Some(BaseType::UInt16),
24774        "pose_exercise_name" => Some(BaseType::UInt16),
24775        "triceps_extension_exercise_name" => Some(BaseType::UInt16),
24776        "warm_up_exercise_name" => Some(BaseType::UInt16),
24777        "run_exercise_name" => Some(BaseType::UInt16),
24778        "bike_exercise_name" => Some(BaseType::UInt16),
24779        "banded_exercises_exercise_name" => Some(BaseType::UInt16),
24780        "battle_rope_exercise_name" => Some(BaseType::UInt16),
24781        "elliptical_exercise_name" => Some(BaseType::UInt16),
24782        "floor_climb_exercise_name" => Some(BaseType::UInt16),
24783        "indoor_bike_exercise_name" => Some(BaseType::UInt16),
24784        "indoor_row_exercise_name" => Some(BaseType::UInt16),
24785        "ladder_exercise_name" => Some(BaseType::UInt16),
24786        "sandbag_exercise_name" => Some(BaseType::UInt16),
24787        "sled_exercise_name" => Some(BaseType::UInt16),
24788        "sledge_hammer_exercise_name" => Some(BaseType::UInt16),
24789        "stair_stepper_exercise_name" => Some(BaseType::UInt16),
24790        "suspension_exercise_name" => Some(BaseType::UInt16),
24791        "tire_exercise_name" => Some(BaseType::UInt16),
24792        "bike_outdoor_exercise_name" => Some(BaseType::UInt16),
24793        "run_indoor_exercise_name" => Some(BaseType::UInt16),
24794        "water_type" => Some(BaseType::Enum),
24795        "tissue_model_type" => Some(BaseType::Enum),
24796        "dive_gas_status" => Some(BaseType::Enum),
24797        "dive_alert" => Some(BaseType::Enum),
24798        "dive_alarm_type" => Some(BaseType::Enum),
24799        "dive_backlight_mode" => Some(BaseType::Enum),
24800        "sleep_level" => Some(BaseType::Enum),
24801        "spo2_measurement_type" => Some(BaseType::Enum),
24802        "ccr_setpoint_switch_mode" => Some(BaseType::Enum),
24803        "dive_gas_mode" => Some(BaseType::Enum),
24804        "projectile_type" => Some(BaseType::Enum),
24805        "favero_product" => Some(BaseType::UInt16),
24806        "split_type" => Some(BaseType::Enum),
24807        "climb_pro_event" => Some(BaseType::Enum),
24808        "gas_consumption_rate_type" => Some(BaseType::Enum),
24809        "tap_sensitivity" => Some(BaseType::Enum),
24810        "radar_threat_level_type" => Some(BaseType::Enum),
24811        "sleep_disruption_severity" => Some(BaseType::Enum),
24812        "nap_period_feedback" => Some(BaseType::Enum),
24813        "nap_source" => Some(BaseType::Enum),
24814        "max_met_speed_source" => Some(BaseType::Enum),
24815        "max_met_heart_rate_source" => Some(BaseType::Enum),
24816        "hrv_status" => Some(BaseType::Enum),
24817        "no_fly_time_mode" => Some(BaseType::Enum),
24818        _ => None,
24819    }
24820}