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 }