From c1064bdeaff4d2d835a51433f6dfdc9a0779cd12 Mon Sep 17 00:00:00 2001 From: Rudy Fraser Date: Thu, 19 Sep 2024 20:46:52 -0400 Subject: [PATCH] Serialize blob ref as cid-link type --- rsky-lexicon/src/com/atproto/repo.rs | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/rsky-lexicon/src/com/atproto/repo.rs b/rsky-lexicon/src/com/atproto/repo.rs index 9277685..d45c4fe 100644 --- a/rsky-lexicon/src/com/atproto/repo.rs +++ b/rsky-lexicon/src/com/atproto/repo.rs @@ -1,5 +1,6 @@ use crate::com::atproto::sync::{default_resource, deserialize_option_cid_v1}; use lexicon_cid::Cid; +use serde::ser::{Serializer, SerializeMap}; use serde_json::Value; #[derive(Debug, Clone, PartialEq, Deserialize, Serialize)] @@ -15,10 +16,18 @@ pub struct Record { pub value: Value, } -#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)] -pub struct Link { - #[serde(rename(deserialize = "$link", serialize = "$link"))] - pub link: String, +fn serialize_option_cid_as_link(cid_option: &Option, serializer: S) -> Result +where + S: Serializer, +{ + match cid_option { + Some(cid) => { + let mut map = serializer.serialize_map(Some(1))?; + map.serialize_entry("$link", &cid.to_string())?; + map.end() + } + None => serializer.serialize_none(), + } } #[derive(Debug, Clone, PartialEq, Deserialize, Serialize)] @@ -31,7 +40,8 @@ pub struct Blob { #[serde( skip_serializing_if = "Option::is_none", default = "default_resource", - deserialize_with = "deserialize_option_cid_v1" + deserialize_with = "deserialize_option_cid_v1", + serialize_with = "serialize_option_cid_as_link" )] pub r#ref: Option, #[serde(skip_serializing_if = "Option::is_none")]