aboutsummaryrefslogtreecommitdiffstats
path: root/src/tera.rs
blob: 4ad94d3b5dfd7a9af88fb7a32dd52f9e8388cb4c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
use std::collections::HashMap;
use std::fmt::{Debug, Display};

use serde_json::Value;
use tera::{Error, Function, Tera};
use crate::TypedUrl;

struct TeraFunction<U>(U::Route)
where
    U : TypedUrl;

impl<U> Function for TeraFunction<U>
where
    U : TypedUrl + Display,
    U::Route : Sync + Send,
{
    fn call(
        &self,
        args : &HashMap<String, Value>,
    ) -> Result<Value, Error> {
        let res =
            U::from_route(&self.0, args).ok_or(Error::msg("missing keys"))?;

        Ok(Value::String(res.to_string()))
    }
}

pub fn register_typed_url<U>(tera : &mut Tera) -> ()
where
    U : TypedUrl + Display + 'static,
    U::Route : Sync + Send + Debug + Clone + Display + 'static,
{
    for route in U::routes() {
        tera.register_function(
            &format!("{:?}Url", route),
            TeraFunction::<U>(route.clone()),
        )
    }
}