ireal_parser/
time_signature.rs

1use std::{fmt, str::FromStr};
2
3use crate::{Error, Result};
4
5/// Represents the time signatures
6#[derive(Debug, Eq, PartialEq, Copy, Clone)]
7pub enum TimeSignature {
8    /// 4/4
9    T44,
10    /// 3/4
11    T34,
12    /// 2/4
13    T24,
14    /// 5/4
15    T54,
16    /// 6/4
17    T64,
18    /// 7/4
19    T74,
20    /// 2/2
21    T22,
22    /// 3/2
23    T32,
24    /// 5/8
25    T58,
26    /// 6/8
27    T68,
28    /// 7/8
29    T78,
30    /// 9/8
31    T98,
32    /// 12/8
33    T12,
34}
35
36impl fmt::Display for TimeSignature {
37    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
38        use TimeSignature::*;
39
40        let s = match self {
41            T44 => "T44",
42            T34 => "T34",
43            T24 => "T24",
44            T54 => "T54",
45            T64 => "T64",
46            T74 => "T74",
47            T22 => "T22",
48            T32 => "T32",
49            T58 => "T58",
50            T68 => "T68",
51            T78 => "T78",
52            T98 => "T98",
53            T12 => "T12",
54        };
55
56        write!(f, "{s}")
57    }
58}
59
60impl FromStr for TimeSignature {
61    type Err = Error;
62
63    fn from_str(s: &str) -> Result<Self> {
64        use TimeSignature::*;
65
66        let ts = match s {
67            "T44" => T44,
68            "T34" => T34,
69            "T24" => T24,
70            "T54" => T54,
71            "T64" => T64,
72            "T74" => T74,
73            "T22" => T22,
74            "T32" => T32,
75            "T58" => T58,
76            "T68" => T68,
77            "T78" => T78,
78            "T98" => T98,
79            "T12" => T12,
80            _ => return Err(Error::InvalidTimeSignature),
81        };
82
83        Ok(ts)
84    }
85}