コンテンツにスキップ

テンプレートエンジン/Rust

出典: フリー教科書『ウィキブックス(Wikibooks)』

Rustには、テンプレートエンジンとして利用できる強力なライブラリが複数存在します。それぞれ特徴が異なるため、用途に応じて選ぶことが重要です。以下は、Rustで使われる主要なテンプレートエンジンです。

Handlebars (handlebars-rust)

[編集]
  • 特徴: JavaScriptのHandlebarsテンプレートエンジンをRustに移植したもの。ロジックレスな構文を採用し、直感的で使いやすい。
  • 主な用途: シンプルな構文を好むプロジェクト、ウェブアプリケーション。
  • 基本例:
    use handlebars::Handlebars;
    use std::collections::HashMap;
    
    fn main() {
        let mut handlebars = Handlebars::new();
        let mut data = HashMap::new();
        data.insert("name", "Rustacean");
    
        let template = "Hello, {{name}}!";
        let result = handlebars.render_template(template, &data).unwrap();
    
        println!("{}", result); // Output: Hello, Rustacean!
    }
    
  • 利点:
    • シンプルで学習コストが低い。
    • JSONのようなデータ構造をそのまま渡せる。
  • 制限:
    • ロジックレス設計のため、複雑なテンプレート処理には不向き。

Tera

[編集]
  • 特徴: DjangoのテンプレートエンジンにインスパイアされたRust製テンプレートエンジン。強力な機能と柔軟な構文を提供。
  • 主な用途: 高機能なテンプレートエンジンを必要とするウェブアプリケーション。
  • 基本例:
    use tera::{Context, Tera};
    
    fn main() {
        let tera = Tera::default();
        let mut context = Context::new();
        context.insert("name", "Rustacean");
    
        let template = "Hello, {{ name }}!";
        let result = tera.render_str(template, &context).unwrap();
    
        println!("{}", result); // Output: Hello, Rustacean!
    }
    
  • 利点:
    • 制御構文(条件分岐、ループなど)が豊富。
    • 拡張性が高く、カスタムフィルタや関数を追加可能。
  • 制限:
    • 初期設定や学習コストがやや高い。

Askama

[編集]
  • 特徴: Rustの型システムを活用した静的型付きテンプレートエンジン。コンパイル時にテンプレートを検証するため、安全性が高い。
  • 主な用途: コンパイル時の安全性とパフォーマンスを重視するプロジェクト。
  • 基本例:
    use askama::Template;
    
    #[derive(Template)]
    #[template(source = "Hello, {{ name }}!", ext = "txt")]
    struct MyTemplate<'a> {
        name: &'a str,
    }
    
    fn main() {
        let template = MyTemplate { name: "Rustacean" };
        println!("{}", template.render().unwrap()); // Output: Hello, Rustacean!
    }
    
  • 利点:
    • 静的型付けにより、コンパイル時にエラーを発見可能。
    • シンプルで効率的なコード生成。
  • 制限:
    • テンプレートファイルのリロードが難しく、開発時にやや不便。

Maud

[編集]
  • 特徴: Rustのコードにテンプレートを埋め込むDSL(ドメイン固有言語)。テンプレートがそのままRustコードとして扱われる。
  • 主な用途: テンプレートとコードの統一性を求めるプロジェクト。
  • 基本例:
    use maud::html;
    
    fn main() {
        let name = "Rustacean";
        let rendered = html! {
            h1 { "Hello, " (name) "!" }
        };
    
        println!("{}", rendered.into_string()); // Output: <h1>Hello, Rustacean!</h1>
    }
    
  • 利点:
    • Rustコードと統一された書き方。
    • 型安全で、非常に高速。
  • 制限:
    • 独自の構文に慣れる必要がある。
    • 複雑なテンプレートは読みづらくなる場合がある。

Liquid

[編集]
  • 特徴: ShopifyのLiquidテンプレートエンジンをRustに移植したもの。ロジックレスな構文を採用。
  • 主な用途: シンプルなテンプレートが求められる場合や、Liquidの構文に慣れている場合。
  • 基本例:
    use liquid::{object, ParserBuilder};
    
    fn main() {
        let template = "Hello, {{ name }}!";
        let parser = ParserBuilder::with_stdlib().build().unwrap();
        let parsed_template = parser.parse(template).unwrap();
        let globals = object!({ "name": "Rustacean" });
    
        let result = parsed_template.render(&globals).unwrap();
        println!("{}", result); // Output: Hello, Rustacean!
    }
    
  • 利点:
    • シンプルでロジックレス。
    • 他言語(RubyやJavaScript)と統一した構文。
  • 制限:
    • ロジックが制限されているため、複雑な処理には不向き。

選択基準

[編集]
  • シンプルなテンプレート: Handlebars または Liquid
  • 高機能なテンプレート: Tera
  • 型安全性とパフォーマンス重視: Askama
  • Rustコードとの統一性: Maud

Rustには目的や要件に応じた多彩なテンプレートエンジンが揃っており、初心者から上級者まで対応可能です。