Skip to content

Commit

Permalink
Fix AuditLog change deserialisation for permissions (serenity-rs#2717)
Browse files Browse the repository at this point in the history
  • Loading branch information
GnomedDev authored Jan 16, 2024
1 parent a7ff7f4 commit 0191917
Showing 1 changed file with 15 additions and 3 deletions.
18 changes: 15 additions & 3 deletions src/model/permissions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -800,11 +800,23 @@ impl Permissions {
}
}

// Manual impl needed because Permissions are sent as a stringified integer
// Manual impl needed because Permissions are usually sent as a stringified integer,
// but audit log changes are sent as an int, which is probably a problem.
impl<'de> Deserialize<'de> for Permissions {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let permissions_str = String::deserialize(deserializer)?;
let permissions_num = permissions_str.parse().map_err(DeError::custom)?;
#[derive(serde::Deserialize)]
#[serde(untagged)]
enum StrOrInt<'a> {
Str(&'a str),
String(String),
Integer(u64),
}

let permissions_num = match StrOrInt::deserialize(deserializer)? {
StrOrInt::String(permissions) => permissions.parse().map_err(DeError::custom)?,
StrOrInt::Str(permissions) => permissions.parse().map_err(DeError::custom)?,
StrOrInt::Integer(permissions) => permissions,
};

Ok(Permissions::from_bits_truncate(permissions_num))
}
Expand Down

0 comments on commit 0191917

Please sign in to comment.