コマンドから値を返す処理を書く

Recipe ID: rust-003

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.rsinvoke_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/coreinvoke 関数を使用して呼び出します。
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));