Deduplicate deserialized recipients

Drop repeated recipient URLs after deserialization so equivalent public
aliases such as `Public`, `as:Public`, and the canonical public URL do
not produce duplicate entries.

Update the helper documentation and tests to match the deduplicated
result.
This commit is contained in:
Hong Minhee 2026-04-24 11:32:07 +09:00
parent eb45245dfd
commit 7cfd3945c0
No known key found for this signature in database
GPG key ID: C429ECD57EED6CCA

View file

@ -1,6 +1,7 @@
//! Serde deserialization functions which help to receive differently shaped data //! Serde deserialization functions which help to receive differently shaped data
use activitystreams_kinds::public; use activitystreams_kinds::public;
use itertools::Itertools;
use serde::{de::Error, Deserialize, Deserializer}; use serde::{de::Error, Deserialize, Deserializer};
use serde_json::Value; use serde_json::Value;
use url::Url; use url::Url;
@ -35,7 +36,7 @@ use url::Url;
/// assert_eq!(multiple.to.len(), 2); /// assert_eq!(multiple.to.len(), 2);
/// ///
/// let note: Note = serde_json::from_str(r#"{"to": ["Public", "as:Public"]}"#)?; /// let note: Note = serde_json::from_str(r#"{"to": ["Public", "as:Public"]}"#)?;
/// assert_eq!(note.to, vec![public(), public()]); /// assert_eq!(note.to, vec![public()]);
/// # Ok::<(), anyhow::Error>(()) /// # Ok::<(), anyhow::Error>(())
/// ``` /// ```
pub fn deserialize_one_or_many<'de, D>(deserializer: D) -> Result<Vec<Url>, D::Error> pub fn deserialize_one_or_many<'de, D>(deserializer: D) -> Result<Vec<Url>, D::Error>
@ -64,7 +65,8 @@ where
Value::String(value) => Url::parse(&value).map_err(D::Error::custom), Value::String(value) => Url::parse(&value).map_err(D::Error::custom),
value => Url::deserialize(value).map_err(D::Error::custom), value => Url::deserialize(value).map_err(D::Error::custom),
}) })
.collect() .collect::<Result<Vec<_>, _>>()
.map(|values| values.into_iter().unique().collect())
} }
/// Deserialize JSON single value or single element array into single value. /// Deserialize JSON single value or single element array into single value.
@ -224,12 +226,7 @@ mod tests {
assert_eq!( assert_eq!(
note.to, note.to,
vec![ vec![Url::parse("https://example.com/c/main")?, public(),]
Url::parse("https://example.com/c/main")?,
public(),
public(),
public(),
]
); );
Ok(()) Ok(())