encode.rs (2686B)
1 use crate::profile::error::ProfileEncodeError; 2 #[cfg(feature = "serde_json")] 3 use radroots_events::kinds::KIND_PROFILE; 4 use radroots_events::profile::{ 5 RADROOTS_PROFILE_TYPE_TAG_KEY, RadrootsProfile, RadrootsProfileType, 6 radroots_profile_type_tag_value, 7 }; 8 9 use nostr::Metadata; 10 use nostr::prelude::Url; 11 12 #[cfg(not(feature = "std"))] 13 use alloc::{string::String, vec::Vec}; 14 15 #[cfg(feature = "serde_json")] 16 use crate::wire::WireEventParts; 17 18 fn push_tag(tags: &mut Vec<Vec<String>>, key: &str, value: &str) { 19 tags.push(vec![key.to_string(), value.to_string()]); 20 } 21 22 pub fn profile_type_tags(profile_type: RadrootsProfileType) -> Vec<Vec<String>> { 23 let mut tags = Vec::with_capacity(1); 24 push_tag( 25 &mut tags, 26 RADROOTS_PROFILE_TYPE_TAG_KEY, 27 radroots_profile_type_tag_value(profile_type), 28 ); 29 tags 30 } 31 32 pub fn profile_build_tags(profile_type: Option<RadrootsProfileType>) -> Vec<Vec<String>> { 33 match profile_type { 34 Some(value) => profile_type_tags(value), 35 None => Vec::new(), 36 } 37 } 38 39 pub fn to_metadata(p: &RadrootsProfile) -> Result<Metadata, ProfileEncodeError> { 40 let mut md = Metadata::new().name(p.name.clone()); 41 42 if let Some(s) = &p.display_name { 43 md = md.display_name(s.clone()); 44 } 45 if let Some(s) = &p.about { 46 md = md.about(s.clone()); 47 } 48 if let Some(s) = &p.website { 49 let u = Url::parse(s).map_err(|_| ProfileEncodeError::InvalidUrl("website", s.clone()))?; 50 md = md.website(u); 51 } 52 if let Some(s) = &p.picture { 53 let u = Url::parse(s).map_err(|_| ProfileEncodeError::InvalidUrl("picture", s.clone()))?; 54 md = md.picture(u); 55 } 56 if let Some(s) = &p.banner { 57 let u = Url::parse(s).map_err(|_| ProfileEncodeError::InvalidUrl("banner", s.clone()))?; 58 md = md.banner(u); 59 } 60 if let Some(s) = &p.nip05 { 61 md = md.nip05(s.clone()); 62 } 63 if let Some(s) = &p.lud06 { 64 md = md.lud06(s.clone()); 65 } 66 if let Some(s) = &p.lud16 { 67 md = md.lud16(s.clone()); 68 } 69 70 Ok(md) 71 } 72 73 #[cfg(feature = "serde_json")] 74 pub fn to_wire_parts(p: &RadrootsProfile) -> Result<WireEventParts, ProfileEncodeError> { 75 to_wire_parts_with_profile_type(p, None) 76 } 77 78 #[cfg(feature = "serde_json")] 79 pub fn to_wire_parts_with_profile_type( 80 p: &RadrootsProfile, 81 profile_type: Option<RadrootsProfileType>, 82 ) -> Result<WireEventParts, ProfileEncodeError> { 83 let md = to_metadata(p)?; 84 let content = serde_json::to_string(&md).map_err(|_| ProfileEncodeError::Json)?; 85 let tags = profile_build_tags(profile_type); 86 Ok(WireEventParts { 87 kind: KIND_PROFILE, 88 content, 89 tags, 90 }) 91 }