twilight_model/guild/onboarding/
prompt.rs

1use crate::id::{marker::OnboardingPromptMarker, Id};
2use serde::{Deserialize, Serialize};
3
4use super::{OnboardingPromptOption, OnboardingPromptType};
5
6/// A prompt in the onboarding flow.
7#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
8pub struct OnboardingPrompt {
9    /// ID of the prompt.
10    pub id: Id<OnboardingPromptMarker>,
11    /// Whether this prompt is in the onboarding flow.
12    pub in_onboarding: bool,
13    /// [`OnboardingPromptType`] of the prompt.
14    #[serde(rename = "type")]
15    pub kind: OnboardingPromptType,
16    /// Array of [`OnboardingPromptOption`]s available to the prompt.
17    pub options: Vec<OnboardingPromptOption>,
18    /// Whether this prompt is required in the onboarding flow.
19    pub required: bool,
20    /// Whether this prompt allows selecting only one option.
21    pub single_select: bool,
22    /// Title of the prompt.
23    pub title: String,
24}
25
26#[cfg(test)]
27mod tests {
28    use super::OnboardingPrompt;
29    use crate::{guild::onboarding::OnboardingPromptType, id::Id};
30    use serde_test::Token;
31
32    #[test]
33    fn onboarding_prompt() {
34        let prompt = OnboardingPrompt {
35            id: Id::new(123_456_789),
36            in_onboarding: true,
37            kind: OnboardingPromptType::MultipleChoice,
38            options: Vec::new(),
39            required: true,
40            single_select: true,
41            title: String::from("a prompt"),
42        };
43
44        serde_test::assert_tokens(
45            &prompt,
46            &[
47                Token::Struct {
48                    name: "OnboardingPrompt",
49                    len: 7,
50                },
51                Token::Str("id"),
52                Token::NewtypeStruct { name: "Id" },
53                Token::Str("123456789"),
54                Token::Str("in_onboarding"),
55                Token::Bool(true),
56                Token::Str("type"),
57                Token::U8(0),
58                Token::Str("options"),
59                Token::Seq { len: Some(0) },
60                Token::SeqEnd,
61                Token::Str("required"),
62                Token::Bool(true),
63                Token::Str("single_select"),
64                Token::Bool(true),
65                Token::Str("title"),
66                Token::Str("a prompt"),
67                Token::StructEnd,
68            ],
69        );
70    }
71}