Rust の構造体やベクタなどを JSON としてフロントエンドに返す方法を解説します。
serde::Serialize トレイとを導出(derive)するだけで自動的に変換されます。
実装例
use serde::Serialize;
#[derive(Serialize)]
struct User {
id: u64,
username: String,
is_active: bool,
}
#[tauri::command]
fn get_current_user() -> User {
User {
id: 12345,
username: "tauri_fan".into(),
is_active: true,
}
}
Option 型の扱い
Option<T> は null (またはキー自体の省略)としてシリアライズされます。
#[derive(Serialize)]
struct Config {
// None の場合、JSON にキーを含めない
#[serde(skip_serializing_if = "Option::is_none")]
api_key: Option<String>,
}
シリアライズ時の挙動を細かく制御するには #[serde(...)] 属性を活用してください。
コマンドの登録
定義したコマンドは lib.rs の invoke_handler に登録する必要があります。
#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
tauri::Builder::default()
.invoke_handler(tauri::generate_handler![
get_current_user
])
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
フロントエンドからの呼び出し
@tauri-apps/api/core の invoke 関数を使用して呼び出します。
Rust 側で serde::Serialize を導出した構造体は、JavaScript のオブジェクト(JSON)として受け取ることができます。
import { invoke } from '@tauri-apps/api/core';
// Rust の構造体に対応するインターフェースを定義
interface User {
id: number;
username: string;
is_active: boolean;
}
// コマンド 'get_current_user' を呼び出す
// ジェネリクス <User> を指定して、戻り値の型を明示する
invoke<User>('get_current_user')
.then((user) => {
console.log('User:', user);
// 戻り値は JS オブジェクトとして扱える
// 出力例: { id: 12345, username: "tauri_fan", is_active: true }
console.log(`Username: ${user.username}`);
})
.catch((e) => console.error(e));