1use crate::error::ConversionError;
2use rytm_sys::{
3 AR_SPEED_1B2X, AR_SPEED_1B4X, AR_SPEED_1B8X, AR_SPEED_1X, AR_SPEED_2X, AR_SPEED_3B2X,
4 AR_SPEED_3B4X,
5};
6use serde::{Deserialize, Serialize};
7
8#[derive(
10 Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize,
11)]
12pub enum Speed {
13 #[default]
14 X1,
16 X2,
18 X3B2,
20 X3B4,
22 X1B2,
24 X1B4,
26 X1B8,
28}
29
30impl TryFrom<&str> for Speed {
31 type Error = ConversionError;
32 fn try_from(speed: &str) -> Result<Self, Self::Error> {
33 match speed {
34 "1x" => Ok(Self::X1),
35 "2x" => Ok(Self::X2),
36 "3/2x" => Ok(Self::X3B2),
37 "3/4x" => Ok(Self::X3B4),
38 "1/2x" => Ok(Self::X1B2),
39 "1/4x" => Ok(Self::X1B4),
40 "1/8x" => Ok(Self::X1B8),
41 _ => Err(ConversionError::Range {
42 value: speed.to_string(),
43 type_name: "Speed".into(),
44 }),
45 }
46 }
47}
48
49impl From<Speed> for &str {
50 fn from(speed: Speed) -> Self {
51 match speed {
52 Speed::X1 => "1x",
53 Speed::X2 => "2x",
54 Speed::X3B2 => "3/2x",
55 Speed::X3B4 => "3/4x",
56 Speed::X1B2 => "1/2x",
57 Speed::X1B4 => "1/4x",
58 Speed::X1B8 => "1/8x",
59 }
60 }
61}
62
63impl From<Speed> for u8 {
64 fn from(speed: Speed) -> Self {
65 let speed = match speed {
66 Speed::X1 => AR_SPEED_1X,
67 Speed::X2 => AR_SPEED_2X,
68 Speed::X3B2 => AR_SPEED_3B2X,
69 Speed::X3B4 => AR_SPEED_3B4X,
70 Speed::X1B2 => AR_SPEED_1B2X,
71 Speed::X1B4 => AR_SPEED_1B4X,
72 Speed::X1B8 => AR_SPEED_1B8X,
73 };
74 speed as Self
75 }
76}
77
78impl TryFrom<u8> for Speed {
79 type Error = ConversionError;
80 fn try_from(speed: u8) -> Result<Self, Self::Error> {
81 match speed as u32 {
82 AR_SPEED_1X => Ok(Self::X1),
83 AR_SPEED_2X => Ok(Self::X2),
84 AR_SPEED_3B2X => Ok(Self::X3B2),
85 AR_SPEED_3B4X => Ok(Self::X3B4),
86 AR_SPEED_1B2X => Ok(Self::X1B2),
87 AR_SPEED_1B4X => Ok(Self::X1B4),
88 AR_SPEED_1B8X => Ok(Self::X1B8),
89 _ => Err(ConversionError::Range {
90 value: speed.to_string(),
91 type_name: "Speed".into(),
92 }),
93 }
94 }
95}
96
97#[derive(
99 Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize,
100)]
101pub enum TimeMode {
102 #[default]
103 Normal,
104 Advanced,
105}
106
107impl TryFrom<&str> for TimeMode {
108 type Error = ConversionError;
109 fn try_from(mode: &str) -> Result<Self, Self::Error> {
110 match mode {
111 "normal" => Ok(Self::Normal),
112 "advanced" => Ok(Self::Advanced),
113 _ => Err(ConversionError::Range {
114 value: mode.to_string(),
115 type_name: "TimeMode".into(),
116 }),
117 }
118 }
119}
120
121impl From<TimeMode> for &str {
122 fn from(mode: TimeMode) -> Self {
123 match mode {
124 TimeMode::Normal => "normal",
125 TimeMode::Advanced => "advanced",
126 }
127 }
128}
129
130impl From<TimeMode> for u8 {
131 fn from(mode: TimeMode) -> Self {
132 match mode {
133 TimeMode::Normal => 0,
134 TimeMode::Advanced => 1,
135 }
136 }
137}
138
139impl TryFrom<u8> for TimeMode {
140 type Error = ConversionError;
141 fn try_from(mode: u8) -> Result<Self, Self::Error> {
142 match mode {
143 0 => Ok(Self::Normal),
144 1 => Ok(Self::Advanced),
145 _ => Err(ConversionError::Range {
146 value: mode.to_string(),
147 type_name: "TimeMode".into(),
148 }),
149 }
150 }
151}