egui_charts/drawings/domain/
elliott.rs1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
11#[non_exhaustive]
12pub enum ElliottDegree {
13 GrandSupercycle,
15 Supercycle,
17 Cycle,
19 Primary,
21 Intermediate,
23 #[default]
25 Minor,
26 Minute,
28 Minuette,
30 Subminuette,
32}
33
34impl ElliottDegree {
35 #[cfg(feature = "ui")]
37 pub(crate) const ALL: [Self; 9] = [
38 Self::GrandSupercycle,
39 Self::Supercycle,
40 Self::Cycle,
41 Self::Primary,
42 Self::Intermediate,
43 Self::Minor,
44 Self::Minute,
45 Self::Minuette,
46 Self::Subminuette,
47 ];
48
49 #[cfg(feature = "ui")]
51 pub(crate) fn name(self) -> &'static str {
52 match self {
53 Self::GrandSupercycle => "Grand Supercycle",
54 Self::Supercycle => "Supercycle",
55 Self::Cycle => "Cycle",
56 Self::Primary => "Primary",
57 Self::Intermediate => "Intermediate",
58 Self::Minor => "Minor",
59 Self::Minute => "Minute",
60 Self::Minuette => "Minuette",
61 Self::Subminuette => "Subminuette",
62 }
63 }
64
65 pub(crate) fn label(self, wave: char) -> String {
68 let (open, close) = match self {
69 Self::GrandSupercycle | Self::Primary | Self::Minute => ("((", "))"),
70 Self::Supercycle | Self::Intermediate | Self::Minuette => ("(", ")"),
71 Self::Cycle | Self::Minor | Self::Subminuette => ("", ""),
72 };
73 let lower = matches!(self, Self::Minute | Self::Minuette | Self::Subminuette);
74 let numeral = wave
75 .to_digit(10)
76 .filter(|n| (1..=5).contains(n))
77 .map(|n| n as usize - 1);
78 let mut label = String::from(open);
79 match (self, numeral) {
80 (Self::GrandSupercycle | Self::Supercycle | Self::Cycle, Some(n)) => {
81 label.push_str(["I", "II", "III", "IV", "V"][n]);
82 }
83 (_, Some(n)) if lower => label.push_str(["i", "ii", "iii", "iv", "v"][n]),
84 _ if lower => label.push(wave.to_ascii_lowercase()),
85 _ => label.push(wave),
86 }
87 label.push_str(close);
88 label
89 }
90}