stellui 0.3.0

Terminal UI for stargazing — displays a live star chart with sun/moon positions and weather-based seeing quality forecasts
Documentation
/// Object type classification for deep-sky objects.
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DsoKind {
    Galaxy,
    OpenCluster,
    GlobularCluster,
    Nebula,
    PlanetaryNebula,
    SupernovaRemnant,
    Other,
}

impl DsoKind {
    /// Single-character symbol used to represent this object type on the canvas.
    pub fn symbol(self) -> &'static str {
        match self {
            Self::Galaxy          => "",
            Self::OpenCluster     => "",
            Self::GlobularCluster => "",
            Self::Nebula          => "",
            Self::PlanetaryNebula => "",
            Self::SupernovaRemnant | Self::Other => "",
        }
    }

    pub fn label(self) -> &'static str {
        match self {
            Self::Galaxy          => "Galaxy",
            Self::OpenCluster     => "Open Cluster",
            Self::GlobularCluster => "Glob. Cluster",
            Self::Nebula          => "Nebula",
            Self::PlanetaryNebula => "Planet. Neb.",
            Self::SupernovaRemnant => "SNR",
            Self::Other           => "Other",
        }
    }
}

/// A single deep-sky object entry.
#[derive(Debug)]
pub struct Dso {
    /// Catalog designation, e.g. `"M31"`.
    pub catalog: &'static str,
    /// Common name, e.g. `"Andromeda Galaxy"`. Empty string if none.
    pub name: &'static str,
    pub kind: DsoKind,
    /// Right ascension in **hours** (J2000.0).
    pub ra: f64,
    /// Declination in **degrees** (J2000.0).
    pub dec: f64,
    /// Apparent integrated visual magnitude.
    pub mag: f64,
}

