use std::{
future::{Future, IntoFuture},
pin::Pin,
};
use crate::{
constants::outlet, taxonomy::*, CallError, Entity, Session, SessionAsync, SessionTrait,
String255, Token, Value,
};
use crate::session::api::macros::*;
decl_call!(
CreateRegistry(name: String255, authorization: Token) -> Entity,
{
key: String255,
mode: Mode,
outlet: Entity,
server: Entity,
}
);
impl<T: SessionTrait> CreateRegistry<T> {
async fn call_async(self) -> Result<Entity, CallError> {
let res = self
.session
.get_async_session()
.invoke_entity(outlet::REGISTRIES, Method::Create, self.authorization)
.with_name(self.name)
.with_key(self.key)
.with_mode(self.mode)
.with_ancillary(self.server)
.await?;
Ok(res.entity()?)
}
}
decl_call!(
DeleteRegistry(registry: Entity, authorization: Token) -> (),
{
}
);
impl<T: SessionTrait> DeleteRegistry<T> {
async fn call_async(self) -> Result<(), CallError> {
self.session
.get_async_session()
.invoke_entity(outlet::REGISTRIES, Method::Delete, self.authorization)
.with_ancillary(self.registry)
.await?;
Ok(())
}
}
decl_call!(
RegisterEntity(registry: Entity, key: String255, name: String255, entity: Entity, authorization: Token) -> (),
{
deferred: bool,
}
);
impl<T: SessionTrait> RegisterEntity<T> {
async fn call_async(self) -> Result<(), CallError> {
self.session
.get_async_session()
.include_property(
self.registry,
self.key,
self.name,
Value::Entity(self.entity),
self.authorization,
)
.with_deferred(self.deferred)
.await
}
}
decl_call!(
DeregisterEntity(registry: Entity, key: String255, authorization: Token) -> (),
{
}
);
impl<T: SessionTrait> DeregisterEntity<T> {
async fn call_async(self) -> Result<(), CallError> {
self.session
.get_async_session()
.exclude_property(self.registry, self.key, self.authorization)
.await
}
}
decl_call!(
PurgeRegistry(registry: Entity, authorization: Token) -> (),
{
}
);
impl<T: SessionTrait> PurgeRegistry<T> {
async fn call_async(self) -> Result<(), CallError> {
self.session
.get_async_session()
.purge_properties(self.registry, self.authorization)
.await
}
}
decl_call!(
SortRegistry(registry: Entity, authorization: Token) -> (),
{
}
);
impl<T: SessionTrait> SortRegistry<T> {
async fn call_async(self) -> Result<(), CallError> {
self.session
.get_async_session()
.sort_properties(self.registry, self.authorization)
.await
}
}
decl_call!(
LookupRegistry(registry: Entity, key: String255, authorization: Token) -> Entity,
{
}
);
impl<T: SessionTrait> LookupRegistry<T> {
async fn call_async(self) -> Result<Entity, CallError> {
let res = self
.session
.get_async_session()
.property_value(self.registry, self.key, self.authorization)
.await?;
Ok(res.entity()?)
}
}
decl_call!(
RegistryMember(registry: Entity, key: String255, authorization: Token) -> Option<Entity>,
{
}
);
impl<T: SessionTrait> RegistryMember<T> {
async fn call_async(self) -> Result<Option<Entity>, CallError> {
let s = self.session.get_async_session();
if s.property_member(self.registry, self.key.clone(), self.authorization)
.await?
{
Ok(Some(
s.lookup_registry(self.registry, self.key, self.authorization)
.await?,
))
} else {
Ok(None)
}
}
}
decl_call!(
RegistryItem(registry: Entity, index: i64, authorization: Token) -> Entity,
{
}
);
impl<T: SessionTrait> RegistryItem<T> {
async fn call_async(self) -> Result<Entity, CallError> {
let res = self
.session
.get_async_session()
.property_value(self.registry, String255::NULL, self.authorization)
.with_index(self.index)
.await?;
Ok(res.entity()?)
}
}
decl_call!(
RegistryCount(registry: Entity, authorization: Token) -> i64,
{
}
);
impl<T: SessionTrait> RegistryCount<T> {
async fn call_async(self) -> Result<i64, CallError> {
self.session
.get_async_session()
.property_count(self.registry, self.authorization)
.await
}
}
decl_call!(
RetrieveRegistry(registry: Entity, authorization: Token) -> String,
{
}
);
impl<T: SessionTrait> RetrieveRegistry<T> {
async fn call_async(self) -> Result<String, CallError> {
let res = self
.session
.get_async_session()
.invoke_entity(self.registry, Method::Retrieve, self.authorization)
.with_aspect(Aspect::Property)
.await?;
Ok(res.interchange()?)
}
}