Note: This site is currently "Under construction". I'm migrating to a new version of my site building software. Lots of things are in a state of disrepair as a result (for example, footnote links aren't working). It's all part of the process of building in public. Most things should still be readable though.

How-to Call Methods On Structs In MiniJinja

My mental model of template languages is to serialize content and send it down the pipe for rendering. I was spending a lot of time working through that on my site realized that shouldn't be necessary.

Sure enough MiniJinja has a `StructObject`` that lets you call methods to generate content dynamically during rendering. It's super useful. No more trying to parse data then rebuild it for easy access. I'm just going to send a single object down with the entire data set and use methods to parse out what I need.

Here's what it looks like:

Code

use minijinja::value::{StructObject, Value};
use minijinja::Environment;

pub struct Universe;

impl Universe {
    fn ping(&self) -> String {
        "CONNECTED".to_string()
    }
}

impl StructObject for Universe {
    fn get_field(&self, field: &str) -> Option<Value> {
        match field {
            "ping" => Some(Value::from(self.ping())),
            _ => None,
        }
    }
}

fn main() {
    let alfa = Universe;
    let env = Environment::new();
    let tmpl = env.template_from_str(
      "Check: {{ ping }}"
    ).unwrap();
    let ctx = Value::from_struct_object(alfa);
    let rv = tmpl.render(ctx).unwrap();
    dbg!(rv);
}

References