mydb 0.0.1

This is a plugin that works with mydb_sqlx to make database operation easier
Documentation
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)*
      }
    }
  }
}