~lthms/typed-urls

ref: 1f203c30307c611503efa32cc92f1bf5ebf8a0eb typed-urls/typed-urls-tera/src/lib.rs -rw-r--r-- 886 bytes
1f203c30Thomas Letan Derive Serialize implementation 9 months ago
                                                                                
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 typed_urls::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()),
        )
    }
}