post.rs (2399B)
1 #[cfg(not(feature = "std"))] 2 use alloc::{string::String, vec::Vec}; 3 4 use crate::social::{ 5 RadrootsSocialFarmAnchor, RadrootsSocialLocation, RadrootsSocialMediaMetadata, 6 RadrootsSocialTarget, 7 }; 8 9 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 10 #[derive(Clone, Debug)] 11 pub struct RadrootsPost { 12 pub content: String, 13 #[cfg_attr( 14 feature = "serde", 15 serde(default, skip_serializing_if = "Option::is_none") 16 )] 17 pub farm: Option<RadrootsSocialFarmAnchor>, 18 #[cfg_attr( 19 feature = "serde", 20 serde(default, skip_serializing_if = "Option::is_none") 21 )] 22 pub address_refs: Option<Vec<RadrootsSocialTarget>>, 23 #[cfg_attr( 24 feature = "serde", 25 serde(default, skip_serializing_if = "Option::is_none") 26 )] 27 pub location: Option<RadrootsSocialLocation>, 28 #[cfg_attr( 29 feature = "serde", 30 serde(default, skip_serializing_if = "Option::is_none") 31 )] 32 pub topics: Option<Vec<String>>, 33 #[cfg_attr( 34 feature = "serde", 35 serde(default, skip_serializing_if = "Option::is_none") 36 )] 37 pub quote_refs: Option<Vec<RadrootsSocialTarget>>, 38 #[cfg_attr( 39 feature = "serde", 40 serde(default, skip_serializing_if = "Option::is_none") 41 )] 42 pub media: Option<Vec<RadrootsSocialMediaMetadata>>, 43 } 44 45 #[cfg(all(test, feature = "std", feature = "serde"))] 46 mod tests { 47 use super::*; 48 49 #[test] 50 fn content_only_post_deserializes_without_social_metadata() { 51 let post: RadrootsPost = 52 serde_json::from_str(r#"{"content":"farm update"}"#).expect("post"); 53 54 assert_eq!(post.content, "farm update"); 55 assert!(post.farm.is_none()); 56 assert!(post.address_refs.is_none()); 57 assert!(post.location.is_none()); 58 assert!(post.topics.is_none()); 59 assert!(post.quote_refs.is_none()); 60 assert!(post.media.is_none()); 61 } 62 63 #[test] 64 fn content_only_post_serializes_without_null_social_metadata() { 65 let post = RadrootsPost { 66 content: "farm update".to_string(), 67 farm: None, 68 address_refs: None, 69 location: None, 70 topics: None, 71 quote_refs: None, 72 media: None, 73 }; 74 75 let json = serde_json::to_string(&post).expect("json"); 76 assert_eq!(json, r#"{"content":"farm update"}"#); 77 } 78 }