mod async_group;
mod data_acc;
mod data_conn;
mod data_hub;
mod data_src;
use crate::SendSyncNonNull;
use std::any;
use std::collections::HashMap;
use std::future::Future;
use std::pin::Pin;
use std::sync::Arc;
pub use data_conn::DataConnError;
pub use data_hub::DataHubError;
pub use data_src::{
create_static_data_src_container, setup_async, setup_with_order_async, uses, uses_async,
DataSrcError,
};
#[doc(inline)]
pub use crate::_logic as logic;
#[doc(inline)]
pub use crate::_uses_for_async as uses;
#[allow(clippy::type_complexity)]
pub struct AsyncGroup {
names: Vec<Arc<str>>,
tasks: Vec<Pin<Box<dyn Future<Output = errs::Result<()>> + Send + 'static>>>,
pub(crate) _name: Arc<str>,
}
#[allow(async_fn_in_trait)]
#[allow(unused_variables)] pub trait DataConn {
async fn commit_async(&mut self, ag: &mut AsyncGroup) -> errs::Result<()>;
async fn pre_commit_async(&mut self, ag: &mut AsyncGroup) -> errs::Result<()> {
Ok(())
}
async fn post_commit_async(&mut self, ag: &mut AsyncGroup) {}
fn should_force_back(&self) -> bool {
false
}
async fn rollback_async(&mut self, ag: &mut AsyncGroup);
async fn force_back_async(&mut self, ag: &mut AsyncGroup) {}
fn close(&mut self);
}
pub(crate) struct NoopDataConn {}
impl DataConn for NoopDataConn {
async fn commit_async(&mut self, _ag: &mut AsyncGroup) -> errs::Result<()> {
Ok(())
}
async fn rollback_async(&mut self, _ag: &mut AsyncGroup) {}
fn close(&mut self) {}
}
#[allow(clippy::type_complexity)]
#[repr(C)]
pub(crate) struct DataConnContainer<C = NoopDataConn>
where
C: DataConn + 'static,
{
drop_fn: fn(*const DataConnContainer),
is_fn: fn(any::TypeId) -> bool,
commit_fn: for<'ag> fn(
*const DataConnContainer,
&'ag mut AsyncGroup,
) -> Pin<Box<dyn Future<Output = errs::Result<()>> + 'ag>>,
pre_commit_fn: for<'ag> fn(
*const DataConnContainer,
&'ag mut AsyncGroup,
) -> Pin<Box<dyn Future<Output = errs::Result<()>> + 'ag>>,
post_commit_fn: for<'ag> fn(
*const DataConnContainer,
&'ag mut AsyncGroup,
) -> Pin<Box<dyn Future<Output = ()> + 'ag>>,
should_force_back_fn: fn(*const DataConnContainer) -> bool,
rollback_fn: for<'ag> fn(
*const DataConnContainer,
&'ag mut AsyncGroup,
) -> Pin<Box<dyn Future<Output = ()> + 'ag>>,
force_back_fn: for<'ag> fn(
*const DataConnContainer,
&'ag mut AsyncGroup,
) -> Pin<Box<dyn Future<Output = ()> + 'ag>>,
close_fn: fn(*const DataConnContainer),
name: Arc<str>,
data_conn: Box<C>,
}
pub(crate) struct DataConnManager {
vec: Vec<Option<SendSyncNonNull<DataConnContainer>>>,
index_map: HashMap<Arc<str>, usize>,
}
#[trait_variant::make(Send)]
#[allow(async_fn_in_trait)]
#[allow(unused_variables)] pub trait DataSrc<C>
where
C: DataConn + 'static,
{
async fn setup_async(&mut self, ag: &mut AsyncGroup) -> errs::Result<()>;
fn close(&mut self);
async fn create_data_conn_async(&mut self) -> errs::Result<Box<C>>;
}
pub(crate) struct NoopDataSrc {}
impl DataSrc<NoopDataConn> for NoopDataSrc {
async fn setup_async(&mut self, _ag: &mut AsyncGroup) -> errs::Result<()> {
Ok(())
}
fn close(&mut self) {}
async fn create_data_conn_async(&mut self) -> errs::Result<Box<NoopDataConn>> {
Ok(Box::new(NoopDataConn {}))
}
}
#[allow(clippy::type_complexity)]
#[repr(C)]
pub(crate) struct DataSrcContainer<S = NoopDataSrc, C = NoopDataConn>
where
S: DataSrc<C>,
C: DataConn + 'static,
{
drop_fn: fn(*const DataSrcContainer),
close_fn: fn(*const DataSrcContainer),
is_data_conn_fn: fn(any::TypeId) -> bool,
setup_fn: for<'ag> fn(
*const DataSrcContainer,
&'ag mut AsyncGroup,
) -> Pin<Box<dyn Future<Output = errs::Result<()>> + Send + 'ag>>,
create_data_conn_fn: fn(
*const DataSrcContainer,
) -> Pin<
Box<dyn Future<Output = errs::Result<Box<DataConnContainer<C>>>> + Send + 'static>,
>,
local: bool,
name: Arc<str>,
data_src: S,
}
pub(crate) struct DataSrcManager {
vec_unready: Vec<SendSyncNonNull<DataSrcContainer>>,
vec_ready: Vec<SendSyncNonNull<DataSrcContainer>>,
local: bool,
}
pub struct AutoShutdown {}
pub struct DataHub {
local_data_src_manager: DataSrcManager,
data_src_map: HashMap<Arc<str>, (bool, usize)>,
data_conn_manager: DataConnManager,
fixed: bool,
}
#[allow(async_fn_in_trait)]
pub trait DataAcc {
async fn get_data_conn_async<C: DataConn + 'static>(
&mut self,
name: impl AsRef<str>,
) -> errs::Result<&mut C>;
}
#[doc(hidden)]
pub struct StaticDataSrcContainer {
pub(crate) ssnnptr: SendSyncNonNull<DataSrcContainer>,
}
#[doc(hidden)]
pub struct StaticDataSrcRegistration {
pub(crate) factory: fn() -> StaticDataSrcContainer,
}