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)
    }
}