use stateset_core::{
AccountsPayableRepository, AccountsReceivableRepository, AnalyticsRepository,
BackorderRepository, BomRepository, CartRepository, CostAccountingRepository, CreditRepository,
CurrencyRepository, CustomerRepository, FulfillmentRepository, GeneralLedgerRepository,
InventoryRepository, InvoiceRepository, LotRepository, OrderRepository, PaymentRepository,
ProductRepository, PromotionRepository, PurchaseOrderRepository, QualityRepository,
ReceivingRepository, Result, ReturnRepository, SerialRepository, ShipmentRepository,
SubscriptionRepository, TaxRepository, WarehouseRepository, WarrantyRepository,
WorkOrderRepository,
};
pub struct DatabaseBackend<DB> {
inner: DB,
}
impl<DB> DatabaseBackend<DB> {
pub fn new(db: DB) -> Self {
Self { inner: db }
}
pub fn inner(&self) -> &DB {
&self.inner
}
pub fn inner_mut(&mut self) -> &mut DB {
&mut self.inner
}
}
impl<DB> Clone for DatabaseBackend<DB>
where
DB: Clone,
{
fn clone(&self) -> Self {
Self {
inner: self.inner.clone(),
}
}
}
pub type SqliteBackend = DatabaseBackend<stateset_db::SqliteDatabase>;
pub type PostgresBackend = DatabaseBackend<stateset_db::PostgresDatabase>;
impl<DB> DatabaseBackend<DB>
where
DB: OrderRepository,
{
pub fn orders(&self) -> &DB {
&self.inner
}
}
impl<DB> DatabaseBackend<DB>
where
DB: InventoryRepository,
{
pub fn inventory(&self) -> &DB {
&self.inner
}
}
impl<DB> DatabaseBackend<DB>
where
DB: CustomerRepository,
{
pub fn customers(&self) -> &DB {
&self.inner
}
}
impl<DB> DatabaseBackend<DB>
where
DB: ProductRepository,
{
pub fn products(&self) -> &DB {
&self.inner
}
}
impl<DB> DatabaseBackend<DB>
where
DB: ReturnRepository,
{
pub fn returns(&self) -> &DB {
&self.inner
}
}
impl<DB> DatabaseBackend<DB>
where
DB: BomRepository,
{
pub fn bom(&self) -> &DB {
&self.inner
}
}
impl<DB> DatabaseBackend<DB>
where
DB: WorkOrderRepository,
{
pub fn work_orders(&self) -> &DB {
&self.inner
}
}
impl<DB> DatabaseBackend<DB>
where
DB: ShipmentRepository,
{
pub fn shipments(&self) -> &DB {
&self.inner
}
}
impl<DB> DatabaseBackend<DB>
where
DB: PaymentRepository,
{
pub fn payments(&self) -> &DB {
&self.inner
}
}
impl<DB> DatabaseBackend<DB>
where
DB: WarrantyRepository,
{
pub fn warranties(&self) -> &DB {
&self.inner
}
}
impl<DB> DatabaseBackend<DB>
where
DB: PurchaseOrderRepository,
{
pub fn purchase_orders(&self) -> &DB {
&self.inner
}
}
impl<DB> DatabaseBackend<DB>
where
DB: InvoiceRepository,
{
pub fn invoices(&self) -> &DB {
&self.inner
}
}
impl<DB> DatabaseBackend<DB>
where
DB: CartRepository,
{
pub fn carts(&self) -> &DB {
&self.inner
}
}
impl<DB> DatabaseBackend<DB>
where
DB: AnalyticsRepository,
{
pub fn analytics(&self) -> &DB {
&self.inner
}
}
impl<DB> DatabaseBackend<DB>
where
DB: CurrencyRepository,
{
pub fn currency(&self) -> &DB {
&self.inner
}
}
impl<DB> DatabaseBackend<DB>
where
DB: TaxRepository,
{
pub fn tax(&self) -> &DB {
&self.inner
}
}
impl<DB> DatabaseBackend<DB>
where
DB: PromotionRepository,
{
pub fn promotions(&self) -> &DB {
&self.inner
}
}
impl<DB> DatabaseBackend<DB>
where
DB: SubscriptionRepository,
{
pub fn subscriptions(&self) -> &DB {
&self.inner
}
}
impl<DB> DatabaseBackend<DB>
where
DB: QualityRepository,
{
pub fn quality(&self) -> &DB {
&self.inner
}
}
impl<DB> DatabaseBackend<DB>
where
DB: LotRepository,
{
pub fn lots(&self) -> &DB {
&self.inner
}
}
impl<DB> DatabaseBackend<DB>
where
DB: SerialRepository,
{
pub fn serials(&self) -> &DB {
&self.inner
}
}
impl<DB> DatabaseBackend<DB>
where
DB: WarehouseRepository,
{
pub fn warehouses(&self) -> &DB {
&self.inner
}
}
impl<DB> DatabaseBackend<DB>
where
DB: ReceivingRepository,
{
pub fn receiving(&self) -> &DB {
&self.inner
}
}
impl<DB> DatabaseBackend<DB>
where
DB: FulfillmentRepository,
{
pub fn fulfillment(&self) -> &DB {
&self.inner
}
}
impl<DB> DatabaseBackend<DB>
where
DB: AccountsPayableRepository,
{
pub fn accounts_payable(&self) -> &DB {
&self.inner
}
}
impl<DB> DatabaseBackend<DB>
where
DB: CostAccountingRepository,
{
pub fn cost_accounting(&self) -> &DB {
&self.inner
}
}
impl<DB> DatabaseBackend<DB>
where
DB: CreditRepository,
{
pub fn credits(&self) -> &DB {
&self.inner
}
}
impl<DB> DatabaseBackend<DB>
where
DB: BackorderRepository,
{
pub fn backorders(&self) -> &DB {
&self.inner
}
}
impl<DB> DatabaseBackend<DB>
where
DB: AccountsReceivableRepository,
{
pub fn accounts_receivable(&self) -> &DB {
&self.inner
}
}
impl<DB> DatabaseBackend<DB>
where
DB: GeneralLedgerRepository,
{
pub fn general_ledger(&self) -> &DB {
&self.inner
}
}
impl From<stateset_db::SqliteDatabase> for SqliteBackend {
fn from(db: stateset_db::SqliteDatabase) -> Self {
Self::new(db)
}
}
#[cfg(feature = "postgres")]
impl From<stateset_db::PostgresDatabase> for PostgresBackend {
fn from(db: stateset_db::PostgresDatabase) -> Self {
Self::new(db)
}
}
#[cfg(test)]
mod tests {
use super::*;
use stateset_db::DatabaseConfig;
#[test]
fn test_sqlite_backend_zero_cost() {
let db = stateset_db::SqliteDatabase::new(&DatabaseConfig::in_memory())
.expect("Failed to create database");
let backend = SqliteBackend::new(db);
let _ = backend.orders();
let _ = backend.customers();
let _ = backend.inventory();
}
#[test]
fn test_backend_clone() {
let db = stateset_db::SqliteDatabase::new(&DatabaseConfig::in_memory())
.expect("Failed to create database");
let backend = SqliteBackend::new(db);
let _backend2 = backend.clone();
}
#[test]
fn test_fulfillment_accessor_name() {
let db = stateset_db::SqliteDatabase::new(&DatabaseConfig::in_memory())
.expect("Failed to create database");
let backend = SqliteBackend::new(db);
let _ = backend.fulfillment();
}
#[test]
fn test_returns_and_receiving_accessors() {
let db = stateset_db::SqliteDatabase::new(&DatabaseConfig::in_memory())
.expect("Failed to create database");
let backend = SqliteBackend::new(db);
let _ = backend.returns();
let _ = backend.receiving();
}
}