summaryrefslogtreecommitdiff
path: root/src/resources/templates.rs
blob: 75782560975f04476a69674d1dab32358fc323b8 (plain)
use std::collections::HashMap;

use exun::{RawUnexpected, ResultErrorExt};
use raise::yeet;
use tera::{Function, Tera, Value};
use unic_langid::subtags::Language;

use crate::api::AuthorizationParameters;

use super::languages;

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 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("msg", make_msg(language, translations));
	Ok(new_tera)
}

pub fn initialize() -> tera::Result<Tera> {
	let tera = Tera::new("static/templates/*")?;
	Ok(tera)
}

pub fn login_page(
	tera: &Tera,
	params: &AuthorizationParameters,
	language: Language,
	mut translations: languages::Translations,
) -> Result<String, RawUnexpected> {
	translations.refresh()?;
	let mut tera = extend_tera(tera, language, translations)?;
	tera.full_reload()?;
	let mut context = tera::Context::new();
	context.insert("lang", language.as_str());
	context.insert("params", &serde_urlencoded::to_string(params)?);
	tera.render("login.html", &context).unexpect()
}