use crate::Node;
use super::{Object, ObjectMut, super::key::PublicKey};
crate::strenum! {
pub enum ActorType {
Application,
Group,
Organization,
Person;
};
}
pub trait Actor : Object {
type PublicKey : PublicKey;
fn actor_type(&self) -> Option<ActorType> { None }
fn preferred_username(&self) -> Option<&str> { None }
fn inbox(&self) -> Node<Self::Collection>;
fn outbox(&self) -> Node<Self::Collection>;
fn following(&self) -> Node<Self::Collection> { Node::Empty }
fn followers(&self) -> Node<Self::Collection> { Node::Empty }
fn liked(&self) -> Node<Self::Collection> { Node::Empty }
fn streams(&self) -> Node<Self::Collection> { Node::Empty }
fn endpoints(&self) -> Node<Self::Object> { Node::Empty }
fn public_key(&self) -> Node<Self::PublicKey> { Node::Empty }
fn discoverable(&self) -> Option<bool> { None }
}
pub trait ActorMut : ObjectMut {
type PublicKey : PublicKey;
fn set_actor_type(self, val: Option<ActorType>) -> Self;
fn set_preferred_username(self, val: Option<&str>) -> Self;
fn set_inbox(self, val: Node<Self::Collection>) -> Self;
fn set_outbox(self, val: Node<Self::Collection>) -> Self;
fn set_following(self, val: Node<Self::Collection>) -> Self;
fn set_followers(self, val: Node<Self::Collection>) -> Self;
fn set_liked(self, val: Node<Self::Collection>) -> Self;
fn set_streams(self, val: Node<Self::Collection>) -> Self;
fn set_endpoints(self, val: Node<Self::Object>) -> Self; fn set_public_key(self, val: Node<Self::PublicKey>) -> Self;
fn set_discoverable(self, val: Option<bool>) -> Self;
}
#[cfg(feature = "unstructured")]
impl Actor for serde_json::Value {
type PublicKey = serde_json::Value;
crate::getter! { actor_type -> type ActorType }
crate::getter! { preferred_username::preferredUsername -> &str }
crate::getter! { inbox -> node Self::Collection }
crate::getter! { outbox -> node Self::Collection }
crate::getter! { following -> node Self::Collection }
crate::getter! { followers -> node Self::Collection }
crate::getter! { liked -> node Self::Collection }
crate::getter! { streams -> node Self::Collection }
crate::getter! { public_key::publicKey -> node Self::PublicKey }
crate::getter! { discoverable -> bool }
fn endpoints(&self) -> Node<<Self as Object>::Object> {
todo!()
}
}
#[cfg(feature = "unstructured")]
impl ActorMut for serde_json::Value {
type PublicKey = serde_json::Value;
crate::setter! { actor_type -> type ActorType }
crate::setter! { preferred_username::preferredUsername -> &str }
crate::setter! { inbox -> node Self::Collection }
crate::setter! { outbox -> node Self::Collection }
crate::setter! { following -> node Self::Collection }
crate::setter! { followers -> node Self::Collection }
crate::setter! { liked -> node Self::Collection }
crate::setter! { streams -> node Self::Collection }
crate::setter! { public_key::publicKey -> node Self::PublicKey }
crate::setter! { discoverable -> bool }
fn set_endpoints(mut self, _val: Node<<Self as Object>::Object>) -> Self {
self.as_object_mut().unwrap().insert("endpoints".to_string(), serde_json::Value::Object(serde_json::Map::default()));
self
}
}