#![warn(missing_docs)]
#![deny(unused_qualifications)]
use std::sync::Arc;
use manas_http::representation::impl_::binary::BinaryRepresentation;
use manas_repo::{
context::RepoContext,
service::resource_operator::common::status_token::ResourceStatusTokenTypes, Repo,
RepoRepPatcher, RepoResourceCreator, RepoResourceDeleter, RepoResourceReader,
RepoResourceState, RepoResourceStatusToken, RepoResourceStatusTokenTypes, RepoResourceUpdater,
};
use manas_space::SolidStorageSpace;
use name_locker::NameLocker;
use policy::method::MethodPolicy;
pub mod policy;
pub mod service;
pub trait SolidStorage: Send + Sync + 'static + Unpin {
type StSpace: SolidStorageSpace;
type MethodPolicy: MethodPolicy;
type Repo: Repo<StSpace = Self::StSpace, Representation = BinaryRepresentation>;
type ResourceLocker: NameLocker<Name = String>;
fn method_policy(&self) -> &Self::MethodPolicy;
fn repo(&self) -> &Self::Repo;
fn resource_locker(&self) -> &Self::ResourceLocker;
fn extensions(&self) -> &http::Extensions;
}
pub type SgStSpace<Storage> = <Storage as SolidStorage>::StSpace;
pub type SgRepo<Storage> = <Storage as SolidStorage>::Repo;
pub type SgCredentials<Storage> = <SgRepo<Storage> as Repo>::Credentials;
pub type SgResourceStatusTokenTypes<Storage> = RepoResourceStatusTokenTypes<SgRepo<Storage>>;
pub type SgResourceStatusToken<Storage> = RepoResourceStatusToken<SgRepo<Storage>>;
pub type SgResourceConflictFreeToken<Storage> =
<SgResourceStatusTokenTypes<Storage> as ResourceStatusTokenTypes>::NonExistingMutexNonExisting;
pub type SgRepoContext<Storage> = <<Storage as SolidStorage>::Repo as Repo>::Context;
pub type SgRepPatcher<Storage> = RepoRepPatcher<SgRepo<Storage>>;
pub type SgResourceState<Storage> = RepoResourceState<SgRepoContext<Storage>>;
pub type SgResourceReader<Storage> = RepoResourceReader<SgRepo<Storage>>;
pub type SgResourceCreator<Storage> = RepoResourceCreator<SgRepo<Storage>>;
pub type SgResourceDeleter<Storage> = RepoResourceDeleter<SgRepo<Storage>>;
pub type SgResourceUpdater<Storage> = RepoResourceUpdater<SgRepo<Storage>>;
mod seal {
use crate::SolidStorage;
pub trait Sealed {}
impl<S: SolidStorage> Sealed for S {}
}
pub trait SolidStorageExt: SolidStorage + seal::Sealed {
#[inline]
fn space(&self) -> &Arc<Self::StSpace> {
self.repo().context().storage_space()
}
}
impl<S: SolidStorage> SolidStorageExt for S {}