job_feedback.rs (2451B)
1 use radroots_events::job_feedback::RadrootsJobFeedbackEventIndex; 2 use radroots_events_codec::{job::error::JobParseError, job::feedback::decode as job_feedback_decode}; 3 use thiserror::Error; 4 5 use crate::relay::event::RelayIndexerEvent; 6 7 #[derive(Debug, Error)] 8 pub enum RadrootsJobFeedbackEventIndexError { 9 #[error("Failed to parse job feedback event: {0}")] 10 ParseError(#[from] JobParseError), 11 } 12 13 pub trait ToRadrootsJobFeedbackEventIndex { 14 fn to_radroots_job_feedback_event( 15 &self, 16 ) -> Result<RadrootsJobFeedbackEventIndex, RadrootsJobFeedbackEventIndexError>; 17 } 18 19 impl ToRadrootsJobFeedbackEventIndex for RelayIndexerEvent { 20 fn to_radroots_job_feedback_event( 21 &self, 22 ) -> Result<RadrootsJobFeedbackEventIndex, RadrootsJobFeedbackEventIndexError> { 23 let kind_u32 = self.kind.as_u64() as u32; 24 let index = job_feedback_decode::index_from_event( 25 self.id.clone(), 26 self.author.clone(), 27 self.created_at, 28 kind_u32, 29 self.content.clone(), 30 self.tags.clone(), 31 self.sig.clone(), 32 )?; 33 Ok(index) 34 } 35 } 36 37 #[cfg(test)] 38 mod tests { 39 use super::ToRadrootsJobFeedbackEventIndex; 40 use crate::domain::indexer::kind::IndexerEventKind; 41 use crate::relay::event::RelayIndexerEvent; 42 use radroots_events::kinds::KIND_JOB_FEEDBACK; 43 44 fn make_event(tags: Vec<Vec<String>>) -> RelayIndexerEvent { 45 RelayIndexerEvent { 46 id: "1".repeat(64), 47 author: "a".repeat(64), 48 created_at: 10, 49 pubkey: "a".repeat(64), 50 kind: IndexerEventKind::JobFeedback, 51 tags, 52 content: String::new(), 53 hash: "2".repeat(64), 54 sig: "3".repeat(64), 55 } 56 } 57 58 #[test] 59 fn job_feedback_decodes_status() { 60 let tags = vec![ 61 vec!["e".to_string(), "req123".to_string()], 62 vec!["status".to_string(), "success".to_string()], 63 ]; 64 let event = make_event(tags); 65 let index = event 66 .to_radroots_job_feedback_event() 67 .expect("job feedback index"); 68 assert_eq!(index.metadata.kind, KIND_JOB_FEEDBACK); 69 } 70 71 #[test] 72 fn job_feedback_requires_status_tag() { 73 let tags = vec![vec!["e".to_string(), "req123".to_string()]]; 74 let event = make_event(tags); 75 assert!(event.to_radroots_job_feedback_event().is_err()); 76 } 77 }