use crate::deserializer::*;
use crate::serializer::*;
use derive_builder::Builder;
use discord_client_macros::{CreatedAt, Flags};
use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize, Serialize, Clone, Builder, Default, CreatedAt, Flags)]
#[builder(setter(into, strip_option), default)]
pub struct Role {
#[serde(deserialize_with = "deserialize_string_to_u64")]
#[serde(serialize_with = "serialize_u64_as_string")]
pub id: u64,
#[serde(default)]
pub name: Option<String>,
pub description: Option<String>,
pub color: u32,
pub hoist: bool,
pub icon: Option<String>,
pub unicode_emoji: Option<String>,
pub position: i32,
pub permissions: String,
pub managed: bool,
pub mentionable: bool,
#[flag_enum("InPrompt=0")]
pub flags: Option<u64>,
pub tags: Option<RoleTags>,
}
#[derive(Debug, Deserialize, Serialize, Clone, Builder, Default)]
#[builder(setter(into, strip_option), default)]
pub struct RoleTags {
#[serde(default)]
#[serde(deserialize_with = "deserialize_option_string_to_u64")]
#[serde(serialize_with = "serialize_option_u64_as_string")]
pub bot_id: Option<u64>,
#[serde(default)]
#[serde(deserialize_with = "deserialize_option_string_to_u64")]
#[serde(serialize_with = "serialize_option_u64_as_string")]
pub integration_id: Option<u64>,
pub premium_subscriber: Option<bool>,
#[serde(default)]
#[serde(deserialize_with = "deserialize_option_string_to_u64")]
#[serde(serialize_with = "serialize_option_u64_as_string")]
pub subscription_listing_id: Option<u64>,
pub available_for_purchase: Option<bool>,
pub guild_connections: Option<bool>,
}