use serde::{Deserialize, Serialize};
use serde_repr::{Deserialize_repr, Serialize_repr};
use crate::types::{PartialEmoji, Snowflake};
#[derive(Debug, Clone, Deserialize)]
pub struct GuildOnboarding {
pub guild_id: Snowflake,
pub prompts: Vec<OnboardingPrompt>,
pub default_channel_ids: Vec<Snowflake>,
pub enabled: bool,
pub mode: OnboardingMode,
}
#[derive(Debug, Clone, Deserialize)]
pub struct OnboardingPrompt {
pub id: Snowflake,
#[serde(rename = "type")]
pub t: OnboardingPromptType,
pub options: Vec<OnboardingPromptOption>,
pub title: String,
pub single_select: bool,
pub required: bool,
pub in_onboarding: bool,
}
#[derive(Debug, Clone, Deserialize)]
pub struct OnboardingPromptOption {
pub id: Snowflake,
pub channel_ids: Vec<Snowflake>,
pub role_ids: Vec<Snowflake>,
pub emoji: Option<PartialEmoji>,
pub title: String,
pub description: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize_repr, Serialize_repr)]
#[repr(u8)]
pub enum OnboardingMode {
Default = 0,
Advanced = 1,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize_repr, Serialize_repr)]
#[repr(u8)]
pub enum OnboardingPromptType {
MultipleChoice = 0,
Dropdown = 1,
}
#[derive(Debug, Clone, Deserialize)]
pub struct WelcomeScreen {
pub description: Option<String>,
pub welcome_channels: Vec<WelcomeScreenChannel>,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub struct WelcomeScreenChannel {
pub channel_id: Snowflake,
pub description: String,
pub emoji_id: Option<Snowflake>,
pub emoji_name: Option<String>,
}
#[cfg(test)]
mod tests {
use serde_json::json;
use super::*;
#[test]
fn parses_onboarding_and_welcome_screens() {
let onboarding: GuildOnboarding = serde_json::from_value(json!({
"guild_id": "5", "enabled": true, "mode": 1, "default_channel_ids": ["6"],
"prompts": [{
"id": "9", "type": 1, "title": "What do you write?", "single_select": false,
"required": true, "in_onboarding": true,
"options": [{
"id": "10", "title": "Rust", "description": null, "role_ids": ["7"],
"channel_ids": [], "emoji": { "id": null, "name": "crab", "animated": false },
}],
}],
}))
.unwrap();
assert_eq!(onboarding.mode, OnboardingMode::Advanced);
let prompt = &onboarding.prompts[0];
assert_eq!(prompt.t, OnboardingPromptType::Dropdown);
assert_eq!(
prompt.options[0].emoji.as_ref().unwrap().name.as_deref(),
Some("crab")
);
let screen: WelcomeScreen = serde_json::from_value(json!({
"description": "Welcome!",
"welcome_channels": [
{ "channel_id": "8", "description": "Say hi", "emoji_id": null, "emoji_name": null },
],
}))
.unwrap();
assert_eq!(screen.welcome_channels[0].description, "Say hi");
}
}