use jacquard_api::com_atproto::label::{Label, SelfLabels};
use jacquard_common::bos::{BosStr, DefaultStr};
pub trait Labeled<S: BosStr = DefaultStr> {
fn labels(&self) -> &[Label<S>];
fn self_labels(&self) -> Option<SelfLabels<S>> {
None
}
}
pub struct LabeledRecord<S: BosStr = DefaultStr, C = ()> {
pub record: C,
pub labels: Vec<Label<S>>,
}
impl<S: BosStr, C> Labeled<S> for LabeledRecord<S, C> {
fn labels(&self) -> &[Label<S>] {
&self.labels
}
}
#[cfg(feature = "api_bluesky")]
mod bluesky_impls {
use super::*;
use jacquard_api::app_bsky::{
actor::{ProfileView, ProfileViewBasic, ProfileViewDetailed, profile::Profile},
feed::{PostView, generator::Generator, post::Post},
graph::{ListView, list::List},
labeler::service::Service,
notification::list_notifications::Notification,
};
use jacquard_common::from_data;
impl<S: BosStr> Labeled<S> for PostView<S>
where
S: for<'de> serde::Deserialize<'de> + for<'de> core::convert::From<&'de str>,
{
fn labels(&self) -> &[Label<S>] {
self.labels.as_deref().unwrap_or(&[])
}
fn self_labels(&self) -> Option<SelfLabels<S>> {
let post = from_data::<Post<S>, S>(&self.record).ok()?;
post.labels
}
}
impl<S: BosStr> Labeled<S> for ProfileView<S> {
fn labels(&self) -> &[Label<S>] {
self.labels.as_deref().unwrap_or(&[])
}
}
impl<S: BosStr> Labeled<S> for ProfileViewBasic<S> {
fn labels(&self) -> &[Label<S>] {
self.labels.as_deref().unwrap_or(&[])
}
}
impl<S: BosStr> Labeled<S> for ProfileViewDetailed<S> {
fn labels(&self) -> &[Label<S>] {
self.labels.as_deref().unwrap_or(&[])
}
}
impl<S: BosStr + Clone> Labeled<S> for Post<S> {
fn labels(&self) -> &[Label<S>] {
&[]
}
fn self_labels(&self) -> Option<SelfLabels<S>> {
self.labels.clone()
}
}
impl<S: BosStr + Clone> Labeled<S> for Profile<S> {
fn labels(&self) -> &[Label<S>] {
&[]
}
fn self_labels(&self) -> Option<SelfLabels<S>> {
self.labels.clone()
}
}
impl<S: BosStr + Clone> Labeled<S> for Generator<S> {
fn labels(&self) -> &[Label<S>] {
&[]
}
fn self_labels(&self) -> Option<SelfLabels<S>> {
self.labels.clone()
}
}
impl<S: BosStr + Clone> Labeled<S> for List<S> {
fn labels(&self) -> &[Label<S>] {
&[]
}
fn self_labels(&self) -> Option<SelfLabels<S>> {
self.labels.clone()
}
}
impl<S: BosStr + Clone> Labeled<S> for Service<S> {
fn labels(&self) -> &[Label<S>] {
&[]
}
fn self_labels(&self) -> Option<SelfLabels<S>> {
self.labels.clone()
}
}
impl<S: BosStr> Labeled<S> for ListView<S> {
fn labels(&self) -> &[Label<S>] {
self.labels.as_deref().unwrap_or(&[])
}
}
impl<S: BosStr> Labeled<S> for Notification<S> {
fn labels(&self) -> &[Label<S>] {
self.labels.as_deref().unwrap_or(&[])
}
}
}
#[cfg(feature = "api_full")]
mod full_impls {
}
#[cfg(feature = "api_all")]
mod anisota_impls {
use super::*;
use jacquard_api::net_anisota::feed::{draft::Draft, post::Post};
impl<S: BosStr + Clone> Labeled<S> for Post<S> {
fn labels(&self) -> &[Label<S>] {
&[]
}
fn self_labels(&self) -> Option<SelfLabels<S>> {
self.labels.clone()
}
}
impl<S: BosStr + Clone> Labeled<S> for Draft<S> {
fn labels(&self) -> &[Label<S>] {
&[]
}
fn self_labels(&self) -> Option<SelfLabels<S>> {
self.labels.clone()
}
}
}
#[cfg(feature = "api_all")]
mod social_grain_impls {
use super::*;
use jacquard_api::social_grain::{
actor::ProfileView,
gallery::{Gallery, GalleryView},
};
impl<S: BosStr> Labeled<S> for ProfileView<S> {
fn labels(&self) -> &[Label<S>] {
self.labels.as_deref().unwrap_or(&[])
}
}
impl<S: BosStr> Labeled<S> for GalleryView<S> {
fn labels(&self) -> &[Label<S>] {
self.labels.as_deref().unwrap_or(&[])
}
}
impl<S: BosStr + Clone> Labeled<S> for Gallery<S> {
fn labels(&self) -> &[Label<S>] {
&[]
}
fn self_labels(&self) -> Option<SelfLabels<S>> {
self.labels.clone()
}
}
}