apb 0.1.0

Traits and types to handle ActivityPub objects
Documentation
pub mod page;
pub use page::CollectionPage;

use crate::{Node, Object, object::ObjectMut};

crate::strenum! {
	pub enum CollectionType {
		Collection,
		CollectionPage,
		OrderedCollection,
		OrderedCollectionPage;
	};
}

pub trait Collection : Object {
	type CollectionPage : CollectionPage;

	fn collection_type(&self) -> Option<CollectionType> { None }

	fn total_items(&self) -> Option<u64> { None }
	fn current(&self) -> Node<Self::CollectionPage> { Node::Empty }
	fn first(&self) -> Node<Self::CollectionPage> { Node::Empty }
	fn last(&self) -> Node<Self::CollectionPage> { Node::Empty }
	fn items(&self) -> Node<Self::Object> { Node::Empty }
	fn ordered_items(&self) -> Node<Self::Object> { Node::Empty }
}

pub trait CollectionMut : ObjectMut {
	type CollectionPage : CollectionPage;

	fn set_collection_type(self, val: Option<CollectionType>) -> Self;
	fn set_total_items(self, val: Option<u64>) -> Self;
	fn set_current(self, val: Node<Self::CollectionPage>) -> Self;
	fn set_first(self, val: Node<Self::CollectionPage>) -> Self;
	fn set_last(self, val: Node<Self::CollectionPage>) -> Self;
	fn set_items(self, val: Node<Self::Object>) -> Self;
	fn set_ordered_items(self, val: Node<Self::Object>) -> Self;
}

#[cfg(feature = "unstructured")]
impl Collection for serde_json::Value {
	type CollectionPage = serde_json::Value;

	crate::getter! { collection_type -> type CollectionType }
	crate::getter! { total_items::totalItems -> u64 }
	crate::getter! { current -> node Self::CollectionPage }
	crate::getter! { first -> node Self::CollectionPage }
	crate::getter! { last -> node Self::CollectionPage }
	crate::getter! { items -> node <Self as Object>::Object }
	crate::getter! { ordered_items::orderedItems -> node <Self as Object>::Object }
}

#[cfg(feature = "unstructured")]
impl CollectionMut for serde_json::Value {
	type CollectionPage = serde_json::Value;

	crate::setter! { collection_type -> type CollectionType }
	crate::setter! { total_items::totalItems -> u64 }
	crate::setter! { current -> node Self::CollectionPage }
	crate::setter! { first -> node Self::CollectionPage }
	crate::setter! { last -> node Self::CollectionPage }
	crate::setter! { items -> node <Self as Object>::Object }
	crate::setter! { ordered_items::orderedItems -> node <Self as Object>::Object }
}