parsed.rs (4285B)
1 #[cfg(not(feature = "std"))] 2 use alloc::{string::String, vec::Vec}; 3 4 use radroots_events::RadrootsNostrEvent; 5 6 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 7 #[derive(Clone, Debug, PartialEq, Eq)] 8 pub struct RadrootsParsedData<T> { 9 pub id: String, 10 pub author: String, 11 pub published_at: u32, 12 pub kind: u32, 13 pub data: T, 14 } 15 16 impl<T> RadrootsParsedData<T> { 17 #[inline] 18 pub fn new(id: String, author: String, published_at: u32, kind: u32, data: T) -> Self { 19 Self { 20 id, 21 author, 22 published_at, 23 kind, 24 data, 25 } 26 } 27 } 28 29 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 30 #[derive(Clone, Debug)] 31 pub struct RadrootsParsedEvent<T> { 32 pub event: RadrootsNostrEvent, 33 pub data: RadrootsParsedData<T>, 34 } 35 36 impl<T> RadrootsParsedEvent<T> { 37 #[inline] 38 pub fn new(event: RadrootsNostrEvent, data: RadrootsParsedData<T>) -> Self { 39 Self { event, data } 40 } 41 42 #[allow(clippy::too_many_arguments)] 43 pub fn from_parts( 44 id: String, 45 author: String, 46 published_at: u32, 47 kind: u32, 48 content: String, 49 tags: Vec<Vec<String>>, 50 sig: String, 51 data: T, 52 ) -> Self { 53 Self { 54 event: RadrootsNostrEvent { 55 id: id.clone(), 56 author: author.clone(), 57 created_at: published_at, 58 kind, 59 tags, 60 content, 61 sig, 62 }, 63 data: RadrootsParsedData::new(id, author, published_at, kind, data), 64 } 65 } 66 } 67 68 #[cfg(test)] 69 mod tests { 70 use super::{RadrootsParsedData, RadrootsParsedEvent}; 71 use radroots_events::RadrootsNostrEvent; 72 73 #[test] 74 fn parsed_data_constructor_maps_fields() { 75 let out = RadrootsParsedData::new( 76 "id".to_string(), 77 "author".to_string(), 78 10, 79 30402, 80 "payload".to_string(), 81 ); 82 assert_eq!(out.id, "id"); 83 assert_eq!(out.author, "author"); 84 assert_eq!(out.published_at, 10); 85 assert_eq!(out.kind, 30402); 86 assert_eq!(out.data, "payload"); 87 } 88 89 #[test] 90 fn parsed_event_constructor_maps_event_and_data() { 91 let event = RadrootsNostrEvent { 92 id: "id".to_string(), 93 author: "author".to_string(), 94 created_at: 22, 95 kind: 1, 96 tags: vec![vec!["k".to_string(), "v".to_string()]], 97 content: "content".to_string(), 98 sig: "sig".to_string(), 99 }; 100 let data = RadrootsParsedData::new( 101 "id".to_string(), 102 "author".to_string(), 103 22, 104 1, 105 "payload".to_string(), 106 ); 107 108 let out = RadrootsParsedEvent::new(event.clone(), data.clone()); 109 assert_eq!(out.event.id, event.id); 110 assert_eq!(out.event.author, event.author); 111 assert_eq!(out.event.created_at, event.created_at); 112 assert_eq!(out.event.kind, event.kind); 113 assert_eq!(out.event.tags, event.tags); 114 assert_eq!(out.event.content, event.content); 115 assert_eq!(out.event.sig, event.sig); 116 assert_eq!(out.data, data); 117 } 118 119 #[test] 120 fn parsed_event_from_parts_builds_consistent_structs() { 121 let out = RadrootsParsedEvent::from_parts( 122 "id".to_string(), 123 "author".to_string(), 124 77, 125 1111, 126 "hello".to_string(), 127 vec![vec!["e".to_string(), "root".to_string()]], 128 "sig".to_string(), 129 "payload".to_string(), 130 ); 131 assert_eq!(out.event.id, "id"); 132 assert_eq!(out.event.author, "author"); 133 assert_eq!(out.event.created_at, 77); 134 assert_eq!(out.event.kind, 1111); 135 assert_eq!(out.event.content, "hello"); 136 assert_eq!( 137 out.event.tags, 138 vec![vec!["e".to_string(), "root".to_string()]] 139 ); 140 assert_eq!(out.event.sig, "sig"); 141 assert_eq!(out.data.id, "id"); 142 assert_eq!(out.data.author, "author"); 143 assert_eq!(out.data.published_at, 77); 144 assert_eq!(out.data.kind, 1111); 145 assert_eq!(out.data.data, "payload"); 146 } 147 }