Skip to main content

ed_journals/modules/commander/models/
federation_rank.rs

1use std::fmt::{Display, Formatter};
2
3use serde::Serialize;
4use thiserror::Error;
5
6use crate::try_from_deserialize_impl;
7
8#[derive(Debug, Serialize, Clone, PartialEq)]
9pub enum FederationRank {
10    None,
11    Recruit,
12    Cadet,
13    Midshipman,
14    PettyOfficer,
15    ChiefPettyOfficer,
16    WarrantOfficer,
17    Ensign,
18    Lieutenant,
19    LieutenantCommander,
20    PostCommander,
21    PostCaptain,
22    RearAdmiral,
23    ViceAdmiral,
24    Admiral,
25
26    #[cfg(feature = "allow-unknown")]
27    #[cfg_attr(docsrs, doc(cfg(feature = "allow-unknown")))]
28    Unknown(u8),
29}
30
31#[derive(Debug, Error)]
32pub enum FederationRankError {
33    #[error("Unknown federation rank with id '{0}'")]
34    UnknownFederationRank(u8),
35}
36
37impl TryFrom<u8> for FederationRank {
38    type Error = FederationRankError;
39
40    fn try_from(value: u8) -> Result<Self, Self::Error> {
41        match value {
42            0 => Ok(FederationRank::None),
43            1 => Ok(FederationRank::Recruit),
44            2 => Ok(FederationRank::Cadet),
45            3 => Ok(FederationRank::Midshipman),
46            4 => Ok(FederationRank::PettyOfficer),
47            5 => Ok(FederationRank::ChiefPettyOfficer),
48            6 => Ok(FederationRank::WarrantOfficer),
49            7 => Ok(FederationRank::Ensign),
50            8 => Ok(FederationRank::Lieutenant),
51            9 => Ok(FederationRank::LieutenantCommander),
52            10 => Ok(FederationRank::PostCommander),
53            11 => Ok(FederationRank::PostCaptain),
54            12 => Ok(FederationRank::RearAdmiral),
55            13 => Ok(FederationRank::ViceAdmiral),
56            14 => Ok(FederationRank::Admiral),
57
58            #[cfg(feature = "allow-unknown")]
59            _ => Ok(FederationRank::Unknown(value)),
60
61            #[cfg(not(feature = "allow-unknown"))]
62            _ => Err(FederationRankError::UnknownFederationRank(value)),
63        }
64    }
65}
66
67try_from_deserialize_impl!(u8 => FederationRank);
68
69impl Display for FederationRank {
70    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
71        write!(
72            f,
73            "{}",
74            match self {
75                FederationRank::None => "None",
76                FederationRank::Recruit => "Recruit",
77                FederationRank::Cadet => "Cadet",
78                FederationRank::Midshipman => "Midshipman",
79                FederationRank::PettyOfficer => "Petty Officer",
80                FederationRank::ChiefPettyOfficer => "Chief Petty Officer",
81                FederationRank::WarrantOfficer => "WarrantOfficer",
82                FederationRank::Ensign => "Ensign",
83                FederationRank::Lieutenant => "Lieutenant",
84                FederationRank::LieutenantCommander => "Lieutenant Commander",
85                FederationRank::PostCommander => "Post Commander",
86                FederationRank::PostCaptain => "Post Captain",
87                FederationRank::RearAdmiral => "Rear Admiral",
88                FederationRank::ViceAdmiral => "Vice Admiral",
89                FederationRank::Admiral => "Admiral",
90
91                #[cfg(feature = "allow-unknown")]
92                FederationRank::Unknown(unknown) =>
93                    return write!(f, "Unknown federation rank nr: {unknown}"),
94            }
95        )
96    }
97}