stellar_class/
luminosity.rs

1use crate::error::Error;
2
3/// Luminosity classes in the MK system.
4#[derive(Debug, Clone, Copy, PartialEq, Eq)]
5#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
6pub enum LuminosityClass {
7    /// 0 or Ia+, hypergiants or extremely luminous supergiants
8    Zero,
9    /// Luminous supergiants
10    Ia,
11    /// Intermediate-size luminous supergiants
12    Iab,
13    /// Less luminous supergiants
14    Ib,
15    /// Bright giants
16    II,
17    /// Normal giants
18    III,
19    /// Subgiants
20    IV,
21    /// Main-sequence stars (dwarfs)
22    V,
23    /// Subdwarfs
24    VI,
25    /// White dwarfs
26    VII,
27}
28
29impl TryFrom<&str> for LuminosityClass {
30    type Error = Error;
31
32    fn try_from(value: &str) -> Result<Self, Self::Error> {
33        let luminosity_class = match value {
34            "0" | "Ia+" => LuminosityClass::Zero,
35            "Ia" => LuminosityClass::Ia,
36            "Iab" => LuminosityClass::Iab,
37            "Ib" => LuminosityClass::Ib,
38            "II" => LuminosityClass::II,
39            "III" => LuminosityClass::III,
40            "IV" => LuminosityClass::IV,
41            "V" => LuminosityClass::V,
42            "VI" => LuminosityClass::VI,
43            "VII" => LuminosityClass::VII,
44            _ => return Err(Error::InvalidLuminosityClass),
45        };
46
47        Ok(luminosity_class)
48    }
49}
50
51impl Into<&'static str> for LuminosityClass {
52    fn into(self) -> &'static str {
53        match self {
54            LuminosityClass::Zero => "0",
55            LuminosityClass::Ia => "Ia",
56            LuminosityClass::Iab => "Iab",
57            LuminosityClass::Ib => "Ib",
58            LuminosityClass::II => "II",
59            LuminosityClass::III => "III",
60            LuminosityClass::IV => "IV",
61            LuminosityClass::V => "V",
62            LuminosityClass::VI => "VI",
63            LuminosityClass::VII => "VII",
64        }
65    }
66}