mod db;
mod repository;
#[macro_export]
macro_rules! repository {
{
$( #[$meta:meta] )*
$vis:vis $ident:ident;
} => {
$(#[$meta])*
#[derive(Clone, Copy, Debug)]
$vis struct $ident {
/// Static Reference to the global database pool [`DB_POOL`](::sqlx_utils::pool::DB_POOL)
pool: &'static $crate::types::Pool,
}
impl ::core::ops::Deref for $ident {
type Target = $crate::types::Pool;
fn deref(&self) -> &Self::Target {
&self.pool
}
}
impl ::core::borrow::Borrow<$crate::types::Pool> for $ident {
fn borrow(&self) -> &$crate::types::Pool {
&self.pool
}
}
impl ::core::convert::AsRef<$crate::types::Pool> for $ident {
fn as_ref(&self) -> &$crate::types::Pool {
&self.pool
}
}
$crate::static_repo!($vis $ident;);
impl $ident {
#[inline(always)]
$vis fn new() -> Self {
let pool = $crate::pool::get_db_pool();
Self {
pool
}
}
}
};
{
$( #[$meta:meta] )*
$vis:vis $ident:ident<$model:ty>;
} => {
$crate::repository!(
!inner
$(#[$meta])*
$vis $ident<$model>;
);
};
{
$( #[$meta:meta] )*
$vis:vis $ident:ident<$model:ty>;
$($tokens:tt)*
} => {
$crate::repository!(!inner $(#[$meta])* $vis $ident<$model>; $($tokens)*);
};
{
!inner
$( #[$meta:meta] )*
$vis:vis $ident:ident<$model:ty>;
$($tokens:tt)*
} => {
$crate::repository!($(#[$meta])* $vis $ident;);
impl $crate::traits::Repository<$model> for $ident {
#[inline]
fn pool(&self) -> & $crate::types::Pool {
self.pool
}
$($tokens)*
}
};
{
!zst
$( #[$meta:meta] )*
$vis:vis $ident:ident;
} => {
$(#[$meta])*
#[derive(Clone, Copy, Debug)]
$vis struct $ident;
$crate::static_repo!(!zst $vis $ident;);
impl $ident {
#[inline(always)]
$vis const fn new() -> Self {
Self
}
}
};
{
!zst
$( #[$meta:meta] )*
$vis:vis $ident:ident<$model:ty>;
} => {
$crate::repository!(
!zst
!inner
$(#[$meta])*
$vis $ident<$model>;
);
};
{
!zst
$( #[$meta:meta] )*
$vis:vis $ident:ident<$model:ty>;
$($tokens:tt)*
} => {
$crate::repository!(!zst !inner $(#[$meta])* $vis $ident<$model>; $($tokens)*);
};
{
!zst !inner
$( #[$meta:meta] )*
$vis:vis $ident:ident<$model:ty>;
$($tokens:tt)*
} => {
$crate::repository!(!zst $(#[$meta])* $vis $ident;);
impl $crate::traits::Repository<$model> for $ident {
#[inline]
fn pool(&self) -> & $crate::types::Pool {
$crate::pool::get_db_pool()
}
$($tokens)*
}
};
}