use std::{collections::HashMap, hash::BuildHasher};
use cruet::string::pluralize;
use heck::{ToKebabCase, ToLowerCamelCase, ToSnakeCase, ToTitleCase, ToUpperCamelCase};
use tera::{to_value, try_get_value, Result, Tera, Value};
pub fn register_all(tera: &mut Tera) {
tera.register_filter("pascal_case", pascal_case);
tera.register_filter("camel_case", camel_case);
tera.register_filter("kebab_case", kebab_case);
tera.register_filter("lower_case", lower_case);
tera.register_filter("snake_case", snake_case);
tera.register_filter("title_case", title_case);
tera.register_filter("upper_case", upper_case);
tera.register_filter("plural", plural);
}
pub fn plural<S: BuildHasher>(value: &Value, _: &HashMap<String, Value, S>) -> Result<Value> {
let s = try_get_value!("pluralize", "value", String, value);
Ok(to_value(pluralize::to_plural(&s)).unwrap())
}
pub fn pascal_case<S: BuildHasher>(value: &Value, _: &HashMap<String, Value, S>) -> Result<Value> {
let s = try_get_value!("camel_case", "value", String, value);
Ok(to_value(s.to_upper_camel_case()).unwrap())
}
pub fn camel_case<S: BuildHasher>(value: &Value, _: &HashMap<String, Value, S>) -> Result<Value> {
let s = try_get_value!("camel_case", "value", String, value);
Ok(to_value(s.to_lower_camel_case()).unwrap())
}
pub fn kebab_case<S: BuildHasher>(value: &Value, _: &HashMap<String, Value, S>) -> Result<Value> {
let s = try_get_value!("kebab_case", "value", String, value);
Ok(to_value(s.to_kebab_case()).unwrap())
}
pub fn lower_case<S: BuildHasher>(value: &Value, _: &HashMap<String, Value, S>) -> Result<Value> {
let s = try_get_value!("lower_case", "value", String, value);
Ok(to_value(s.to_lowercase()).unwrap())
}
pub fn snake_case<S: BuildHasher>(value: &Value, _: &HashMap<String, Value, S>) -> Result<Value> {
let s = try_get_value!("snake_case", "value", String, value);
Ok(to_value(s.to_snake_case()).unwrap())
}
pub fn title_case<S: BuildHasher>(value: &Value, _: &HashMap<String, Value, S>) -> Result<Value> {
let s = try_get_value!("title_case", "value", String, value);
Ok(to_value(s.to_title_case()).unwrap())
}
pub fn upper_case<S: BuildHasher>(value: &Value, _: &HashMap<String, Value, S>) -> Result<Value> {
let s = try_get_value!("upper_case", "value", String, value);
Ok(to_value(s.to_uppercase()).unwrap())
}