ctl_core/surface/
templates.rs1use minijinja::{Environment, Error, context};
4use serde::Serialize;
5
6use super::Surface;
7
8pub const VERSION_FRAGMENT: &str = r"{% macro version_line(version) -%}
12version: {{ version }}
13{%- endmacro %}";
14
15pub const INVOCATION_FRAGMENT: &str = r"{% macro mounted_invocation(surface, examples) -%}
19## Invocation
20
21```sh
22{% for example in examples -%}
23mise run {{ surface.mount }} {{ example }}
24{% endfor -%}
25```
26
27Never `mise run {{ surface.mount }} --`. The `--` in `#USAGE mount` is mise's
28completion bootstrap.
29{%- endmacro %}";
30
31pub const COMMANDS_FRAGMENT: &str = r#"{% macro command_inventory(surface) -%}
35## Commands
36
37| Command | Aliases | Purpose |
38|:--|:--|:--|
39{% for command in surface.commands if not command.hidden -%}
40| `{{ command.name }}` | {% if command.visible_aliases %}`{{ command.visible_aliases | join("`, `") }}`{% else %}—{% endif %} | {{ command.about | replace("|", "\\|") | replace("\n", " ") }} |
41{% endfor -%}
42{{- "" -}}
43{%- endmacro %}"#;
44
45const FRAGMENTS: [(&str, &str); 3] = [
46 ("ctl/version.md.jinja", VERSION_FRAGMENT),
47 ("ctl/invocation.md.jinja", INVOCATION_FRAGMENT),
48 ("ctl/commands.md.jinja", COMMANDS_FRAGMENT),
49];
50
51pub fn add_fragments(environment: &mut Environment<'static>) -> Result<(), Error> {
60 for (name, source) in FRAGMENTS {
61 environment.add_template(name, source)?;
62 }
63 Ok(())
64}
65
66pub fn environment() -> Result<Environment<'static>, Error> {
75 let mut environment = Environment::new();
76 environment.set_undefined_behavior(minijinja::UndefinedBehavior::Strict);
77 environment.set_keep_trailing_newline(true);
78 add_fragments(&mut environment)?;
79 Ok(environment)
80}
81
82pub fn render<T: Serialize>(
94 name: &'static str,
95 source: &'static str,
96 surface: &Surface,
97 content: &T,
98) -> Result<String, Error> {
99 let mut environment = environment()?;
100 environment.add_template(name, source)?;
101 environment
102 .get_template(name)?
103 .render(context! { surface, content })
104}