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
34
35
36
37
38
39
40
41
42
43
44
use serde::{Deserialize, Serialize};
use std::fmt::Display;

#[derive(Copy, Clone, PartialEq, Eq, Serialize, Deserialize, Debug)]
pub enum StrumDirection {
    Down,
    Up,
}
impl Display for StrumDirection {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "{}", match self {
            StrumDirection::Down => "D",
            StrumDirection::Up => "U",
        })
    }
}

#[derive(Copy, Clone, PartialEq, Eq, Serialize, Deserialize, Debug)]
pub enum StrumStrings {
    All,
    Between(u8, u8),
}
impl Display for StrumStrings {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            StrumStrings::All => write!(f, "All"),
            StrumStrings::Between(x, y) => write!(f, "{}-{}", x, y),
        }
    }
}

#[derive(Copy, Clone, PartialEq, Eq, Serialize, Deserialize, Debug)]
pub struct Strum {
    pub strings: StrumStrings,
    pub direction: Option<StrumDirection>,
}
impl Display for Strum {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self.direction {
            Some(x) => write!(f, "{} {}", x, self.strings),
            None => write!(f, "{}", self.strings),
        }
    }
}