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 O,
13 B,
14 A,
15 F,
16 G,
17 K,
18 M,
19 L,
20 T,
21 Y,
22
23 TTS,
25 Ae,
26 Be,
27 AeBe,
28
29 W,
31 WN,
32 WNC,
33 WC,
34 WO,
35
36 CS,
38 C,
39 CN,
40 CJ,
41 CH,
42 CHd,
43
44 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, H, X, SupermassiveBlackHole,
65
66 ABlueWhiteSuperGiant, BBlueWhiteSuperGiant, FWhiteSuperGiant, GWhiteSuperGiant, MRedSuperGiant, MRedGiant, KOrangeGiant, RoguePlanet,
74 Nebula,
75 StellarRemnantNebula,
76
77 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 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}