#![cfg_attr(docsrs, feature(doc_cfg))]
mod async_group;
mod data_acc;
mod data_conn;
mod data_hub;
mod data_src;
mod non_null;
use std::collections::HashMap;
use std::sync::Arc;
use std::{any, cell, marker, ptr, thread};
pub use async_group::AsyncGroupError;
pub use data_conn::DataConnError;
pub use data_hub::DataHubError;
pub use data_src::{create_static_data_src_container, setup, setup_with_order, uses, DataSrcError};
#[cfg_attr(docsrs, doc(cfg(feature = "tokio")))]
#[cfg(feature = "tokio")]
pub mod tokio;
pub struct AsyncGroup {
handlers: Vec<(Arc<str>, thread::JoinHandle<errs::Result<()>>)>,
pub(crate) _name: Arc<str>,
}
#[allow(unused_variables)] pub trait DataConn {
fn commit(&mut self, ag: &mut AsyncGroup) -> errs::Result<()>;
fn pre_commit(&mut self, ag: &mut AsyncGroup) -> errs::Result<()> {
Ok(())
}
fn post_commit(&mut self, ag: &mut AsyncGroup) {}
fn should_force_back(&self) -> bool {
false
}
fn rollback(&mut self, ag: &mut AsyncGroup);
fn force_back(&mut self, ag: &mut AsyncGroup) {}
fn close(&mut self);
}
struct NoopDataConn {}
impl DataConn for NoopDataConn {
fn commit(&mut self, _ag: &mut AsyncGroup) -> errs::Result<()> {
Ok(())
}
fn rollback(&mut self, _ag: &mut AsyncGroup) {}
fn close(&mut self) {}
}
#[repr(C)]
struct DataConnContainer<C = NoopDataConn>
where
C: DataConn + 'static,
{
drop_fn: fn(*const DataConnContainer),
is_fn: fn(any::TypeId) -> bool,
commit_fn: fn(*const DataConnContainer, &mut AsyncGroup) -> errs::Result<()>,
pre_commit_fn: fn(*const DataConnContainer, &mut AsyncGroup) -> errs::Result<()>,
post_commit_fn: fn(*const DataConnContainer, &mut AsyncGroup),
should_force_back_fn: fn(*const DataConnContainer) -> bool,
rollback_fn: fn(*const DataConnContainer, &mut AsyncGroup),
force_back_fn: fn(*const DataConnContainer, &mut AsyncGroup),
close_fn: fn(*const DataConnContainer),
name: Arc<str>,
data_conn: Box<C>,
}
struct DataConnManager {
vec: Vec<Option<SendSyncNonNull<DataConnContainer>>>,
index_map: HashMap<Arc<str>, usize>,
}
#[allow(unused_variables)] pub trait DataSrc<C>
where
C: DataConn + 'static,
{
fn setup(&mut self, ag: &mut AsyncGroup) -> errs::Result<()>;
fn close(&mut self);
fn create_data_conn(&mut self) -> errs::Result<Box<C>>;
}
struct NoopDataSrc {}
impl DataSrc<NoopDataConn> for NoopDataSrc {
fn setup(&mut self, _ag: &mut AsyncGroup) -> errs::Result<()> {
Ok(())
}
fn close(&mut self) {}
fn create_data_conn(&mut self) -> errs::Result<Box<NoopDataConn>> {
Ok(Box::new(NoopDataConn {}))
}
}
#[repr(C)]
struct DataSrcContainer<S = NoopDataSrc, C = NoopDataConn>
where
S: DataSrc<C>,
C: DataConn + 'static,
{
drop_fn: fn(*const DataSrcContainer),
setup_fn: fn(*const DataSrcContainer, &mut AsyncGroup) -> errs::Result<()>,
close_fn: fn(*const DataSrcContainer),
create_data_conn_fn: fn(*const DataSrcContainer) -> errs::Result<Box<DataConnContainer<C>>>,
is_data_conn_fn: fn(any::TypeId) -> bool,
local: bool,
name: Arc<str>,
data_src: S,
}
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,
}
pub trait DataAcc {
fn get_data_conn<C: DataConn + 'static>(
&mut self,
name: impl AsRef<str>,
) -> errs::Result<&mut C>;
}
#[doc(hidden)]
pub struct StaticDataSrcContainer {
ssnnptr: SendSyncNonNull<DataSrcContainer>,
}
#[doc(hidden)]
pub struct StaticDataSrcRegistration {
factory: fn() -> StaticDataSrcContainer,
}
struct SendSyncNonNull<T: Send + Sync> {
non_null_ptr: ptr::NonNull<T>,
_phantom: marker::PhantomData<cell::Cell<T>>,
}