use proc_macro2::{ Ident, Span, TokenStream };
use quote::quote;
use crate::derives::{
set_getters,
set_setters,
utils::{ set_ident, type_value }
};
#[derive(Debug, Clone)]
pub enum DataTypes {
I8, I16, I32, I64,
U8, U16, U32, U64,
Vec, String, Option, DateTime, Utc
}
pub const NUMBER_TYPES: &[&str] = &[
"i8", "u8", "i16", "u16", "i32", "u32",
"i64", "u64", "i128", "u128", "isize", "usize"
];
#[derive(Debug, Clone, Default)]
pub struct TableField {
pub name: String,
pub field_type: String,
pub exist: bool,
pub _option: bool,
}
pub fn set_entitys (table_list: Vec<TableField>) -> TokenStream {
Entitys::new(table_list.clone()).set_entitys()
.build(
set_getters(table_list.clone()),
set_setters(table_list),
)
}
#[derive(Debug, Clone, Default)]
pub struct Entitys {
pub data: Vec<TableField>,
pub ts_entitys: Vec<TokenStream>,
}
impl Entitys {
pub fn new(data: Vec<TableField>) -> Self {
Entitys {
data,
ts_entitys: Vec::new(),
}
}
pub fn set_entitys(mut self) -> Self {
for field in &self.data {
if field.exist {
let name = set_ident(&field.name);
let type_value = type_value(field._option, &field.field_type);
self.ts_entitys.push(
quote! { pub #name: #type_value, }
);
}
}
self
}
pub fn build (self, ts_getters: Vec<TokenStream>, ts_setters: Vec<TokenStream>) -> TokenStream {
let ts_entitys = self.ts_entitys;
quote! {
#[derive(Debug, Clone, Default, sqlx::FromRow, serde::Deserialize, serde::Serialize)]
pub struct Entity {
#(#ts_entitys)*
}
#[automatically_derived]
impl Entity {
#(#ts_getters)*
#(#ts_setters)*
}
}
}
}