decode.rs (2228B)
1 #[cfg(not(feature = "std"))] 2 use alloc::{ 3 string::{String, ToString}, 4 vec::Vec, 5 }; 6 7 use radroots_events::{ 8 RadrootsNostrEvent, 9 app_data::{KIND_APP_DATA, RadrootsAppData}, 10 tags::TAG_D, 11 }; 12 13 use crate::error::EventParseError; 14 use crate::parsed::{RadrootsParsedData, RadrootsParsedEvent}; 15 16 fn parse_d_tag(tags: &[Vec<String>]) -> Result<String, EventParseError> { 17 let tag = tags 18 .iter() 19 .find(|t| t.first().map(|s| s.as_str()) == Some(TAG_D)) 20 .ok_or(EventParseError::MissingTag(TAG_D))?; 21 let value = tag 22 .get(1) 23 .map(|s| s.to_string()) 24 .ok_or(EventParseError::InvalidTag(TAG_D))?; 25 if value.trim().is_empty() { 26 return Err(EventParseError::InvalidTag(TAG_D)); 27 } 28 Ok(value) 29 } 30 31 pub fn app_data_from_tags( 32 kind: u32, 33 tags: &[Vec<String>], 34 content: &str, 35 ) -> Result<RadrootsAppData, EventParseError> { 36 if kind != KIND_APP_DATA { 37 return Err(EventParseError::InvalidKind { 38 expected: "30078", 39 got: kind, 40 }); 41 } 42 let d_tag = parse_d_tag(tags)?; 43 Ok(RadrootsAppData { 44 d_tag, 45 content: content.to_string(), 46 }) 47 } 48 49 pub fn data_from_event( 50 id: String, 51 author: String, 52 published_at: u32, 53 kind: u32, 54 content: String, 55 tags: Vec<Vec<String>>, 56 ) -> Result<RadrootsParsedData<RadrootsAppData>, EventParseError> { 57 let app_data = app_data_from_tags(kind, &tags, &content)?; 58 Ok(RadrootsParsedData::new( 59 id, 60 author, 61 published_at, 62 kind, 63 app_data, 64 )) 65 } 66 67 pub fn parsed_from_event( 68 id: String, 69 author: String, 70 published_at: u32, 71 kind: u32, 72 content: String, 73 tags: Vec<Vec<String>>, 74 sig: String, 75 ) -> Result<RadrootsParsedEvent<RadrootsAppData>, EventParseError> { 76 let data = data_from_event( 77 id.clone(), 78 author.clone(), 79 published_at, 80 kind, 81 content.clone(), 82 tags.clone(), 83 )?; 84 Ok(RadrootsParsedEvent { 85 event: RadrootsNostrEvent { 86 id, 87 author, 88 created_at: published_at, 89 kind, 90 content, 91 tags, 92 sig, 93 }, 94 data, 95 }) 96 }