use crate::{
models::{ChannelType, PermissionOverwrite},
Maybe,
};
use serde::Deserialize;
#[cfg(feature = "client")]
use serde::Serialize;
#[cfg(feature = "openapi")]
use utoipa::ToSchema;
#[derive(Clone, Debug, Deserialize)]
#[cfg_attr(feature = "client", derive(Serialize))]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
#[serde(tag = "type")]
pub enum CreateGuildChannelInfo {
Text {
topic: Option<String>,
icon: Option<String>,
},
Announcement {
topic: Option<String>,
icon: Option<String>,
},
Voice {
#[serde(default)]
user_limit: u16,
icon: Option<String>,
},
Category,
}
impl CreateGuildChannelInfo {
#[inline]
#[must_use]
pub const fn channel_type(&self) -> ChannelType {
match self {
Self::Text { .. } => ChannelType::Text,
Self::Announcement { .. } => ChannelType::Announcement,
Self::Voice { .. } => ChannelType::Voice,
Self::Category => ChannelType::Category,
}
}
}
#[derive(Clone, Debug, Deserialize)]
#[cfg_attr(feature = "client", derive(Serialize))]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
pub struct CreateGuildChannelPayload {
pub name: String,
#[serde(flatten)]
pub info: CreateGuildChannelInfo,
pub icon: Option<String>,
pub parent_id: Option<u64>,
pub overwrites: Option<Vec<PermissionOverwrite>>,
}
#[derive(Clone, Debug, Deserialize)]
#[cfg_attr(feature = "client", derive(Serialize))]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
pub struct EditChannelPayload {
pub name: Option<String>,
#[serde(default)]
#[cfg_attr(feature = "client", serde(skip_serializing_if = "Maybe::is_absent"))]
#[cfg_attr(feature = "openapi", schema(nullable, value_type = Option<String>))]
pub topic: Maybe<String>,
#[serde(default)]
#[cfg_attr(feature = "client", serde(skip_serializing_if = "Maybe::is_absent"))]
#[cfg_attr(feature = "openapi", schema(nullable, value_type = Option<String>, format = "byte"))]
pub icon: Maybe<String>,
pub user_limit: Option<u16>,
}
#[derive(Clone, Debug, Deserialize)]
#[cfg_attr(feature = "client", derive(Serialize))]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
pub struct EditChannelPositionPayload {
pub id: u64,
pub position: u16,
#[serde(default)]
#[cfg_attr(feature = "client", serde(skip_serializing_if = "Maybe::is_absent"))]
#[cfg_attr(feature = "openapi", schema(nullable, value_type = Option<u64>))]
pub scope: Maybe<u64>,
}
#[derive(Clone, Debug, Deserialize)]
#[cfg_attr(feature = "client", derive(Serialize))]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
#[serde(transparent)]
pub struct EditChannelPositionsPayload {
pub positions: Vec<EditChannelPositionPayload>,
}