use rorm_db::row::DecodeOwned;
#[cfg(doc)]
use crate::fields::proxy::FieldProxy;
use crate::fields::traits::{Array, FieldType};
pub trait FieldCount: FieldType {}
impl<T> FieldCount for T where T: FieldType<Columns = Array<1>> {}
pub trait FieldSum: FieldType<Columns = Array<1>> {
type Result: DecodeOwned;
}
pub trait FieldAvg: FieldType<Columns = Array<1>> {}
pub trait FieldMax: FieldType<Columns = Array<1>> {
type Result: DecodeOwned;
}
pub trait FieldMin: FieldType<Columns = Array<1>> {
type Result: DecodeOwned;
}
#[allow(non_snake_case)]
#[macro_export]
macro_rules! impl_FieldSum_FieldAvg {
($arg:ty, sum_result: $ret:ty) => {
impl $crate::fields::traits::FieldSum for $arg {
type Result = Option<$ret>;
}
impl $crate::fields::traits::FieldSum for Option<$arg> {
type Result = Option<$ret>;
}
impl $crate::fields::traits::FieldAvg for $arg {}
impl $crate::fields::traits::FieldAvg for Option<$arg> {}
};
}
#[allow(non_snake_case)]
#[macro_export]
macro_rules! impl_FieldMin_FieldMax {
(impl<$($generic:ident $( $const_name:ident : $const_type:ty )?),*> $arg:ty) => {
$crate::impl_FieldMin_FieldMax!(@internal [<$($generic $( $const_name : $const_type )?),*>] $arg);
};
($arg:ty) => {
$crate::impl_FieldMin_FieldMax!(@internal [] $arg);
};
(@internal [$($generic:tt)*] $arg:ty) => {
impl $($generic)* $crate::fields::traits::FieldMin for $arg
where
$arg: $crate::fields::traits::FieldType,
Option<$arg>: $crate::db::row::DecodeOwned,
{
type Result = Option<$arg>;
}
impl $($generic)* $crate::fields::traits::FieldMin for Option<$arg>
where
Option<$arg>: $crate::fields::traits::FieldType,
Option<$arg>: $crate::db::row::DecodeOwned,
{
type Result = Option<$arg>;
}
impl $($generic)* $crate::fields::traits::FieldMax for $arg
where
$arg: $crate::fields::traits::FieldType,
Option<$arg>: $crate::db::row::DecodeOwned,
{
type Result = Option<$arg>;
}
impl $($generic)* $crate::fields::traits::FieldMax for Option<$arg>
where
Option<$arg>: $crate::fields::traits::FieldType,
Option<$arg>: $crate::db::row::DecodeOwned,
{
type Result = Option<$arg>;
}
};
}