/// The complete Messier catalog (110 objects), J2000.0 coordinates.
pub const MESSIER: &[Dso] = &[
    Dso { catalog: "M1",   name: "Crab Nebula",         kind: DsoKind::SupernovaRemnant, ra:  5.575, dec:  22.017, mag:  8.4 },
    Dso { catalog: "M2",   name: "",                    kind: DsoKind::GlobularCluster,  ra: 21.558, dec:  -0.817, mag:  6.5 },
    Dso { catalog: "M3",   name: "",                    kind: DsoKind::GlobularCluster,  ra: 13.703, dec:  28.383, mag:  6.2 },
    Dso { catalog: "M4",   name: "",                    kind: DsoKind::GlobularCluster,  ra: 16.393, dec: -26.533, mag:  5.9 },
    Dso { catalog: "M5",   name: "",                    kind: DsoKind::GlobularCluster,  ra: 15.310, dec:   2.083, mag:  5.7 },
    Dso { catalog: "M6",   name: "Butterfly Cluster",   kind: DsoKind::OpenCluster,      ra: 17.668, dec: -32.217, mag:  4.2 },
    Dso { catalog: "M7",   name: "Ptolemy Cluster",     kind: DsoKind::OpenCluster,      ra: 17.898, dec: -34.817, mag:  3.3 },
    Dso { catalog: "M8",   name: "Lagoon Nebula",       kind: DsoKind::Nebula,           ra: 18.063, dec: -24.383, mag:  6.0 },
    Dso { catalog: "M9",   name: "",                    kind: DsoKind::GlobularCluster,  ra: 17.320, dec: -18.517, mag:  7.9 },
    Dso { catalog: "M10",  name: "",                    kind: DsoKind::GlobularCluster,  ra: 16.952, dec:  -4.100, mag:  6.4 },
    Dso { catalog: "M11",  name: "Wild Duck Cluster",   kind: DsoKind::OpenCluster,      ra: 18.852, dec:  -6.267, mag:  5.8 },
    Dso { catalog: "M12",  name: "",                    kind: DsoKind::GlobularCluster,  ra: 16.787, dec:  -1.950, mag:  6.7 },
    Dso { catalog: "M13",  name: "Hercules Cluster",    kind: DsoKind::GlobularCluster,  ra: 16.695, dec:  36.467, mag:  5.8 },
    Dso { catalog: "M14",  name: "",                    kind: DsoKind::GlobularCluster,  ra: 17.627, dec:  -3.250, mag:  7.6 },
    Dso { catalog: "M15",  name: "",                    kind: DsoKind::GlobularCluster,  ra: 21.500, dec:  12.167, mag:  6.2 },
    Dso { catalog: "M16",  name: "Eagle Nebula",        kind: DsoKind::OpenCluster,      ra: 18.313, dec: -13.783, mag:  6.4 },
    Dso { catalog: "M17",  name: "Omega Nebula",        kind: DsoKind::Nebula,           ra: 18.347, dec: -16.183, mag:  6.0 },
    Dso { catalog: "M18",  name: "",                    kind: DsoKind::OpenCluster,      ra: 18.332, dec: -17.133, mag:  7.5 },
    Dso { catalog: "M19",  name: "",                    kind: DsoKind::GlobularCluster,  ra: 17.043, dec: -26.267, mag:  6.8 },
    Dso { catalog: "M20",  name: "Trifid Nebula",       kind: DsoKind::Nebula,           ra: 18.043, dec: -23.033, mag:  6.3 },
    Dso { catalog: "M21",  name: "",                    kind: DsoKind::OpenCluster,      ra: 18.077, dec: -22.500, mag:  5.9 },
    Dso { catalog: "M22",  name: "",                    kind: DsoKind::GlobularCluster,  ra: 18.607, dec: -23.900, mag:  5.1 },
    Dso { catalog: "M23",  name: "",                    kind: DsoKind::OpenCluster,      ra: 17.947, dec: -19.017, mag:  5.5 },
    Dso { catalog: "M24",  name: "Sgr Star Cloud",      kind: DsoKind::OpenCluster,      ra: 18.282, dec: -18.483, mag:  4.6 },
    Dso { catalog: "M25",  name: "",                    kind: DsoKind::OpenCluster,      ra: 18.527, dec: -19.250, mag:  4.6 },
    Dso { catalog: "M26",  name: "",                    kind: DsoKind::OpenCluster,      ra: 18.753, dec:  -9.400, mag:  8.0 },
    Dso { catalog: "M27",  name: "Dumbbell Nebula",     kind: DsoKind::PlanetaryNebula,  ra: 19.993, dec:  22.717, mag:  7.4 },
    Dso { catalog: "M28",  name: "",                    kind: DsoKind::GlobularCluster,  ra: 18.408, dec: -24.867, mag:  6.9 },
    Dso { catalog: "M29",  name: "",                    kind: DsoKind::OpenCluster,      ra: 20.398, dec:  38.533, mag:  7.1 },
    Dso { catalog: "M30",  name: "",                    kind: DsoKind::GlobularCluster,  ra: 21.673, dec: -23.183, mag:  7.2 },
    Dso { catalog: "M31",  name: "Andromeda Galaxy",    kind: DsoKind::Galaxy,           ra:  0.712, dec:  41.267, mag:  3.4 },
    Dso { catalog: "M32",  name: "",                    kind: DsoKind::Galaxy,           ra:  0.712, dec:  40.867, mag:  8.7 },
    Dso { catalog: "M33",  name: "Triangulum Galaxy",   kind: DsoKind::Galaxy,           ra:  1.565, dec:  30.650, mag:  5.7 },
    Dso { catalog: "M34",  name: "",                    kind: DsoKind::OpenCluster,      ra:  2.702, dec:  42.783, mag:  5.2 },
    Dso { catalog: "M35",  name: "",                    kind: DsoKind::OpenCluster,      ra:  6.148, dec:  24.333, mag:  5.1 },
    Dso { catalog: "M36",  name: "",                    kind: DsoKind::OpenCluster,      ra:  5.602, dec:  34.133, mag:  6.0 },
    Dso { catalog: "M37",  name: "",                    kind: DsoKind::OpenCluster,      ra:  5.873, dec:  32.550, mag:  5.6 },
    Dso { catalog: "M38",  name: "",                    kind: DsoKind::OpenCluster,      ra:  5.478, dec:  35.833, mag:  6.4 },
    Dso { catalog: "M39",  name: "",                    kind: DsoKind::OpenCluster,      ra: 21.530, dec:  48.433, mag:  4.6 },
    Dso { catalog: "M40",  name: "Winnecke 4",          kind: DsoKind::Other,            ra: 12.370, dec:  58.083, mag:  8.0 },
    Dso { catalog: "M41",  name: "",                    kind: DsoKind::OpenCluster,      ra:  6.767, dec: -20.733, mag:  4.5 },
    Dso { catalog: "M42",  name: "Orion Nebula",        kind: DsoKind::Nebula,           ra:  5.590, dec:  -5.450, mag:  4.0 },
    Dso { catalog: "M43",  name: "De Mairan's Nebula",  kind: DsoKind::Nebula,           ra:  5.593, dec:  -5.267, mag:  9.0 },
    Dso { catalog: "M44",  name: "Beehive Cluster",     kind: DsoKind::OpenCluster,      ra:  8.668, dec:  19.983, mag:  3.1 },
    Dso { catalog: "M45",  name: "Pleiades",            kind: DsoKind::OpenCluster,      ra:  3.783, dec:  24.117, mag:  1.6 },
    Dso { catalog: "M46",  name: "",                    kind: DsoKind::OpenCluster,      ra:  7.697, dec: -14.817, mag:  6.1 },
    Dso { catalog: "M47",  name: "",                    kind: DsoKind::OpenCluster,      ra:  7.610, dec: -14.483, mag:  4.4 },
    Dso { catalog: "M48",  name: "",                    kind: DsoKind::OpenCluster,      ra:  8.228, dec:  -5.750, mag:  5.8 },
    Dso { catalog: "M49",  name: "",                    kind: DsoKind::Galaxy,           ra: 12.497, dec:   8.000, mag:  8.4 },
    Dso { catalog: "M50",  name: "",                    kind: DsoKind::OpenCluster,      ra:  7.048, dec:  -8.383, mag:  5.9 },
    Dso { catalog: "M51",  name: "Whirlpool Galaxy",    kind: DsoKind::Galaxy,           ra: 13.498, dec:  47.200, mag:  8.4 },
    Dso { catalog: "M52",  name: "",                    kind: DsoKind::OpenCluster,      ra: 23.403, dec:  61.583, mag:  6.9 },
    Dso { catalog: "M53",  name: "",                    kind: DsoKind::GlobularCluster,  ra: 13.215, dec:  18.167, mag:  7.7 },
    Dso { catalog: "M54",  name: "",                    kind: DsoKind::GlobularCluster,  ra: 18.918, dec: -30.483, mag:  7.7 },
    Dso { catalog: "M55",  name: "",                    kind: DsoKind::GlobularCluster,  ra: 19.667, dec: -30.967, mag:  6.3 },
    Dso { catalog: "M56",  name: "",                    kind: DsoKind::GlobularCluster,  ra: 19.277, dec:  30.183, mag:  8.3 },
    Dso { catalog: "M57",  name: "Ring Nebula",         kind: DsoKind::PlanetaryNebula,  ra: 18.893, dec:  33.033, mag:  8.8 },
    Dso { catalog: "M58",  name: "",                    kind: DsoKind::Galaxy,           ra: 12.628, dec:  11.817, mag:  9.7 },
    Dso { catalog: "M59",  name: "",                    kind: DsoKind::Galaxy,           ra: 12.700, dec:  11.633, mag:  9.6 },
    Dso { catalog: "M60",  name: "",                    kind: DsoKind::Galaxy,           ra: 12.728, dec:  11.550, mag:  8.8 },
    Dso { catalog: "M61",  name: "",                    kind: DsoKind::Galaxy,           ra: 12.365, dec:   4.467, mag:  9.7 },
    Dso { catalog: "M62",  name: "",                    kind: DsoKind::GlobularCluster,  ra: 17.020, dec: -30.117, mag:  6.6 },
    Dso { catalog: "M63",  name: "Sunflower Galaxy",    kind: DsoKind::Galaxy,           ra: 13.263, dec:  42.033, mag:  8.6 },
    Dso { catalog: "M64",  name: "Black Eye Galaxy",    kind: DsoKind::Galaxy,           ra: 12.945, dec:  21.683, mag:  8.5 },
    Dso { catalog: "M65",  name: "",                    kind: DsoKind::Galaxy,           ra: 11.315, dec:  13.083, mag:  9.3 },
    Dso { catalog: "M66",  name: "",                    kind: DsoKind::Galaxy,           ra: 11.337, dec:  12.983, mag:  8.9 },
    Dso { catalog: "M67",  name: "",                    kind: DsoKind::OpenCluster,      ra:  8.857, dec:  11.817, mag:  6.1 },
    Dso { catalog: "M68",  name: "",                    kind: DsoKind::GlobularCluster,  ra: 12.658, dec: -26.750, mag:  7.8 },
    Dso { catalog: "M69",  name: "",                    kind: DsoKind::GlobularCluster,  ra: 18.523, dec: -32.350, mag:  7.7 },
    Dso { catalog: "M70",  name: "",                    kind: DsoKind::GlobularCluster,  ra: 18.720, dec: -32.300, mag:  8.1 },
    Dso { catalog: "M71",  name: "",                    kind: DsoKind::GlobularCluster,  ra: 19.897, dec:  18.783, mag:  6.1 },
    Dso { catalog: "M72",  name: "",                    kind: DsoKind::GlobularCluster,  ra: 20.892, dec: -12.533, mag:  9.4 },
    Dso { catalog: "M73",  name: "",                    kind: DsoKind::OpenCluster,      ra: 20.982, dec: -12.633, mag:  9.0 },
    Dso { catalog: "M74",  name: "Phantom Galaxy",      kind: DsoKind::Galaxy,           ra:  1.612, dec:  15.783, mag:  9.4 },
    Dso { catalog: "M75",  name: "",                    kind: DsoKind::GlobularCluster,  ra: 20.102, dec: -21.917, mag:  8.6 },
    Dso { catalog: "M76",  name: "Little Dumbbell",     kind: DsoKind::PlanetaryNebula,  ra:  1.707, dec:  51.567, mag: 10.1 },
    Dso { catalog: "M77",  name: "",                    kind: DsoKind::Galaxy,           ra:  2.712, dec:  -0.017, mag:  8.9 },
    Dso { catalog: "M78",  name: "",                    kind: DsoKind::Nebula,           ra:  5.778, dec:   0.050, mag:  8.3 },
    Dso { catalog: "M79",  name: "",                    kind: DsoKind::GlobularCluster,  ra:  5.403, dec: -24.517, mag:  7.7 },
    Dso { catalog: "M80",  name: "",                    kind: DsoKind::GlobularCluster,  ra: 16.283, dec: -22.983, mag:  7.3 },
    Dso { catalog: "M81",  name: "Bode's Galaxy",       kind: DsoKind::Galaxy,           ra:  9.927, dec:  69.067, mag:  6.9 },
    Dso { catalog: "M82",  name: "Cigar Galaxy",        kind: DsoKind::Galaxy,           ra:  9.930, dec:  69.683, mag:  8.4 },
    Dso { catalog: "M83",  name: "Southern Pinwheel",   kind: DsoKind::Galaxy,           ra: 13.617, dec: -29.867, mag:  7.6 },
    Dso { catalog: "M84",  name: "",                    kind: DsoKind::Galaxy,           ra: 12.418, dec:  12.883, mag:  9.1 },
    Dso { catalog: "M85",  name: "",                    kind: DsoKind::Galaxy,           ra: 12.423, dec:  18.183, mag:  9.2 },
    Dso { catalog: "M86",  name: "",                    kind: DsoKind::Galaxy,           ra: 12.437, dec:  12.950, mag:  8.9 },
    Dso { catalog: "M87",  name: "Virgo A",             kind: DsoKind::Galaxy,           ra: 12.513, dec:  12.383, mag:  8.6 },
    Dso { catalog: "M88",  name: "",                    kind: DsoKind::Galaxy,           ra: 12.533, dec:  14.417, mag:  9.6 },
    Dso { catalog: "M89",  name: "",                    kind: DsoKind::Galaxy,           ra: 12.595, dec:  12.550, mag:  9.7 },
    Dso { catalog: "M90",  name: "",                    kind: DsoKind::Galaxy,           ra: 12.613, dec:  13.167, mag:  9.5 },
    Dso { catalog: "M91",  name: "",                    kind: DsoKind::Galaxy,           ra: 12.590, dec:  14.500, mag: 10.2 },
    Dso { catalog: "M92",  name: "",                    kind: DsoKind::GlobularCluster,  ra: 17.285, dec:  43.133, mag:  6.4 },
    Dso { catalog: "M93",  name: "",                    kind: DsoKind::OpenCluster,      ra:  7.743, dec: -23.867, mag:  6.0 },
    Dso { catalog: "M94",  name: "",                    kind: DsoKind::Galaxy,           ra: 12.848, dec:  41.117, mag:  8.2 },
    Dso { catalog: "M95",  name: "",                    kind: DsoKind::Galaxy,           ra: 10.733, dec:  11.700, mag:  9.7 },
    Dso { catalog: "M96",  name: "",                    kind: DsoKind::Galaxy,           ra: 10.780, dec:  11.817, mag:  9.2 },
    Dso { catalog: "M97",  name: "Owl Nebula",          kind: DsoKind::PlanetaryNebula,  ra: 11.247, dec:  55.017, mag:  9.9 },
    Dso { catalog: "M98",  name: "",                    kind: DsoKind::Galaxy,           ra: 12.230, dec:  14.900, mag: 10.1 },
    Dso { catalog: "M99",  name: "",                    kind: DsoKind::Galaxy,           ra: 12.313, dec:  14.417, mag:  9.9 },
    Dso { catalog: "M100", name: "",                    kind: DsoKind::Galaxy,           ra: 12.382, dec:  15.817, mag:  9.4 },
    Dso { catalog: "M101", name: "Pinwheel Galaxy",     kind: DsoKind::Galaxy,           ra: 14.053, dec:  54.350, mag:  7.9 },
    Dso { catalog: "M102", name: "",                    kind: DsoKind::Galaxy,           ra: 15.108, dec:  55.767, mag:  9.9 },
    Dso { catalog: "M103", name: "",                    kind: DsoKind::OpenCluster,      ra:  1.553, dec:  60.700, mag:  7.4 },
    Dso { catalog: "M104", name: "Sombrero Galaxy",     kind: DsoKind::Galaxy,           ra: 12.667, dec: -11.617, mag:  8.0 },
    Dso { catalog: "M105", name: "",                    kind: DsoKind::Galaxy,           ra: 10.797, dec:  12.583, mag:  9.8 },
    Dso { catalog: "M106", name: "",                    kind: DsoKind::Galaxy,           ra: 12.317, dec:  47.300, mag:  8.4 },
    Dso { catalog: "M107", name: "",                    kind: DsoKind::GlobularCluster,  ra: 16.542, dec: -13.050, mag:  7.8 },
    Dso { catalog: "M108", name: "",                    kind: DsoKind::Galaxy,           ra: 11.192, dec:  55.667, mag: 10.0 },
    Dso { catalog: "M109", name: "",                    kind: DsoKind::Galaxy,           ra: 11.960, dec:  53.367, mag:  9.8 },
    Dso { catalog: "M110", name: "",                    kind: DsoKind::Galaxy,           ra:  0.673, dec:  41.683, mag:  8.7 },
];