lib

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

encode.rs (1746B)


      1 #[cfg(not(feature = "std"))]
      2 use alloc::vec;
      3 #[cfg(not(feature = "std"))]
      4 use alloc::{
      5     string::{String, ToString},
      6     vec::Vec,
      7 };
      8 
      9 use radroots_events::geochat::RadrootsGeoChat;
     10 use radroots_events::kinds::KIND_GEOCHAT;
     11 
     12 use crate::error::EventEncodeError;
     13 use crate::wire::WireEventParts;
     14 
     15 const DEFAULT_KIND: u32 = KIND_GEOCHAT;
     16 const TAG_G: &str = "g";
     17 const TAG_N: &str = "n";
     18 const TAG_T: &str = "t";
     19 const TAG_T_TELEPORT: &str = "teleport";
     20 
     21 fn push_tag(tags: &mut Vec<Vec<String>>, key: &str, value: &str) {
     22     tags.push(vec![key.to_string(), value.to_string()]);
     23 }
     24 
     25 pub fn geochat_build_tags(geochat: &RadrootsGeoChat) -> Result<Vec<Vec<String>>, EventEncodeError> {
     26     let geohash = geochat.geohash.trim();
     27     if geohash.is_empty() {
     28         return Err(EventEncodeError::EmptyRequiredField("geohash"));
     29     }
     30 
     31     let mut tags = Vec::with_capacity(
     32         1 + usize::from(geochat.nickname.is_some()) + usize::from(geochat.teleported),
     33     );
     34     push_tag(&mut tags, TAG_G, geohash);
     35 
     36     if let Some(nickname) = geochat.nickname.as_ref() {
     37         let nickname = nickname.trim();
     38         if nickname.is_empty() {
     39             return Err(EventEncodeError::EmptyRequiredField("nickname"));
     40         }
     41         push_tag(&mut tags, TAG_N, nickname);
     42     }
     43 
     44     if geochat.teleported {
     45         push_tag(&mut tags, TAG_T, TAG_T_TELEPORT);
     46     }
     47 
     48     Ok(tags)
     49 }
     50 
     51 pub fn to_wire_parts(geochat: &RadrootsGeoChat) -> Result<WireEventParts, EventEncodeError> {
     52     if geochat.content.trim().is_empty() {
     53         return Err(EventEncodeError::EmptyRequiredField("content"));
     54     }
     55     let tags = geochat_build_tags(geochat)?;
     56     Ok(WireEventParts {
     57         kind: DEFAULT_KIND,
     58         content: geochat.content.clone(),
     59         tags,
     60     })
     61 }