Skip to main content

ed_journals/modules/galaxy/models/
star_class.rs

1use std::fmt::{Display, Formatter};
2use std::str::FromStr;
3
4use serde::Serialize;
5use thiserror::Error;
6
7use crate::from_str_deserialize_impl;
8
9#[derive(Debug, Serialize, Clone, PartialEq, Hash, Eq)]
10pub enum StarClass {
11    // Main sequence
12    O,
13    B,
14    A,
15    F,
16    G,
17    K,
18    M,
19    L,
20    T,
21    Y,
22
23    // Proto stars
24    TTS,
25    Ae,
26    Be,
27    AeBe,
28
29    // Wolf-Rayet
30    W,
31    WN,
32    WNC,
33    WC,
34    WO,
35
36    // Carbon stars
37    CS,
38    C,
39    CN,
40    CJ,
41    CH,
42    CHd,
43
44    // White dwarfs
45    D,
46    DA,
47    DAB,
48    DAO,
49    DAZ,
50    DAV,
51    DB,
52    DBZ,
53    DBV,
54    DO,
55    DOV,
56    DQ,
57    DC,
58    DCV,
59    DX,
60
61    N, // Neutron star
62    H, // Black hole
63    X, // Exotic
64    SupermassiveBlackHole,
65
66    ABlueWhiteSuperGiant, // A_BlueWhiteSuperGiant
67    BBlueWhiteSuperGiant, // B_BlueWhiteSuperGiant
68    FWhiteSuperGiant,     // F_WhiteSuperGiant
69    GWhiteSuperGiant,     // G_WhiteSuperGiant
70    MRedSuperGiant,       // M_RedSuperGiant
71    MRedGiant,            // M_RedGiant
72    KOrangeGiant,         // K_OrangeGiant
73    RoguePlanet,
74    Nebula,
75    StellarRemnantNebula,
76
77    // No category
78    MS,
79    S,
80}
81
82#[derive(Debug, Error)]
83pub enum StarClassError {
84    #[error("Unknown star class: '{0}'")]
85    UnknownStarClass(String),
86}
87
88impl FromStr for StarClass {
89    type Err = StarClassError;
90
91    fn from_str(s: &str) -> Result<Self, Self::Err> {
92        Ok(match s {
93            "O" | "o" => StarClass::O,
94            "B" | "b" => StarClass::B,
95            "A" | "a" => StarClass::A,
96            "F" | "f" => StarClass::F,
97            "G" | "g" => StarClass::G,
98            "K" | "k" => StarClass::K,
99            "M" | "m" => StarClass::M,
100            "L" | "l" => StarClass::L,
101            "T" | "t" => StarClass::T,
102            "Y" | "y" => StarClass::Y,
103
104            "TTS" | "tts" => StarClass::TTS,
105            "Ae" | "ae" => StarClass::Ae,
106            "Be" | "be" => StarClass::Be,
107            "AeBe" | "aebe" => StarClass::AeBe,
108
109            "W" | "w" => StarClass::W,
110            "WN" | "wn" => StarClass::WN,
111            "WNC" | "wnc" => StarClass::WNC,
112            "WC" | "wc" => StarClass::WC,
113            "WO" | "wo" => StarClass::WO,
114
115            "CS" | "cs" => StarClass::CS,
116            "C" | "c" => StarClass::C,
117            "CN" | "cn" => StarClass::CN,
118            "CJ" | "cj" => StarClass::CJ,
119            "CH" | "ch" => StarClass::CH,
120            "CHd" | "chd" => StarClass::CHd,
121
122            "D" | "d" => StarClass::D,
123            "DA" | "da" => StarClass::DA,
124            "DAB" | "dab" => StarClass::DAB,
125            "DAO" | "dao" => StarClass::DAO,
126            "DAZ" | "daz" => StarClass::DAZ,
127            "DAV" | "dav" => StarClass::DAV,
128            "DB" | "db" => StarClass::DB,
129            "DBZ" | "dbz" => StarClass::DBZ,
130            "DBV" | "dbv" => StarClass::DBV,
131            "DO" | "do" => StarClass::DO,
132            "DOV" | "dov" => StarClass::DOV,
133            "DQ" | "dq" => StarClass::DQ,
134            "DC" | "dc" => StarClass::DC,
135            "DCV" | "dcv" => StarClass::DCV,
136            "DX" | "dx" => StarClass::DX,
137
138            "N" | "n" => StarClass::N,
139            "H" | "h" => StarClass::H,
140            "X" | "x" => StarClass::X,
141            "SupermassiveBlackHole" | "supermassiveblackhole" => StarClass::SupermassiveBlackHole,
142
143            "ABlueWhiteSuperGiant" | "abluewhitesupergiant" | "A_BlueWhiteSuperGiant" => {
144                StarClass::ABlueWhiteSuperGiant
145            }
146            "B_BlueWhiteSuperGiant" | "b_bluewhitesupergiant" => StarClass::BBlueWhiteSuperGiant,
147            "FWhiteSuperGiant" | "fwhitesupergiant" | "F_WhiteSuperGiant" => {
148                StarClass::FWhiteSuperGiant
149            }
150            "G_WhiteSuperGiant" | "g_whitesupergiant" => StarClass::GWhiteSuperGiant,
151            "MRedSuperGiant" | "mredsupergiant" | "M_RedSuperGiant" => StarClass::MRedSuperGiant,
152            "MRedGiant" | "mredgiant" | "M_RedGiant" | "M_TypeGiant" => StarClass::MRedGiant,
153            "KOrangeGiant" | "korangegiant" | "K_OrangeGiant" => StarClass::KOrangeGiant,
154            "RoguePlanet" | "rogueplanet" => StarClass::RoguePlanet,
155            "Nebula" | "nebula" => StarClass::Nebula,
156            "StellarRemnantNebula" | "stellarremnantnebula" => StarClass::StellarRemnantNebula,
157
158            "MS" | "ms" => StarClass::MS,
159            "S" | "s" => StarClass::S,
160
161            _ => return Err(StarClassError::UnknownStarClass(s.to_string())),
162        })
163    }
164}
165
166from_str_deserialize_impl!(StarClass);
167
168impl StarClass {
169    /// Returns the base exploration value of the star class. The value is returned as a f32 instead
170    /// of an u64 like how most credit values are represented as the base value
171    /// [StarClass::SupermassiveBlackHole] contains decimal places.
172    pub fn base_value(&self) -> f32 {
173        match self {
174            StarClass::D => 14_057.0,
175            StarClass::DA => 14_057.0,
176            StarClass::DAB => 14_057.0,
177            StarClass::DAO => 14_057.0,
178            StarClass::DAZ => 14_057.0,
179            StarClass::DAV => 14_057.0,
180            StarClass::DB => 14_057.0,
181            StarClass::DBZ => 14_057.0,
182            StarClass::DBV => 14_057.0,
183            StarClass::DO => 14_057.0,
184            StarClass::DOV => 14_057.0,
185            StarClass::DQ => 14_057.0,
186            StarClass::DC => 14_057.0,
187            StarClass::DCV => 14_057.0,
188            StarClass::DX => 14_057.0,
189            StarClass::N => 22_628.0,
190            StarClass::H => 22_628.0,
191            StarClass::SupermassiveBlackHole => 33.5678,
192            _ => 1_200.0,
193        }
194    }
195}
196
197impl Display for StarClass {
198    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
199        write!(
200            f,
201            "{}",
202            match self {
203                StarClass::O => "O",
204                StarClass::B => "B",
205                StarClass::A => "A",
206                StarClass::F => "F",
207                StarClass::G => "G",
208                StarClass::K => "K",
209                StarClass::M => "M",
210                StarClass::L => "L",
211                StarClass::T => "T",
212                StarClass::Y => "Y",
213                StarClass::TTS => "TTS",
214                StarClass::Ae => "Ae",
215                StarClass::Be => "Be",
216                StarClass::AeBe => "AeBe",
217                StarClass::W => "W",
218                StarClass::WN => "WN",
219                StarClass::WNC => "WNC",
220                StarClass::WC => "WC",
221                StarClass::WO => "WO",
222                StarClass::CS => "CS",
223                StarClass::C => "C",
224                StarClass::CN => "CN",
225                StarClass::CJ => "CJ",
226                StarClass::CH => "CH",
227                StarClass::CHd => "CHd",
228                StarClass::D => "D",
229                StarClass::DA => "DA",
230                StarClass::DAB => "DAB",
231                StarClass::DAO => "DAO",
232                StarClass::DAZ => "DAZ",
233                StarClass::DAV => "DAV",
234                StarClass::DB => "DB",
235                StarClass::DBZ => "DBZ",
236                StarClass::DBV => "DBV",
237                StarClass::DO => "DO",
238                StarClass::DOV => "DOV",
239                StarClass::DQ => "DQ",
240                StarClass::DC => "DC",
241                StarClass::DCV => "DCV",
242                StarClass::DX => "DX",
243                StarClass::N => "N",
244                StarClass::H => "H",
245                StarClass::X => "X",
246                StarClass::SupermassiveBlackHole => "SupermassiveBlackHole",
247                StarClass::ABlueWhiteSuperGiant => "ABlueWhiteSuperGiant",
248                StarClass::BBlueWhiteSuperGiant => "BBlueWhiteSuperGiant",
249                StarClass::FWhiteSuperGiant => "FWhiteSuperGiant",
250                StarClass::GWhiteSuperGiant => "GWhiteSuperGiant",
251                StarClass::MRedSuperGiant => "MRedSuperGiant",
252                StarClass::MRedGiant => "MRedGiant",
253                StarClass::KOrangeGiant => "KOrangeGiant",
254                StarClass::RoguePlanet => "RoguePlanet",
255                StarClass::Nebula => "Nebula",
256                StarClass::StellarRemnantNebula => "StellarRemnantNebula",
257                StarClass::MS => "MS",
258                StarClass::S => "S",
259            }
260        )
261    }
262}