encode.rs (2787B)
1 #[cfg(not(feature = "std"))] 2 use alloc::{ 3 string::{String, ToString}, 4 vec::Vec, 5 }; 6 7 use radroots_events::{ 8 farm::{RadrootsFarm, RadrootsFarmRef}, 9 kinds::KIND_FARM, 10 tags::TAG_D, 11 }; 12 13 use crate::d_tag::validate_d_tag; 14 use crate::error::EventEncodeError; 15 16 #[cfg(feature = "serde_json")] 17 use crate::wire::WireEventParts; 18 19 const TAG_T: &str = "t"; 20 const TAG_G: &str = "g"; 21 22 fn push_tag(tags: &mut Vec<Vec<String>>, key: &str, value: &str) { 23 tags.push(vec![key.to_string(), value.to_string()]); 24 } 25 26 pub fn farm_build_tags(farm: &RadrootsFarm) -> Result<Vec<Vec<String>>, EventEncodeError> { 27 if farm.d_tag.trim().is_empty() { 28 return Err(EventEncodeError::EmptyRequiredField("d_tag")); 29 } 30 validate_d_tag(&farm.d_tag, "d_tag")?; 31 if farm.name.trim().is_empty() { 32 return Err(EventEncodeError::EmptyRequiredField("name")); 33 } 34 let mut tags = Vec::new(); 35 push_tag(&mut tags, TAG_D, &farm.d_tag); 36 if let Some(items) = farm.tags.as_ref() { 37 for item in items.iter().filter(|v| !v.trim().is_empty()) { 38 push_tag(&mut tags, TAG_T, item); 39 } 40 } 41 if let Some(geohash) = farm 42 .location 43 .as_ref() 44 .and_then(|location| location.gcs.as_ref()) 45 .map(|gcs| gcs.geohash.trim()) 46 { 47 if geohash.is_empty() { 48 return Err(EventEncodeError::EmptyRequiredField("location.gcs.geohash")); 49 } 50 push_tag(&mut tags, TAG_G, geohash); 51 } 52 Ok(tags) 53 } 54 55 pub fn farm_ref_tags(farm: &RadrootsFarmRef) -> Result<Vec<Vec<String>>, EventEncodeError> { 56 if farm.pubkey.trim().is_empty() { 57 return Err(EventEncodeError::EmptyRequiredField("farm.pubkey")); 58 } 59 if farm.d_tag.trim().is_empty() { 60 return Err(EventEncodeError::EmptyRequiredField("farm.d_tag")); 61 } 62 validate_d_tag(&farm.d_tag, "farm.d_tag")?; 63 let mut addr = String::new(); 64 addr.push_str(&KIND_FARM.to_string()); 65 addr.push(':'); 66 addr.push_str(&farm.pubkey); 67 addr.push(':'); 68 addr.push_str(&farm.d_tag); 69 let mut tags = Vec::with_capacity(2); 70 push_tag(&mut tags, "p", &farm.pubkey); 71 push_tag(&mut tags, "a", &addr); 72 Ok(tags) 73 } 74 75 #[cfg(feature = "serde_json")] 76 pub fn to_wire_parts(farm: &RadrootsFarm) -> Result<WireEventParts, EventEncodeError> { 77 to_wire_parts_with_kind(farm, KIND_FARM) 78 } 79 80 #[cfg(feature = "serde_json")] 81 pub fn to_wire_parts_with_kind( 82 farm: &RadrootsFarm, 83 kind: u32, 84 ) -> Result<WireEventParts, EventEncodeError> { 85 if kind != KIND_FARM { 86 return Err(EventEncodeError::InvalidKind(kind)); 87 } 88 let tags = farm_build_tags(farm)?; 89 let content = serde_json::to_string(farm).map_err(|_| EventEncodeError::Json)?; 90 Ok(WireEventParts { 91 kind, 92 content, 93 tags, 94 }) 95 }