From 11052951b74b9ad4b6a9412ae490086235f9154b Mon Sep 17 00:00:00 2001 From: Joris Date: Sun, 3 Jan 2021 13:40:40 +0100 Subject: Rewrite in Rust --- src/templates.rs | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 src/templates.rs (limited to 'src/templates.rs') diff --git a/src/templates.rs b/src/templates.rs new file mode 100644 index 0000000..7e3753a --- /dev/null +++ b/src/templates.rs @@ -0,0 +1,97 @@ +use serde::Serialize; +use serde_json::json; +use serde_json::value::Value; +use std::collections::HashMap; +use tera::Tera; +use tera::{Error, Result}; + +use crate::queries; + +#[derive(Debug, Serialize)] +pub enum Header { + Payments, + Categories, + Incomes, + Balance, + Statistics, +} + +pub fn get() -> Tera { + let mut tera = match Tera::new("templates/**/*") { + Ok(t) => t, + Err(e) => { + error!("Parsing error(s): {}", e); + ::std::process::exit(1); + } + }; + tera.register_function("payments_params", payments_params); + tera.register_filter("numeric", numeric); + tera.register_filter("euros", euros); + tera +} + +fn payments_params(args: &HashMap) -> Result { + let q = json!({ + "page": args.get("page"), + "search": args.get("search"), + "frequency": args.get("frequency"), + "highlight": args.get("highlight"), + }); + + match serde_json::from_value(q) { + Ok(q) => Ok(json!(queries::payments_url(q))), + Err(msg) => Err(Error::msg(msg)), + } +} + +fn euros(value: &Value, _: &HashMap) -> Result { + match value { + Value::Number(n) => { + if let Some(n) = n.as_i64() { + let str = rgrouped(n.abs().to_string(), 3).join(" "); + let sign = if n < 0 { "-" } else { "" }; + Ok(json!(format!("{}{} €", sign, str))) + } else if let Some(n) = n.as_f64() { + Ok(json!(format!("{} €", n.to_string()))) + } else { + Err(Error::msg("Error parsing number")) + } + } + _ => Err(Error::msg(format!("{:?} should be a number", value))), + } +} + +fn numeric(value: &Value, _: &HashMap) -> Result { + match value { + Value::Number(n) => { + if let Some(n) = n.as_i64() { + let str = rgrouped(n.abs().to_string(), 3).join(" "); + let sign = if n < 0 { "-" } else { "" }; + Ok(json!(format!("{}{}", sign, str))) + } else if let Some(n) = n.as_f64() { + Ok(json!(format!("{}", n.to_string()))) + } else { + Err(Error::msg("Error parsing number")) + } + } + _ => Err(Error::msg(format!("{:?} should be a number", value))), + } +} + +fn rgrouped(str: String, n: usize) -> Vec { + let mut str = str.clone(); + let mut l = str.len(); + let mut res = vec![]; + while l > n { + let str2 = str.clone(); + let (start, end) = str2.split_at(l - n); + l -= n; + str = start.to_string(); + res.push(end.to_string()); + } + if !str.is_empty() { + res.push(str); + } + res.reverse(); + res +} -- cgit v1.2.3