Go html/template 互換を Rust で扱う。

go_html_template は Go の html/template に近い API と挙動を Rust で提供するクレートです。テンプレート構文、パイプライン、文脈依存エスケープ、危険 URL スキーム遮断などの主要機能を実装しています。

Go ライクなテンプレート API

Template::new(...).parse(...).execute(...) の流れで、define/template/range/with/pipeline を利用できます。

文脈依存エスケープ

HTML本文・属性・URL・script/style の文脈を解析し、危険な javascript: スキームを URL 属性で拒否します。

web-rust 向け制約

web-rust feature 有効時は parse_files/parse_glob/parse_fs を無効化し、メモリ上テンプレート運用に寄せられます。

セットアップと基本利用

まず crate を追加し、Template::parse と execute_to_string で最小実行を確認します。web-rust 環境ではファイル読み込み系 API ではなく、文字列テンプレートを使ってください。

インストール

cargo add go_html_template

Rust例

src/main.rs
use go_html_template::{Template, Value};

fn main() -> Result<(), Box<dyn std::error::Error>> {
  let tpl = Template::new("page")
    .parse(r#"<h1>{{.Title}}</h1>\n<p>{{.Body | safe_html}}</p>"#)?;

  let out = tpl.execute_to_string(&serde_json::json!({
    "Title": "go_html_template",
    "Body": "<em>trusted</em>"
  }))?;

  println!("{out}");
  Ok(())
}
互換性ステータス

現状の go_html_template は 主要ワークフロー実装済みだが互換性を継続的に詰めている段階 です。Go html/template との完全 1:1 互換ではないため、導入時は差分検証を行ってください。