automate 0.4.0

An asynchronous library to interact with Discord API and make bots
use crate::gateway::{User, Webhook, Overwrite, ChannelType, PartialRole};
use crate::Snowflake;

#[object(server)]
pub struct AuditLog {
    pub webhooks: Vec<Webhook>,
    pub users: Vec<User>,
    pub audit_log_entries: Vec<AuditLogEntry>,
}

#[object(server)]
pub struct AuditLogEntry {
    pub id: Snowflake,
    #[nullable]
    pub target_id: Option<String>,
    pub changes: Option<Vec<AuditLogChange>>,
    pub user_id: Snowflake,
    pub action_type: AuditLogEvent,
    pub options: Option<AuditEntryInfo>,
    pub reason: Option<String>,
}

#[convert(u8)]
pub enum AuditLogEvent {
    GuildUpdate = 1,
    ChannelCreate = 10,
    ChannelUpdate = 11,
    ChannelDelete = 12,
    ChannelOverwriteCreate = 13,
    ChannelOverwriteUpdate = 14,
    ChannelOverwriteDelete = 15,
    MemberKick = 20,
    MemberPrune = 21,
    MemberBanAdd = 22,
    MemberBanRemove = 23,
    MemberUpdate = 24,
    MemberRoleUpdate = 25,
    MemberMove = 26,
    MemberDisconnect = 27,
    BotAdd = 28,
    RoleCreate = 30,
    RoleUpdate = 31,
    RoleDelete = 32,
    InviteCreate = 40,
    InviteUpdate = 41,
    InviteDelete = 42,
    WebhookCreate = 50,
    WebhookUpdate = 51,
    WebhookDelete = 52,
    EmojiCreate = 60,
    EmojiUpdate = 61,
    EmojiDelete = 62,
    MessageDelete = 72,
    MessageBulkDelete = 73,
    MessagePin = 74,
    MessageUnpin = 75,
    IntegrationCreate = 80,
    IntegrationUpdate = 81,
    IntegrationDelete = 82,
}

#[object(server)]
pub struct AuditEntryInfo {
    pub delete_member_days: Option<String>,
    pub members_removed: Option<String>,
    pub channel_id: Option<Snowflake>,
    pub count: Option<String>,
    pub id: Option<Snowflake>,
    #[serde(rename = "type")]
    pub _type: Option<String>,
    pub role_name: Option<String>,
}

#[derive(Clone, Deserialize, Debug)]
pub struct AuditLogChange {
    pub key: String,
    pub new_value: Option<AuditLogChangeValue>,
    pub old_value: Option<AuditLogChangeValue>,
}

#[derive(Clone, Deserialize, Debug)]
#[serde(untagged)]
pub enum AuditLogChangeValue {
    Snowflake(Snowflake),
    String(String),
    Integer(i32),
    Boolean(bool),
    Roles(Vec<PartialRole>),
    Overwrites(Vec<Overwrite>),
    Channel(ChannelType),
}