repost.rs (1895B)
1 #[cfg(not(feature = "std"))] 2 use alloc::string::String; 3 4 use crate::social::SocialTarget; 5 6 #[cfg_attr( 7 any(feature = "serde", test), 8 derive(serde::Serialize, serde::Deserialize) 9 )] 10 #[derive(Clone, Debug)] 11 pub struct Repost { 12 pub target: SocialTarget, 13 #[cfg_attr( 14 feature = "serde", 15 serde(default, skip_serializing_if = "Option::is_none") 16 )] 17 pub content: Option<String>, 18 } 19 20 #[cfg_attr( 21 any(feature = "serde", test), 22 derive(serde::Serialize, serde::Deserialize) 23 )] 24 #[derive(Clone, Debug)] 25 pub struct GenericRepost { 26 pub target: SocialTarget, 27 pub target_kind: u32, 28 #[cfg_attr( 29 feature = "serde", 30 serde(default, skip_serializing_if = "Option::is_none") 31 )] 32 pub content: Option<String>, 33 } 34 35 #[cfg(test)] 36 #[cfg_attr(coverage_nightly, coverage(off))] 37 mod tests { 38 use super::*; 39 40 #[test] 41 fn repost_models_represent_note_and_generic_targets() { 42 let note_target = SocialTarget::Event { 43 id: "a".repeat(64), 44 author: Some(crate::test_valid_hex_64('b')), 45 event_kind: Some(1), 46 relays: None, 47 }; 48 let article_target = SocialTarget::Address { 49 address: "30023:pubkey:article".to_string(), 50 author: Some(crate::test_valid_hex_64('b')), 51 event_kind: Some(30023), 52 relays: Some(vec!["wss://relay.example".to_string()]), 53 }; 54 55 let repost = Repost { 56 target: note_target, 57 content: None, 58 }; 59 let generic = GenericRepost { 60 target: article_target, 61 target_kind: 30023, 62 content: Some("long-form share".to_string()), 63 }; 64 65 assert!(matches!(repost.target, SocialTarget::Event { .. })); 66 assert_eq!(generic.target_kind, 30023); 67 assert!(matches!(generic.target, SocialTarget::Address { .. })); 68 } 69 }