aboutsummaryrefslogtreecommitdiff
path: root/src/templates.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/templates.rs')
-rw-r--r--src/templates.rs97
1 files changed, 97 insertions, 0 deletions
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<String, Value>) -> Result<Value> {
+ 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<String, Value>) -> Result<Value> {
+ 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<String, Value>) -> Result<Value> {
+ 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<String> {
+ 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
+}