Tauri コマンド関数を定義する

Recipe ID: rust-001

フロントエンドから呼び出せる Rust の関数(コマンド)を定義する基本手順を解説します。
#[tauri::command] マクロを付与し、tauri::Builder でハンドラとして登録する必要があります。

基本的な定義

#[tauri::command] マクロを関数に付与します。

// src-tauri/src/lib.rs などに記述

// 単純な文字列を返す例
#[tauri::command]
fn greet(name: &str) -> String {
    format!("Hello, {}!", name)
}

登録方法 (src-tauri/src/lib.rs)

src-tauri/src/lib.rs にある tauri::Builderinvoke_handler チェーンメソッド内で generate_handler! マクロを使用して登録します。Tauri v2 のデフォルトテンプレートでは、アプリケーションのエントリーポイント生成ロジックは lib.rs に記述されています。

// src-tauri/src/lib.rs

#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
    tauri::Builder::default()
        .invoke_handler(tauri::generate_handler![greet]) // 配列の中にカンマ区切りで複数のコマンド記述可能
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

フロントエンドからの呼び出し

@tauri-apps/api/coreinvoke 関数を使用して、登録したコマンドを呼び出します。
invokePromise を返すため、async/await または .then() で処理します。

import { invoke } from '@tauri-apps/api/core';

async function callGreet() {
  try {
    // ジェネリクスで戻り値の型を指定可能 (<string>)
    // 引数はオブジェクトとして渡す (キーはRust側の引数名と一致させる)
    const message = await invoke<string>('greet', { name: 'World' });
    console.log(message);
  } catch (error) {
    console.error('Failed to invoke greet:', error);
  }
}

注意点

  • 関数名はフロントエンドで呼び出すときの引数(文字列)になります(スネークケースが標準)。
  • 引数や戻り値は serde::Serialize / serde::Deserialize を実装している必要があります。