use jacquard_api::com_atproto::label::{LabelValue, LabelValueDefinition};
use jacquard_common::CowStr;
use jacquard_common::types::string::Did;
use std::collections::HashMap;
#[derive(Debug, Clone)]
pub struct ModerationPrefs<'a> {
pub adult_content_enabled: bool,
pub labels: HashMap<CowStr<'a>, LabelPref>,
pub labelers: HashMap<Did<'a>, HashMap<CowStr<'a>, LabelPref>>,
}
impl Default for ModerationPrefs<'_> {
fn default() -> Self {
Self {
adult_content_enabled: false,
labels: HashMap::new(),
labelers: HashMap::new(),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum LabelPref {
Hide,
Warn,
Ignore,
}
#[derive(Debug, Clone, Default)]
pub struct LabelerDefs<'a> {
pub defs: HashMap<Did<'a>, Vec<LabelValueDefinition<'a>>>,
}
impl<'a> LabelerDefs<'a> {
pub fn new() -> Self {
Self::default()
}
pub fn insert(&mut self, did: Did<'a>, definitions: Vec<LabelValueDefinition<'a>>) {
self.defs.insert(did, definitions);
}
pub fn get(&self, did: &Did<'_>) -> Option<&[LabelValueDefinition<'a>]> {
self.defs
.iter()
.find(|(k, _)| k.as_ref() == did.as_ref())
.map(|(_, v)| v.as_slice())
}
pub fn find_def(
&self,
labeler: &Did<'_>,
identifier: &str,
) -> Option<&LabelValueDefinition<'a>> {
self.defs
.iter()
.find(|(k, _)| k.as_ref() == labeler.as_ref())
.and_then(|(_, v)| v.iter().find(|def| def.identifier.as_ref() == identifier))
}
}
#[derive(Debug, Clone, Default)]
pub struct ModerationDecision {
pub filter: bool,
pub blur: Blur,
pub alert: bool,
pub inform: bool,
pub no_override: bool,
pub causes: Vec<LabelCause<'static>>,
}
impl ModerationDecision {
pub fn none() -> Self {
Self::default()
}
pub fn is_moderated(&self) -> bool {
self.filter || self.blur != Blur::None || self.alert || self.inform
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum Blur {
#[default]
None,
Content,
Media,
}
#[derive(Debug, Clone)]
pub struct LabelCause<'a> {
pub label: LabelValue<'a>,
pub source: Did<'a>,
pub target: LabelTarget,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum LabelTarget {
Account,
Content,
}