Documentation
pub use sqlx::{Row as SqlxRow};
use crate::traits::ArelAble;
use std::marker::PhantomData;
use sqlx::Column;

pub struct Row<M: ArelAble> {
    pub sqlx_row: sqlx::any::AnyRow,
    _marker: PhantomData<M>,
}

impl<M> Row<M> where M: ArelAble {
    pub fn table_column_names() -> Vec<&'static str> {
        M::table_column_names()
    }
    pub fn new(sqlx_row: sqlx::any::AnyRow) -> Self {
        Self {
            sqlx_row,
            _marker: PhantomData,
        }
    }
    pub fn columns(&self) -> &[sqlx::any::AnyColumn] {
        self.sqlx_row.columns()
    }
    pub fn column_names(&self) -> Vec<&str> {
        self.columns().into_iter().map(|column| column.name()).collect()
    }
    pub fn get_column_value_i64(&self, column_name: &str) -> anyhow::Result<i64> {
        match self.sqlx_row.try_get::<i64, _>(column_name) {
            Ok(value) => Ok(value),
            Err(e) => Err(anyhow::anyhow!("{}", e.to_string()))
        }
    }
    pub fn get_column_value_bool(&self, column_name: &str) -> anyhow::Result<bool> {
        match self.sqlx_row.try_get::<bool, _>(column_name) {
            Ok(value) => Ok(value),
            Err(e) => Err(anyhow::anyhow!("{}", e.to_string()))
        }
    }
    pub fn get_column_value_string(&self, column_name: &str) -> anyhow::Result<String> {
        match self.sqlx_row.try_get::<String, _>(column_name) {
            Ok(value) => Ok(value),
            Err(e) => Err(anyhow::anyhow!("{}", e.to_string()))
        }
    }
}