aboutsummaryrefslogtreecommitdiffstats
path: root/src/tera.rs
blob: 18d7b4c3e0d87f62d85d29ba2b081de0731765c8 (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
40
41
42
43
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */

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()),
        )
    }
}