This commit is contained in:
2023-12-02 00:59:31 +01:00
parent b72de5b254
commit a5e0857285
7 changed files with 87 additions and 148 deletions

View File

@@ -1,8 +1,9 @@
use nanobyte_tera::{hosts::static_filter, l18n::translate_filter, date::{calculate_age, get_year}, string::insert_space_every, gravatar::gravatar_link};
use ovlach_tera::entity::lang_entity;
use rocket::{*, fairing::AdHoc};
use rocket_dyn_templates::Template;
use ::serde::Deserialize;
use tools::tera::{static_filter, translate_filter, calculate_age, insert_space_every, lang_entity, gravatar_link, format_date};
pub mod routes;
pub mod services;
@@ -36,7 +37,8 @@ pub fn rocket_builder() -> Rocket<Build> {
engines.tera.register_filter("gravatar_link", gravatar_link);
// filters specific to API
engines.tera.register_filter("lang_entity", lang_entity);
engines.tera.register_filter("format_date", format_date);
engines.tera.register_filter("format_date", get_year); // deprecated
engines.tera.register_filter("get_year", get_year);
Ok(())
})
).attach(

View File

@@ -1,3 +1,2 @@
pub mod tera;
pub mod rocket;
pub mod lang;

View File

@@ -1,143 +0,0 @@
use std::{collections::HashMap, str::FromStr};
use chrono::{Utc, Datelike, NaiveDate};
use log::{error, debug};
use rocket_dyn_templates::tera::{Value, Error};
use ovlach_data::cv::chrono::from_string;
use sha256::digest;
use fluent_resmgr::resource_manager::ResourceManager;
use unic_langid::LanguageIdentifier;
use crate::tools::lang::get_lang_name_from_code;
// TODO: tenhle modul je trochu prasacky..
pub fn static_filter(
value: &Value,
args: &HashMap<String, rocket_dyn_templates::tera::Value>
) -> Result<Value, Error> {
let host = args.get("static_host");
return Ok(rocket_dyn_templates::tera::Value::String(format!("{}/{}", host.unwrap().as_str().unwrap(), value.as_str().unwrap()))); // TODO: fix-me here!
}
pub fn translate_filter(
value: &Value,
args: &HashMap<String, rocket_dyn_templates::tera::Value>
) -> Result<Value, Error> {
// TODO: prepis me!
let mgr = ResourceManager::new("./resources/{locale}/{res_id}".into());
let lang = args["lang"].as_str().unwrap();
let locales = vec![LanguageIdentifier::from_str(lang).unwrap()];
let val = value.as_str().unwrap().to_string();
let bundle = mgr.get_bundle(locales, vec!["ovlach_frontend".to_string()]);
let mut errors = vec![];
match bundle.get_message(&val) {
Some(msg) => {
match msg.value() {
Some(pattern) => {
let output = bundle.format_pattern(pattern, None, &mut errors);
return Ok(rocket_dyn_templates::tera::Value::String(output.clone().to_string()))
},
None => {
error!("Can't translate message: {}", val);
return Ok(rocket_dyn_templates::tera::Value::String(format!("{}", val)));
},
}
},
None => {
error!("Can't translate message: {}", val);
return Ok(rocket_dyn_templates::tera::Value::String(format!("{}", val)));
},
};
}
pub fn lang_entity(
value: &Value,
attrs: &HashMap<String, rocket_dyn_templates::tera::Value>
) -> Result<Value, Error> {
// TODO: rewrite me!
let chosen_lang = attrs["lang"].as_str().unwrap();
let output_value = match value.as_object().unwrap().get(get_lang_name_from_code(chosen_lang)) {
Some(value) => value.as_str().unwrap(),
None => value["en"].as_str().unwrap(), // TODO: default
};
return Ok(rocket_dyn_templates::tera::Value::String(output_value.to_string())); // TODO: fix-me here!
}
pub fn gravatar_link(
value: &Value,
_: &HashMap<String, rocket_dyn_templates::tera::Value>
) -> Result<Value, Error> {
let val = digest(value.as_str().unwrap());
return Ok(rocket_dyn_templates::tera::Value::String(format!("https://gravatar.com/avatar/{}", val))); // TODO: fix-me here!
}
pub fn format_date(
value: &Value,
_: &HashMap<String, rocket_dyn_templates::tera::Value>
) -> Result<Value, Error> {
if value.is_null() {
return Ok(rocket_dyn_templates::tera::Value::String("".to_string()))
}
let val = value.as_str().unwrap();
if val == "" {
return Ok(rocket_dyn_templates::tera::Value::String("".to_string()))
}
let value = from_string(value.as_str().unwrap().into());
match value {
Ok(date) => Ok(rocket_dyn_templates::tera::Value::String(date.format("%Y").to_string())),
Err(e) => {
error!("Can't parse date: {}", e);
return Ok(rocket_dyn_templates::tera::Value::String("".to_string())) // TOdo: error
}
}
}
pub fn insert_space_every(
value: &Value,
args: &HashMap<String, rocket_dyn_templates::tera::Value>
) -> Result<Value, Error> {
let input = value.as_u64().unwrap().to_string();
let times = args.get("times").unwrap().as_u64().unwrap();
let mut result = String::new();
for (index, ch) in input.chars().enumerate() {
if index > 0 && index as u64 % times == 0 {
result.push(' ');
}
result.push(ch);
}
Ok(rocket_dyn_templates::tera::Value::String(result))
}
pub fn calculate_age(
value: &Value,
_: &HashMap<String, rocket_dyn_templates::tera::Value>
) -> Result<Value, Error> {
//let s = value.to_string().trim_matches('"'); // TODO: unwrap here!
let value = from_string(value.as_str().unwrap().into());
match value {
Ok(value) => {
let current_date = Utc::now().naive_utc().date();
let mut age = current_date.year() - value.year();
// Adjust age if the birthday hasn't occurred yet this year
age = if current_date.month() < value.month() ||
(current_date.month() == value.month() && current_date.day() < value.day()) {
age - 1
} else {
age
};
Ok(rocket_dyn_templates::tera::Value::String(age.to_string()))
}
Err(e) => panic!("Can't parse date: {}", e)
}
}