lib

Core libraries for Radroots
git clone https://radroots.dev/git/lib.git
Log | Files | Refs | README | LICENSE

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 }