File tree 1 file changed +45
-0
lines changed
1 file changed +45
-0
lines changed Original file line number Diff line number Diff line change
1
+ use serde_json:: Value ;
2
+ use std:: { borrow:: Cow , env} ;
3
+ use tera:: { Context , ContextProvider , Tera } ;
4
+
5
+ #[ derive( Clone ) ]
6
+ struct MyContext {
7
+ upper_layer : Context , // for overrides
8
+ }
9
+
10
+ impl MyContext {
11
+ pub fn new ( ) -> Self {
12
+ Self { upper_layer : Context :: new ( ) }
13
+ }
14
+ }
15
+
16
+ impl ContextProvider for MyContext {
17
+ fn try_insert < T : serde:: Serialize + ?Sized , S : Into < String > > (
18
+ & mut self ,
19
+ key : S ,
20
+ val : & T ,
21
+ ) -> tera:: Result < ( ) > {
22
+ self . upper_layer . try_insert ( key, val)
23
+ }
24
+
25
+ fn find_value ( & self , key : & str ) -> Option < Cow < Value > > {
26
+ if let Some ( val) = self . upper_layer . find_value ( key) {
27
+ return Some ( val) ;
28
+ }
29
+
30
+ env:: var ( key. to_uppercase ( ) ) . map ( Value :: String ) . map ( Cow :: Owned ) . ok ( )
31
+ }
32
+
33
+ fn into_json ( self ) -> Value {
34
+ let Value :: Object ( map) = self . upper_layer . into_json ( ) else { unreachable ! ( ) } ;
35
+ Value :: Object ( map)
36
+ }
37
+ }
38
+
39
+ fn main ( ) {
40
+ let ctx = MyContext :: new ( ) ;
41
+
42
+ let output = Tera :: one_off ( "Hello {{ user }}!" , & ctx, false ) . unwrap ( ) ;
43
+
44
+ println ! ( "{output}" ) ;
45
+ }
You can’t perform that action at this time.
0 commit comments