summaryrefslogtreecommitdiff
path: root/src/resources/templates.rs
diff options
context:
space:
mode:
authormrw1593 <botahamec@outlook.com>2023-05-15 21:42:47 -0400
committermrw1593 <botahamec@outlook.com>2023-05-29 10:46:04 -0400
commite38854c7db0fe6f006304d7f638b6aa190fc2d87 (patch)
treeeb730768a5f9c68f20c3b20a180cb1ab327a2de5 /src/resources/templates.rs
parent3f0cfb69f2ab1dda4425fe871a6cbf3b4bfb8dc3 (diff)
Started on frontend
Diffstat (limited to 'src/resources/templates.rs')
-rw-r--r--src/resources/templates.rs59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/resources/templates.rs b/src/resources/templates.rs
new file mode 100644
index 0000000..43d6b67
--- /dev/null
+++ b/src/resources/templates.rs
@@ -0,0 +1,59 @@
+use std::collections::HashMap;
+
+use exun::{RawUnexpected, ResultErrorExt};
+use raise::yeet;
+use tera::{Function, Tera, Value};
+use unic_langid::subtags::Language;
+
+use super::languages;
+
+fn make_lang(language: Language) -> impl Function {
+ Box::new(move |_: &HashMap<String, Value>| -> tera::Result<Value> {
+ Ok(Value::String(language.to_string()))
+ })
+}
+
+fn make_msg(language: Language, translations: languages::Translations) -> impl Function {
+ Box::new(
+ move |args: &HashMap<String, Value>| -> tera::Result<Value> {
+ let Some(key) = args.get("key") else { yeet!("No parameter 'key' provided".into()) };
+ let Some(key) = key.as_str() else { yeet!(format!("{} is not a string", key).into()) };
+ let Some(value) = translations.get_message(language, key) else { yeet!(format!("{} does not exist", key).into()) };
+ Ok(Value::String(value))
+ },
+ )
+}
+
+fn make_base_url() -> impl Function {
+ Box::new(|_: &HashMap<String, Value>| Ok(Value::String("foo".to_string())))
+}
+
+fn extend_tera(
+ tera: &Tera,
+ language: Language,
+ translations: languages::Translations,
+) -> Result<Tera, RawUnexpected> {
+ let mut new_tera = initialize()?;
+ new_tera.extend(tera)?;
+ new_tera.register_function("lang", make_lang(language));
+ new_tera.register_function("msg", make_msg(language, translations));
+ new_tera.register_function("baseUrl", make_base_url());
+ Ok(new_tera)
+}
+
+pub fn initialize() -> tera::Result<Tera> {
+ let tera = Tera::new("static/templates/*")?;
+ Ok(tera)
+}
+
+pub fn login_page(
+ tera: &Tera,
+ language: Language,
+ mut translations: languages::Translations,
+) -> Result<String, RawUnexpected> {
+ translations.refresh()?;
+ let mut tera = extend_tera(tera, language, translations)?;
+ tera.full_reload()?;
+ let context = tera::Context::new();
+ tera.render("login.html", &context).unexpect()
+}