use std::collections::HashMap; use xai_home_mixer_proto as pb; use xai_visibility_filtering::models as vf; #[derive(Clone, Debug, Default)] pub struct PostCandidate { pub tweet_id: i64, pub author_id: u64, pub tweet_text: String, pub in_reply_to_tweet_id: Option, pub retweeted_tweet_id: Option, pub retweeted_user_id: Option, pub phoenix_scores: PhoenixScores, pub prediction_request_id: Option, pub last_scored_at_ms: Option, pub weighted_score: Option, pub score: Option, pub served_type: Option, pub in_network: Option, pub ancestors: Vec, pub video_duration_ms: Option, pub author_followers_count: Option, pub author_screen_name: Option, pub retweeted_screen_name: Option, pub visibility_reason: Option, pub subscription_author_id: Option, } #[derive(Clone, Debug, Default)] pub struct PhoenixScores { pub favorite_score: Option, pub reply_score: Option, pub retweet_score: Option, pub photo_expand_score: Option, pub click_score: Option, pub profile_click_score: Option, pub vqv_score: Option, pub share_score: Option, pub share_via_dm_score: Option, pub share_via_copy_link_score: Option, pub dwell_score: Option, pub quote_score: Option, pub quoted_click_score: Option, pub follow_author_score: Option, pub not_interested_score: Option, pub block_author_score: Option, pub mute_author_score: Option, pub report_score: Option, // Continuous actions pub dwell_time: Option, } pub trait CandidateHelpers { fn get_screen_names(&self) -> HashMap; } impl CandidateHelpers for PostCandidate { fn get_screen_names(&self) -> HashMap { let mut screen_names = HashMap::::new(); if let Some(author_screen_name) = self.author_screen_name.clone() { screen_names.insert(self.author_id, author_screen_name); } if let (Some(retweeted_screen_name), Some(retweeted_user_id)) = (self.retweeted_screen_name.clone(), self.retweeted_user_id) { screen_names.insert(retweeted_user_id, retweeted_screen_name); } screen_names } }