use std::{collections::HashMap, str::FromStr}; use chrono::{Utc, Datelike}; use log::error; use rocket_dyn_templates::tera::{Value, Error}; use ovlach_data::cv::chrono::from_string; use sha256::{digest, try_digest}; use fluent_resmgr::resource_manager::ResourceManager; use tokio::sync::broadcast::error; use unic_langid::LanguageIdentifier; // TODO: tenhle modul je trochu prasacky.. pub fn static_filter( value: &Value, args: &HashMap ) -> Result { 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 ) -> Result { let mgr = ResourceManager::new("./resources/{locale}/{res_id}".into()); let locales = vec![LanguageIdentifier::from_str("en-US").unwrap()]; let val_id = vec![value.as_str().unwrap().to_string()]; 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, args: &HashMap ) -> Result { error!("{:?}", value); // TODO: rewrite me!!! return Ok(rocket_dyn_templates::tera::Value::String(format!("{}", value["en"].as_str().unwrap()))); // TODO: fix-me here! } pub fn gravatar_link( value: &Value, args: &HashMap ) -> Result { 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 insert_space_every( value: &Value, args: &HashMap ) -> Result { let mut 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, args: &HashMap ) -> Result { error!("{:?}", value.as_str()); //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) } }