1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
use crate::{ guild::Permissions, id::{RoleId, UserId}, }; use serde::{ de::{Deserializer, Error as DeError}, ser::{SerializeStruct, Serializer}, Deserialize, Serialize, }; #[derive(Clone, Debug, Eq, Hash, PartialEq)] pub struct PermissionOverwrite { pub allow: Permissions, pub deny: Permissions, pub kind: PermissionOverwriteType, } #[derive(Clone, Debug, Eq, Hash, PartialEq)] pub enum PermissionOverwriteType { Member(UserId), Role(RoleId), } #[derive(Deserialize, Serialize)] struct PermissionOverwriteData { allow: Permissions, deny: Permissions, id: String, #[serde(rename = "type")] kind: PermissionOverwriteTypeName, } #[derive(Deserialize, Serialize)] #[serde(rename_all = "snake_case")] enum PermissionOverwriteTypeName { Member, Role, } impl<'de> Deserialize<'de> for PermissionOverwrite { fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> { let data = PermissionOverwriteData::deserialize(deserializer)?; let kind = match data.kind { PermissionOverwriteTypeName::Member => { let id = UserId(data.id.parse().map_err(DeError::custom)?); PermissionOverwriteType::Member(id) } PermissionOverwriteTypeName::Role => { let id = RoleId(data.id.parse().map_err(DeError::custom)?); PermissionOverwriteType::Role(id) } }; Ok(Self { allow: data.allow, deny: data.deny, kind, }) } } impl Serialize for PermissionOverwrite { fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> { let mut state = serializer.serialize_struct("PermissionOverwrite", 4)?; state.serialize_field("allow", &self.allow.bits())?; state.serialize_field("deny", &self.deny.bits())?; match &self.kind { PermissionOverwriteType::Member(id) => { state.serialize_field("id", &id)?; state.serialize_field("type", "member")?; } PermissionOverwriteType::Role(id) => { state.serialize_field("id", &id)?; state.serialize_field("type", "role")?; } } state.end() } }