decode.rs (2101B)
1 #[cfg(not(feature = "std"))] 2 use alloc::{ 3 string::{String, ToString}, 4 vec::Vec, 5 }; 6 7 use radroots_events::{RadrootsNostrEvent, kinds::KIND_MESSAGE, message::RadrootsMessage}; 8 9 use crate::error::EventParseError; 10 use crate::message::tags::{parse_recipients, parse_reply_tag, parse_subject_tag}; 11 use crate::parsed::{RadrootsParsedData, RadrootsParsedEvent}; 12 13 const DEFAULT_KIND: u32 = KIND_MESSAGE; 14 15 pub fn message_from_tags( 16 kind: u32, 17 tags: &[Vec<String>], 18 content: &str, 19 ) -> Result<RadrootsMessage, EventParseError> { 20 if kind != DEFAULT_KIND { 21 return Err(EventParseError::InvalidKind { 22 expected: "14", 23 got: kind, 24 }); 25 } 26 if content.trim().is_empty() { 27 return Err(EventParseError::InvalidTag("content")); 28 } 29 30 let recipients = parse_recipients(tags)?; 31 32 let reply_to = parse_reply_tag(tags)?; 33 34 let subject = parse_subject_tag(tags)?; 35 36 Ok(RadrootsMessage { 37 recipients, 38 content: content.to_string(), 39 reply_to, 40 subject, 41 }) 42 } 43 44 pub fn data_from_event( 45 id: String, 46 author: String, 47 published_at: u32, 48 kind: u32, 49 content: String, 50 tags: Vec<Vec<String>>, 51 ) -> Result<RadrootsParsedData<RadrootsMessage>, EventParseError> { 52 let message = message_from_tags(kind, &tags, &content)?; 53 Ok(RadrootsParsedData::new( 54 id, 55 author, 56 published_at, 57 kind, 58 message, 59 )) 60 } 61 62 pub fn parsed_from_event( 63 id: String, 64 author: String, 65 published_at: u32, 66 kind: u32, 67 content: String, 68 tags: Vec<Vec<String>>, 69 sig: String, 70 ) -> Result<RadrootsParsedEvent<RadrootsMessage>, EventParseError> { 71 let data = data_from_event( 72 id.clone(), 73 author.clone(), 74 published_at, 75 kind, 76 content.clone(), 77 tags.clone(), 78 )?; 79 Ok(RadrootsParsedEvent { 80 event: RadrootsNostrEvent { 81 id, 82 author, 83 created_at: published_at, 84 kind, 85 content, 86 tags, 87 sig, 88 }, 89 data, 90 }) 91 }