twilight_model/guild/onboarding/
mode.rs

1use std::fmt::{Display, Formatter, Result as FmtResult};
2
3use serde::{Deserialize, Serialize};
4
5/// Defines the criteria used to satisfy Onboarding constraints that are required for enabling.
6#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
7#[non_exhaustive]
8#[serde(from = "u8", into = "u8")]
9pub enum OnboardingMode {
10    /// Counts only Default Channels towards constraints
11    OnboardingDefault,
12    /// Counts Default Channels and Questions towards constraint.
13    OnboardingAdvanced,
14    /// Variant is unknown to the library.
15    Unknown(u8),
16}
17
18impl From<u8> for OnboardingMode {
19    fn from(value: u8) -> Self {
20        match value {
21            0 => OnboardingMode::OnboardingDefault,
22            1 => OnboardingMode::OnboardingAdvanced,
23            unknown => OnboardingMode::Unknown(unknown),
24        }
25    }
26}
27
28impl From<OnboardingMode> for u8 {
29    fn from(value: OnboardingMode) -> Self {
30        match value {
31            OnboardingMode::OnboardingDefault => 0,
32            OnboardingMode::OnboardingAdvanced => 1,
33            OnboardingMode::Unknown(unknown) => unknown,
34        }
35    }
36}
37
38impl OnboardingMode {
39    /// Name of the onboarding mode.
40    pub const fn name(self) -> &'static str {
41        match self {
42            Self::OnboardingDefault => "OnboardingDefault",
43            Self::OnboardingAdvanced => "OnboardingAdvanced",
44            Self::Unknown(_) => "Unknown",
45        }
46    }
47}
48
49impl Display for OnboardingMode {
50    fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
51        f.write_str(self.name())
52    }
53}
54
55#[cfg(test)]
56mod tests {
57    use super::*;
58    use serde_test::Token;
59    use static_assertions::assert_impl_all;
60    use std::{fmt::Debug, hash::Hash};
61
62    assert_impl_all!(
63        OnboardingMode: Clone,
64        Copy,
65        Debug,
66        Deserialize<'static>,
67        Eq,
68        Hash,
69        PartialEq,
70        Send,
71        Serialize,
72        Sync
73    );
74
75    #[test]
76    fn variants() {
77        serde_test::assert_tokens(&OnboardingMode::OnboardingDefault, &[Token::U8(0)]);
78        serde_test::assert_tokens(&OnboardingMode::OnboardingAdvanced, &[Token::U8(1)]);
79        serde_test::assert_tokens(&OnboardingMode::Unknown(99), &[Token::U8(99)]);
80    }
81
82    #[test]
83    fn names() {
84        assert_eq!(
85            "OnboardingDefault",
86            OnboardingMode::OnboardingDefault.name()
87        );
88        assert_eq!(
89            "OnboardingAdvanced",
90            OnboardingMode::OnboardingAdvanced.name()
91        );
92        assert_eq!("Unknown", OnboardingMode::Unknown(99).name());
93    }
94}