Skip to content

Commit bdf42a3

Browse files
committed
Add ContextProvider example
1 parent 249b45d commit bdf42a3

File tree

1 file changed

+45
-0
lines changed

1 file changed

+45
-0
lines changed

examples/dynamic/main.rs

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
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+
}

0 commit comments

Comments
 (0)