use minijinja::{Environment, Error, context};
use serde::Serialize;
use super::Surface;
pub const VERSION_FRAGMENT: &str = r"{% macro version_line(version) -%}
version: {{ version }}
{%- endmacro %}";
pub const INVOCATION_FRAGMENT: &str = r"{% macro mounted_invocation(surface, examples) -%}
## Invocation
```sh
{% for example in examples -%}
mise run {{ surface.mount }} {{ example }}
{% endfor -%}
```
Never `mise run {{ surface.mount }} --`. The `--` in `#USAGE mount` is mise's
completion bootstrap.
{%- endmacro %}";
pub const COMMANDS_FRAGMENT: &str = r#"{% macro command_inventory(surface) -%}
## Commands
| Command | Aliases | Purpose |
|:--|:--|:--|
{% for command in surface.commands if not command.hidden -%}
| `{{ command.name }}` | {% if command.visible_aliases %}`{{ command.visible_aliases | join("`, `") }}`{% else %}—{% endif %} | {{ command.about | replace("|", "\\|") | replace("\n", " ") }} |
{% endfor -%}
{{- "" -}}
{%- endmacro %}"#;
const FRAGMENTS: [(&str, &str); 3] = [
("ctl/version.md.jinja", VERSION_FRAGMENT),
("ctl/invocation.md.jinja", INVOCATION_FRAGMENT),
("ctl/commands.md.jinja", COMMANDS_FRAGMENT),
];
pub fn add_fragments(environment: &mut Environment<'static>) -> Result<(), Error> {
for (name, source) in FRAGMENTS {
environment.add_template(name, source)?;
}
Ok(())
}
pub fn environment() -> Result<Environment<'static>, Error> {
let mut environment = Environment::new();
environment.set_undefined_behavior(minijinja::UndefinedBehavior::Strict);
environment.set_keep_trailing_newline(true);
add_fragments(&mut environment)?;
Ok(environment)
}
pub fn render<T: Serialize>(
name: &'static str,
source: &'static str,
surface: &Surface,
content: &T,
) -> Result<String, Error> {
let mut environment = environment()?;
environment.add_template(name, source)?;
environment
.get_template(name)?
.render(context! { surface, content })
}