rytm_rs/object/pattern/
types.rs

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/// The speed of a pattern.
9#[derive(
10    Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize,
11)]
12pub enum Speed {
13    #[default]
14    /// 1x
15    X1,
16    /// 2x
17    X2,
18    /// 3/2x
19    X3B2,
20    /// 3/4x
21    X3B4,
22    /// 1/2x
23    X1B2,
24    /// 1/4x
25    X1B4,
26    /// 1/8x
27    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/// The time mode of a pattern.
98#[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}