use crate::encryption::{AuditEncryptionAlgorithm, AuditEncryptionKeyId};
use crate::identity::SessionDigest;
use crate::proto::{Did, Nsid};
use crate::authority::ModerationCaseId;
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub struct TargetRepresentation {
pub structural: StructuralRepresentation,
pub sensitive: Option<SensitiveRepresentation>,
}
impl TargetRepresentation {
#[must_use]
pub fn structural_only(structural: StructuralRepresentation) -> Self {
TargetRepresentation {
structural,
sensitive: None,
}
}
#[must_use]
pub fn with_sensitive(
structural: StructuralRepresentation,
sensitive: SensitiveRepresentation,
) -> Self {
TargetRepresentation {
structural,
sensitive: Some(sensitive),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub enum StructuralRepresentation {
Resource {
did: Did,
nsid: Nsid,
},
Channel {
peer: Did,
session_digest: SessionDigest,
},
Scope {
kind: ScopeKind,
},
Moderation {
target: Did,
case: ModerationCaseId,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum ScopeKind {
Shard,
GarbageCollect,
Replicate,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub struct SensitiveRepresentation {
pub encrypted_blob: Vec<u8>,
pub key_id: AuditEncryptionKeyId,
pub algorithm: AuditEncryptionAlgorithm,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn structural_representation_v1_variant_set_pinned() {
let s = StructuralRepresentation::Resource {
did: Did::new("did:plc:example").unwrap(),
nsid: Nsid::new("tools.kryphocron.feed.postPrivate").unwrap(),
};
match s {
StructuralRepresentation::Resource { .. }
| StructuralRepresentation::Channel { .. }
| StructuralRepresentation::Scope { .. }
| StructuralRepresentation::Moderation { .. } => {}
}
}
#[test]
fn target_representation_structural_only_has_no_sensitive() {
let s = StructuralRepresentation::Scope {
kind: ScopeKind::Shard,
};
let tr = TargetRepresentation::structural_only(s);
assert!(tr.sensitive.is_none());
}
}