【Rust】Teraを触ってみる

投稿日: 更新日:

Teraとは

RustのHTMLテンプレートエンジンの1つです。

PythonのHTMLテンプレートエンジンのJinja2、Django templatesに文法が似ています。

Playgroundもあり、簡単に試すこともできます。

Playground: https://tera.netlify.app/playground/

Hello world

Cargo.tomlの[dependencies]tera = "1"と書きます。

そして、templatesディレクトリを作成しその中にhello.htmlを作成します。

├src
│ └ main.rs
├templates
│ └ hello.html
├Cargo.lock
├Cargo.toml

hello.htmlの中身は以下の通りです。<h1>タグしかありません。

<h1>{{ text }}</h1>

main.rsを書きます。

Tera::newの引数にテンプレートが入っているディレクトリを指定します。

use tera::Tera;
use tera::Context;

fn main(){
    //templatesディレクトリを指定してTeraをインスタンス化
    let tera = Tera::new("templates/**/*").unwrap();

    //レンダリングに必要なコンテキストを宣言
    let mut ctx = Context::new();
    ctx.insert("text", "hello world");//(key, value)の順で指定

    //レンダリングした結果がString型で返却される
    let view = tera.render("hello.html", &ctx).unwrap();
    println!("{}", view);
}

実行すると以下のように出力されます。{{ text }}の部分がhello worldで置き換えられています。

<h1>hello world</h1>

構造体の利用

構造体を利用するにはSerializeトレイトを実装する必要があります。

Cargo.toml[dependencies]serde = { version = "1.0", features = ["derive"] }と追加してください。

例として、nameemailを持つUserという構造体を定義します。#[derive(Serialize)]と書くだけでSerializeトレイトの実装は完了です。

use serde::Serialize;

#[derive(Serialize)]
struct User{
    name: String,
    email: String,
}

hello.htmlを変更します。

<h1>{{ user.name }}</h1>
<h1>{{ user.email }}</h1>

main.rsの全体は以下の通りです。構造体の宣言、初期化などが変更点です。

use tera::Tera;
use tera::Context;
use serde::Serialize;

#[derive(Serialize)]
struct User{
    name: String,
    email: String,
}

fn main(){
    let tera = Tera::new("templates/**/*").unwrap();

    //構造体を初期化
    let user = User{name: "hoge".to_string(), email: "[email protected]".to_string()};

    let mut ctx = Context::new();
    ctx.insert("user", &user);//構造体をコンテキストに渡す

    let view = tera.render("hello.html", &ctx).unwrap();
    println!("{}", view);
}

実行すると出力は以下の通りです。

<h1>hoge</h1>
<h1>[email protected]</h1>

参考

Tera Documentation https://tera.netlify.app/docs/

(最終閲覧:2022/09/15)

書いた人

profile_image

お茶の葉

物理とプログラミングが好きな人