lib

Core libraries for Radroots
git clone https://radroots.dev/git/lib.git
Log | Files | Refs | README | LICENSE

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 }