Skip to main content

pyth_lazer_protocol/
symbol_state.rs

1use {
2    serde::{Deserialize, Serialize},
3    std::fmt::Display,
4};
5
6#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
8#[serde(rename_all = "snake_case")]
9pub enum SymbolState {
10    ComingSoon,
11    Stable,
12    Inactive,
13    Beta,
14    Expired,
15    /// Deserialization fallback for states introduced after this build;
16    /// never originates server-side.
17    #[serde(other)]
18    Unknown,
19}
20
21impl Display for SymbolState {
22    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
23        match self {
24            SymbolState::ComingSoon => write!(f, "coming_soon"),
25            SymbolState::Stable => write!(f, "stable"),
26            SymbolState::Inactive => write!(f, "inactive"),
27            SymbolState::Beta => write!(f, "beta"),
28            SymbolState::Expired => write!(f, "expired"),
29            SymbolState::Unknown => write!(f, "unknown"),
30        }
31    }
32}
33
34#[cfg(test)]
35mod tests {
36    use super::*;
37
38    #[test]
39    fn known_states_roundtrip() {
40        for (state, wire) in [
41            (SymbolState::ComingSoon, "\"coming_soon\""),
42            (SymbolState::Stable, "\"stable\""),
43            (SymbolState::Inactive, "\"inactive\""),
44            (SymbolState::Beta, "\"beta\""),
45            (SymbolState::Expired, "\"expired\""),
46            (SymbolState::Unknown, "\"unknown\""),
47        ] {
48            assert_eq!(serde_json::to_string(&state).unwrap(), wire);
49            assert_eq!(
50                serde_json::from_str::<SymbolState>(wire).unwrap(),
51                state,
52                "{wire} should deserialize"
53            );
54        }
55    }
56
57    #[test]
58    fn unrecognized_state_deserializes_to_unknown() {
59        assert_eq!(
60            serde_json::from_str::<SymbolState>("\"some_future_state\"").unwrap(),
61            SymbolState::Unknown,
62        );
63    }
64}