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