use chrono::Utc; use sqlx::postgres::PgRow; use sqlx::Column; use sqlx::Row; use sqlx::TypeInfo; use crate::error; #[derive(Debug)] pub struct Col { name: String, sql_type: String, value: Option, } #[derive(Debug)] pub enum ColType { I8(Col), String(Col), Bool(Col), I16(Col), I32(Col), I64(Col), F32(Col), F64(Col), DateTime(Col>), } impl ColType { pub fn new(row: &PgRow, idx: usize) -> error::Result { let column = row.columns().get(idx).unwrap(); let sql_type = column.type_info().name(); let name = String::from(column.name()); match sql_type { "BOOL" => { let value: Option = row.try_get(idx)?; Ok(ColType::Bool(Col { sql_type: String::from(sql_type), value, name, })) } "VARCHAR" | "char(n)" | "TEXT" | "NAME" => { let value: Option = row.try_get(idx)?; Ok(ColType::String(Col { sql_type: String::from(sql_type), value, name, })) } "CHAR" => { let value: Option = row.try_get(idx)?; Ok(ColType::I8(Col { sql_type: String::from(sql_type), value, name, })) } "SMALLSERIAL" | "SMALLINT" => { let value: Option = row.try_get(idx)?; Ok(ColType::I16(Col { sql_type: String::from(sql_type), value, name, })) } "INT" | "INT4" | "SERIAL" => { let value: Option = row.try_get(idx)?; Ok(ColType::I32(Col { sql_type: String::from(sql_type), value, name, })) } "INT8" | "BIGSERIAL" | "BIGINT" => { let value: Option = row.try_get(idx)?; Ok(ColType::I64(Col { sql_type: String::from(sql_type), value, name, })) } "FLOAT4" | "REAL" => { let value: Option = row.try_get(idx)?; Ok(ColType::F32(Col { sql_type: String::from(sql_type), value, name, })) } "FLOAT8" | "double precision" => { let value: Option = row.try_get(idx)?; Ok(ColType::F64(Col { sql_type: String::from(sql_type), value, name, })) } "TIMESTAMP" | "TIMESTAMPTZ" => { // with-chrono feature is needed for this let value: Option> = row.try_get(idx)?; Ok(ColType::DateTime(Col { sql_type: String::from(sql_type), value, name, })) } &_ => panic!("{} Type not found!", sql_type), } } }