From 241351c2bf03c90ec549d9233ad07d7fa4e4e26d Mon Sep 17 00:00:00 2001 From: silverpill Date: Tue, 22 Nov 2022 18:59:42 +0000 Subject: [PATCH] Allow value of "icon" property to be empty object --- src/activitypub/actors/types.rs | 37 +++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/src/activitypub/actors/types.rs b/src/activitypub/actors/types.rs index 1942f5a..c2469b5 100644 --- a/src/activitypub/actors/types.rs +++ b/src/activitypub/actors/types.rs @@ -2,7 +2,12 @@ use std::fmt; use std::str::FromStr; use regex::Regex; -use serde::{Deserialize, Serialize}; +use serde::{ + Deserialize, + Deserializer, + Serialize, + de::{Error as DeserializerError}, +}; use serde_json::{json, Value}; use crate::activitypub::{ @@ -70,6 +75,30 @@ pub struct ActorAttachment { pub signature_value: Option, } +// Some implementations use empty object instead of null +pub fn deserialize_image_opt<'de, D>( + deserializer: D, +) -> Result, D::Error> + where D: Deserializer<'de> +{ + let maybe_value: Option = Option::deserialize(deserializer)?; + let maybe_image = if let Some(value) = maybe_value { + let is_empty_object = value.as_object() + .map(|map| map.is_empty()) + .unwrap_or(false); + if is_empty_object { + None + } else { + let image = Image::deserialize(value) + .map_err(DeserializerError::custom)?; + Some(image) + } + } else { + None + }; + Ok(maybe_image) +} + // Clone and Debug traits are required by FromSql #[derive(Clone, Debug, Deserialize, Serialize)] #[cfg_attr(test, derive(Default))] @@ -100,7 +129,11 @@ pub struct Actor { pub public_key: PublicKey, - #[serde(skip_serializing_if = "Option::is_none")] + #[serde( + default, + deserialize_with = "deserialize_image_opt", + skip_serializing_if = "Option::is_none", + )] pub icon: Option, #[serde(skip_serializing_if = "Option::is_none")]