follow.rs (2211B)
1 use radroots_events::follow::RadrootsFollowEventIndex; 2 use radroots_events_codec::{error::EventParseError, follow::decode as follow_decode}; 3 use thiserror::Error; 4 5 use crate::relay::event::RelayIndexerEvent; 6 7 #[derive(Debug, Error)] 8 pub enum RadrootsFollowEventIndexError { 9 #[error("Failed to parse follow event: {0}")] 10 ParseError(#[from] EventParseError), 11 } 12 13 pub trait ToRadrootsFollowEventIndex { 14 fn to_radroots_follow_event( 15 &self, 16 ) -> Result<RadrootsFollowEventIndex, RadrootsFollowEventIndexError>; 17 } 18 19 impl ToRadrootsFollowEventIndex for RelayIndexerEvent { 20 fn to_radroots_follow_event( 21 &self, 22 ) -> Result<RadrootsFollowEventIndex, RadrootsFollowEventIndexError> { 23 let kind_u32 = self.kind.as_u64() as u32; 24 let index = follow_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::ToRadrootsFollowEventIndex; 40 use crate::domain::indexer::kind::IndexerEventKind; 41 use crate::relay::event::RelayIndexerEvent; 42 43 fn make_event(kind: IndexerEventKind, tags: Vec<Vec<String>>) -> RelayIndexerEvent { 44 RelayIndexerEvent { 45 id: "1".repeat(64), 46 author: "a".repeat(64), 47 created_at: 10, 48 pubkey: "a".repeat(64), 49 kind, 50 tags, 51 content: String::new(), 52 hash: "2".repeat(64), 53 sig: "3".repeat(64), 54 } 55 } 56 57 #[test] 58 fn follow_event_decodes_from_tags() { 59 let tags = vec![vec!["p".to_string(), "b".repeat(64)]]; 60 let event = make_event(IndexerEventKind::Follow, tags); 61 let index = event.to_radroots_follow_event().expect("follow index"); 62 assert_eq!(index.metadata.follow.list.len(), 1); 63 } 64 65 #[test] 66 fn follow_event_rejects_wrong_kind() { 67 let tags = vec![vec!["p".to_string(), "b".repeat(64)]]; 68 let event = make_event(IndexerEventKind::Post, tags); 69 assert!(event.to_radroots_follow_event().is_err()); 70 } 71 }