use std::time::{Duration, SystemTime};
use crate::proto::Did;
use crate::authority::ResourceId;
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum BlockState {
None,
OneWay {
blocker: Did,
blocked: Did,
},
Mutual,
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum AudienceState {
InAudience,
NotInAudience,
NoAudienceConfigured,
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum MuteState {
None,
Muted,
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum BlockOracleQuery {
RequesterVsResourceOwner,
RequesterVsThreadRootOwner,
RequesterVsParentPostOwner,
RequesterVsAudienceMember,
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum AudienceOracleQuery {
RequesterAgainstResourceAudience,
RequesterAgainstParentResourceAudience,
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum MuteOracleQuery {
RequesterMutedTarget,
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum OracleKind {
Block,
Audience,
Mute,
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum OracleQueryKind {
Block(BlockOracleQuery),
Audience(AudienceOracleQuery),
Mute(MuteOracleQuery),
}
pub trait BlockOracle: Send + Sync {
fn block_state(&self, a: &Did, b: &Did) -> BlockState;
fn last_synced_at(&self) -> SystemTime;
fn data_freshness_bound(&self) -> Duration;
fn worst_case_latency_for(&self, query: BlockOracleQuery) -> Duration;
}
pub trait AudienceOracle: Send + Sync {
fn audience_state(&self, viewer: &Did, resource: &ResourceId) -> AudienceState;
fn last_synced_at(&self) -> SystemTime;
fn data_freshness_bound(&self) -> Duration;
fn worst_case_latency_for(&self, query: AudienceOracleQuery) -> Duration;
}
pub trait MuteOracle: Send + Sync {
fn mute_state(&self, viewer: &Did, target: &Did) -> MuteState;
fn last_synced_at(&self) -> SystemTime;
fn data_freshness_bound(&self) -> Duration;
fn worst_case_latency_for(&self, query: MuteOracleQuery) -> Duration;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn oracle_kind_variants_complete() {
for &k in &[OracleKind::Block, OracleKind::Audience, OracleKind::Mute] {
match k {
OracleKind::Block | OracleKind::Audience | OracleKind::Mute => {}
}
}
}
#[test]
fn mute_oracle_query_has_single_v1_variant() {
let q = MuteOracleQuery::RequesterMutedTarget;
assert!(matches!(q, MuteOracleQuery::RequesterMutedTarget));
}
}