From f9ed2efb89515c3b7543a268e2efbd3bd3acf180 Mon Sep 17 00:00:00 2001 From: Felix Ableitner Date: Mon, 28 Jul 2025 11:16:17 +0200 Subject: [PATCH] Add helper deserialize_last() --- Cargo.lock | 2 +- src/protocol/helpers.rs | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index ccb2e14..47249df 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,7 +4,7 @@ version = 4 [[package]] name = "activitypub_federation" -version = "0.7.0-beta.4" +version = "0.7.0-beta.5" dependencies = [ "activitystreams-kinds", "actix-web", diff --git a/src/protocol/helpers.rs b/src/protocol/helpers.rs index 8c69f65..364e32b 100644 --- a/src/protocol/helpers.rs +++ b/src/protocol/helpers.rs @@ -116,6 +116,26 @@ where Ok(inner) } +/// Deserialize either single value or last item from an array into an optional field. +pub fn deserialize_last<'de, T, D>(deserializer: D) -> Result, D::Error> +where + T: Deserialize<'de>, + D: Deserializer<'de>, +{ + #[derive(Deserialize)] + #[serde(untagged)] + enum MaybeArray { + Simple(T), + Array(Vec), + } + + let result: MaybeArray = Deserialize::deserialize(deserializer)?; + Ok(match result { + MaybeArray::Simple(value) => Some(value), + MaybeArray::Array(value) => value.into_iter().last(), + }) +} + #[cfg(test)] mod tests { #[test]