apb 0.1.0

Traits and types to handle ActivityPub objects
Documentation
pub mod accept;
pub mod ignore;
pub mod intransitive;
pub mod offer;
pub mod reject;

use crate::{Node, object::{Object, ObjectMut}};
use accept::AcceptType;
use reject::RejectType;
use offer::OfferType;
use intransitive::IntransitiveActivityType;
use ignore::IgnoreType;

crate::strenum! {
	pub enum ActivityType {
		Activity,
		Add,
		Announce,
		Create,
		Delete,
		Dislike,
		Flag,
		Follow,
		Join,
		Leave,
		Like,
		Listen,
		Move,
		Read,
		Remove,
		Undo,
		Update,
		View;

		IntransitiveActivity(IntransitiveActivityType),
		Accept(AcceptType),
		Ignore(IgnoreType),
		Offer(OfferType),
		Reject(RejectType)
	};
}

pub trait Activity : Object {
	fn activity_type(&self) -> Option<ActivityType> { None }
	fn actor(&self) -> Node<Self::Actor> { Node::Empty }
	fn object(&self) -> Node<Self::Object> { Node::Empty }
	fn target(&self) -> Node<Self::Object> { Node::Empty }
	fn result(&self) -> Node<Self::Object> { Node::Empty }
	fn origin(&self) -> Node<Self::Object> { Node::Empty }
	fn instrument(&self) -> Node<Self::Object> { Node::Empty }
}

pub trait ActivityMut : ObjectMut {
	fn set_activity_type(self, val: Option<ActivityType>) -> Self;
	fn set_actor(self, val: Node<Self::Actor>) -> Self;
	fn set_object(self, val: Node<Self::Object>) -> Self;
	fn set_target(self, val: Node<Self::Object>) -> Self;
	fn set_result(self, val: Node<Self::Object>) -> Self;
	fn set_origin(self, val: Node<Self::Object>) -> Self;
	fn set_instrument(self, val: Node<Self::Object>) -> Self;
}

#[cfg(feature = "unstructured")]
impl Activity for serde_json::Value {
	crate::getter! { activity_type -> type ActivityType }
	crate::getter! { actor -> node Self::Actor }
	crate::getter! { object -> node <Self as Object>::Object }
	crate::getter! { target -> node <Self as Object>::Object }
	crate::getter! { result -> node <Self as Object>::Object }
	crate::getter! { origin -> node <Self as Object>::Object }
	crate::getter! { instrument -> node <Self as Object>::Object }
}

#[cfg(feature = "unstructured")]
impl ActivityMut for serde_json::Value {
	crate::setter! { activity_type -> type ActivityType }
	crate::setter! { actor -> node Self::Actor }
	crate::setter! { object -> node <Self as Object>::Object }
	crate::setter! { target -> node <Self as Object>::Object }
	crate::setter! { result -> node <Self as Object>::Object }
	crate::setter! { origin -> node <Self as Object>::Object }
	crate::setter! { instrument -> node <Self as Object>::Object }
}