【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"] }
と追加してください。
例として、name
とemail
を持つ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)