encode.rs (2735B)
1 #[cfg(not(feature = "std"))] 2 use alloc::{ 3 string::{String, ToString}, 4 vec::Vec, 5 }; 6 7 use radroots_events::{kinds::is_nip51_list_set_kind, list_set::RadrootsListSet}; 8 9 use crate::error::EventEncodeError; 10 #[cfg(feature = "serde_json")] 11 use crate::list::encode::list_entries_to_tags; 12 use crate::wire::WireEventParts; 13 14 const TAG_D: &str = "d"; 15 const TAG_TITLE: &str = "title"; 16 const TAG_DESCRIPTION: &str = "description"; 17 const TAG_IMAGE: &str = "image"; 18 19 fn push_tag(tags: &mut Vec<Vec<String>>, key: &str, value: &str) { 20 tags.push(vec![key.to_string(), value.to_string()]); 21 } 22 23 pub fn list_set_build_tags(list: &RadrootsListSet) -> Result<Vec<Vec<String>>, EventEncodeError> { 24 if list.d_tag.trim().is_empty() { 25 return Err(EventEncodeError::EmptyRequiredField("d_tag")); 26 } 27 if !super::list_set_base64_id_is_valid(&list.d_tag) { 28 return Err(EventEncodeError::InvalidField("d_tag")); 29 } 30 let mut tags = Vec::with_capacity(1 + list.entries.len() + 3); 31 push_tag(&mut tags, TAG_D, &list.d_tag); 32 if let Some(title) = list.title.as_ref().filter(|v| !v.trim().is_empty()) { 33 push_tag(&mut tags, TAG_TITLE, title); 34 } 35 if let Some(description) = list.description.as_ref().filter(|v| !v.trim().is_empty()) { 36 push_tag(&mut tags, TAG_DESCRIPTION, description); 37 } 38 if let Some(image) = list.image.as_ref().filter(|v| !v.trim().is_empty()) { 39 push_tag(&mut tags, TAG_IMAGE, image); 40 } 41 for entry in &list.entries { 42 if entry.tag.trim().is_empty() { 43 return Err(EventEncodeError::EmptyRequiredField("entry.tag")); 44 } 45 let first = entry 46 .values 47 .first() 48 .ok_or(EventEncodeError::EmptyRequiredField("entry.values"))?; 49 if first.trim().is_empty() { 50 return Err(EventEncodeError::EmptyRequiredField("entry.values")); 51 } 52 let mut tag = Vec::with_capacity(1 + entry.values.len()); 53 tag.push(entry.tag.clone()); 54 tag.extend(entry.values.iter().cloned()); 55 tags.push(tag); 56 } 57 Ok(tags) 58 } 59 60 pub fn to_wire_parts_with_kind( 61 list: &RadrootsListSet, 62 kind: u32, 63 ) -> Result<WireEventParts, EventEncodeError> { 64 if !is_nip51_list_set_kind(kind) { 65 return Err(EventEncodeError::InvalidKind(kind)); 66 } 67 let tags = list_set_build_tags(list)?; 68 Ok(WireEventParts { 69 kind, 70 content: list.content.clone(), 71 tags, 72 }) 73 } 74 75 #[cfg(feature = "serde_json")] 76 pub fn list_set_private_entries_json( 77 entries: &[radroots_events::list::RadrootsListEntry], 78 ) -> Result<String, EventEncodeError> { 79 let tags = list_entries_to_tags(entries)?; 80 serde_json::to_string(&tags).map_err(|_| EventEncodeError::Json) 81 }