use super::{LabelerDefs, ModerationDecision, ModerationPrefs, moderate};
use jacquard_common::types::string::Did;
pub trait Moderateable<'a> {
fn moderate_all(
&'a self,
prefs: &ModerationPrefs<'_>,
defs: &LabelerDefs<'_>,
accepted_labelers: &[Did<'_>],
) -> Vec<(&'static str, ModerationDecision)>;
}
pub trait ModeratableIterExt<'a, T: Moderateable<'a> + 'a>: Iterator<Item = &'a T> + Sized {
fn with_moderation(
self,
prefs: &'a ModerationPrefs<'_>,
defs: &'a LabelerDefs<'_>,
accepted_labelers: &'a [Did<'_>],
) -> impl Iterator<Item = (&'a T, Vec<(&'static str, ModerationDecision)>)> {
self.map(move |item| {
let scoped_decisions = item.moderate_all(prefs, defs, accepted_labelers);
(item, scoped_decisions)
})
}
fn filter_moderated(
self,
prefs: &'a ModerationPrefs<'_>,
defs: &'a LabelerDefs<'_>,
accepted_labelers: &'a [Did<'_>],
) -> impl Iterator<Item = &'a T> {
self.filter(move |item| {
let scoped_decisions = item.moderate_all(prefs, defs, accepted_labelers);
!scoped_decisions.iter().any(|(_, decision)| decision.filter)
})
}
}
impl<'a, T: Moderateable<'a> + 'a, I: Iterator<Item = &'a T>> ModeratableIterExt<'a, T> for I {}
#[cfg(feature = "api_bluesky")]
mod bluesky_impls {
use super::*;
use jacquard_api::app_bsky::feed::{FeedViewPost, ReplyRefParent, ReplyRefRoot};
impl<'a> Moderateable<'a> for FeedViewPost<'a> {
fn moderate_all(
&'a self,
prefs: &ModerationPrefs<'_>,
defs: &LabelerDefs<'_>,
accepted_labelers: &[Did<'_>],
) -> Vec<(&'static str, ModerationDecision)> {
let mut decisions = vec![
("post", moderate(&self.post, prefs, defs, accepted_labelers)),
(
"author",
moderate(&self.post.author, prefs, defs, accepted_labelers),
),
];
if let Some(reply) = &self.reply {
if let ReplyRefParent::PostView(parent) = &reply.parent {
decisions.push((
"reply_parent",
moderate(&**parent, prefs, defs, accepted_labelers),
));
decisions.push((
"reply_parent_author",
moderate(&parent.author, prefs, defs, accepted_labelers),
));
}
if let ReplyRefRoot::PostView(root) = &reply.root {
decisions.push((
"reply_root",
moderate(&**root, prefs, defs, accepted_labelers),
));
decisions.push((
"reply_root_author",
moderate(&root.author, prefs, defs, accepted_labelers),
));
}
if let Some(grandparent_author) = &reply.grandparent_author {
decisions.push((
"reply_grandparent_author",
moderate(grandparent_author, prefs, defs, accepted_labelers),
));
}
}
decisions
}
}
}