use std::any::type_name;
use inflector::{string::{demodulize, pluralize}, cases::snakecase};
use regex::Regex;
use crate::traits::ArelAble;
pub fn type_to_pluralize_string<M>() -> String where M: ?Sized {
let full_namespace = type_name::<M>();
let struct_name = demodulize::demodulize(&full_namespace);
let snake_struct_name = snakecase::to_snake_case(&struct_name);
pluralize::to_plural(Regex::new(r"_arel$").unwrap().replace(&snake_struct_name, "").as_ref())
}
pub fn table_column_name<M: ArelAble>(column_name: &str) -> String {
if column_name == "*" {
format!("`{}`.{}", M::table_name(), column_name)
} else if Regex::new(r"\.").unwrap().is_match(column_name) {
format!("{}", column_name)
} else {
format!("`{}`.`{}`", M::table_name(), column_name)
}
}
pub fn quote_table_name(table_name: &str) -> String {
format!("`{}`", table_name)
}