1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
use crate::Interval;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Accidental {
Natural,
Flat,
DoubleFlat,
Sharp,
DoubleSharp,
}
impl Accidental {
pub const fn interval(self) -> Interval {
match self {
Self::Natural => Interval::UNISON,
Self::Flat | Self::Sharp => Interval::MINOR_SECOND,
Self::DoubleFlat | Self::DoubleSharp => Interval::MAJOR_SECOND,
}
}
}
impl TryFrom<char> for Accidental {
type Error = char;
fn try_from(value: char) -> Result<Self, Self::Error> {
let accidental = match value {
'b' => Self::Flat,
'#' => Self::Sharp,
invalid => return Err(invalid),
};
Ok(accidental)
}
}