decode.rs (2712B)
1 use radroots_event::{ 2 envelope::kind::is_request_kind, 3 social::job_request::{JobInput, JobParam, JobRequest}, 4 }; 5 6 #[cfg(not(feature = "std"))] 7 use alloc::{string::String, vec::Vec}; 8 9 use crate::job::{ 10 error::JobParseError, 11 util::{parse_bid_tag_sat, parse_bool_encrypted, parse_i_tags, parse_params}, 12 }; 13 use crate::parsed::{RadrootsParsedData, RadrootsParsedEvent}; 14 15 pub fn job_request_from_tags(kind: u32, tags: &[Vec<String>]) -> Result<JobRequest, JobParseError> { 16 let kind = u16::try_from(kind).map_err(|_| JobParseError::KindOutOfRange(kind))?; 17 let inputs: Vec<JobInput> = parse_i_tags(tags); 18 19 let output = tags 20 .iter() 21 .find(|t| t.first().map(|s| s.as_str()) == Some("output")) 22 .and_then(|t| t.get(1).cloned()); 23 24 let params: Vec<JobParam> = parse_params(tags); 25 26 let bid_sat = parse_bid_tag_sat(tags)?; 27 28 let relays = tags 29 .iter() 30 .filter(|t| t.first().map(|s| s.as_str()) == Some("relays")) 31 .filter_map(|t| t.get(1).cloned()) 32 .collect::<Vec<_>>(); 33 34 let providers = tags 35 .iter() 36 .filter(|t| t.first().map(|s| s.as_str()) == Some("p")) 37 .filter_map(|t| t.get(1).cloned()) 38 .collect::<Vec<_>>(); 39 40 let topics = tags 41 .iter() 42 .filter(|t| t.first().map(|s| s.as_str()) == Some("t")) 43 .filter_map(|t| t.get(1).cloned()) 44 .collect::<Vec<_>>(); 45 46 let encrypted = parse_bool_encrypted(tags); 47 48 if encrypted && providers.is_empty() { 49 return Err(JobParseError::MissingTag("p")); 50 } 51 52 Ok(JobRequest { 53 kind, 54 inputs, 55 output, 56 params, 57 bid_sat, 58 relays, 59 providers, 60 topics, 61 encrypted, 62 }) 63 } 64 65 pub fn data_from_event( 66 id: String, 67 author: String, 68 published_at: u64, 69 kind: u32, 70 tags: Vec<Vec<String>>, 71 ) -> Result<RadrootsParsedData<JobRequest>, JobParseError> { 72 if !is_request_kind(kind) { 73 return Err(JobParseError::InvalidTag("kind (expected 5000-5999)")); 74 } 75 let job_request = job_request_from_tags(kind, &tags)?; 76 Ok(RadrootsParsedData::new( 77 id, 78 author, 79 published_at, 80 kind, 81 job_request, 82 )) 83 } 84 85 pub fn parsed_from_event( 86 id: String, 87 author: String, 88 published_at: u64, 89 kind: u32, 90 content: String, 91 tags: Vec<Vec<String>>, 92 sig: String, 93 ) -> Result<RadrootsParsedEvent<JobRequest>, JobParseError> { 94 let data = data_from_event(id.clone(), author.clone(), published_at, kind, tags.clone())?; 95 RadrootsParsedEvent::from_event_parts(id, author, published_at, kind, content, tags, sig, data) 96 .map_err(|_| JobParseError::InvalidTag("event_envelope")) 97 }