use crate::Row;
pub trait Scan<Table> {
fn scan(self) -> crate::Result<Table>;
}
#[macro_export]
macro_rules! impl_scan {
($row_type:path,$table:path{$($field_name:ident: $field_value:expr$(,)?)+}) => {
impl $crate::scan::Scan<$table> for $row_type{
fn scan(self) -> $crate::Result<$table> {
let mut table = {
$table {
$(
$field_name:$field_value,
)+
}
};
use $crate::Row;
use $crate::column::Column;
use $crate::value::ValueRef;
for _column in self.columns(){
$(
if stringify!($field_name).trim_start_matches("r#").eq(_column.name()){
let r = self.try_get_raw(_column.name())?;
table.$field_name = r.decode()?;
}
)+
}
$crate::Result::Ok(table)
}
}
};
}
impl<R: Row + Scan<T>, T> Scan<Vec<T>> for Vec<R> {
fn scan(self) -> crate::Result<Vec<T>> {
let mut result_datas = Vec::with_capacity(self.len());
for r in self {
let table = Scan::<T>::scan(r)?;
result_datas.push(table);
}
Ok(result_datas)
}
}
impl<R: Row + Scan<T>, T> Scan<T> for crate::Result<R> {
fn scan(self) -> crate::Result<T> {
match self {
Ok(v) => {
Ok(v.scan()?)
}
Err(e) => {
Err(e)
}
}
}
}
impl<R: Row + Scan<T>, T> Scan<Vec<T>> for crate::Result<Vec<R>> {
fn scan(self) -> crate::Result<Vec<T>> {
let c = self?;
let mut result_datas = Vec::with_capacity(c.len());
for r in c {
let table = Scan::<T>::scan(r)?;
result_datas.push(table);
}
Ok(result_datas)
}
}
#[macro_export]
macro_rules! row_scan {
($row:expr,$table:path{$($field_name:ident: $field_value:expr$(,)?)+}) => {
{
let mut table = {
$table {
$(
$field_name:$field_value,
)+
}
};
use $crate::Row;
use $crate::column::Column;
use $crate::value::ValueRef;
for _column in $row.columns(){
$(
if stringify!($field_name).trim_start_matches("r#").eq(_column.name()){
let v = $row.try_get_raw(_column.name())?;
table.$field_name = v.decode()?;
}
)+
}
$crate::Result::Ok(table)
}
}
}
#[macro_export]
macro_rules! row_scans {
($rows:expr,$table:path{$($field_name:ident: $field_value:expr$(,)?)+}) => {
{
let mut result_datas = vec![];
for r in $rows{
let table = $crate::row_scan!(r, $table { $($field_name:$field_value,)+})?;
result_datas.push(table);
}
$crate::Result::Ok(result_datas)
}
}
}