Rust コマンドに引数を渡す

Recipe ID: front-002

JS から Rust コマンドへ引数を渡す方法を解説します。
Tauri は引数を自動的にシリアライズ(JSON変換)し、Rust 側の引数名にマッピングします。

Rust 側の定義

引数名は JS 側のオブジェクトのキーと正確に一致している必要があります(デフォルトではキャメルケースからスネークケースへの変換は行われませんが、rename_all で設定可能です)。

#[tauri::command]
fn greet(name: String, age: u8, is_human: bool) {
    println!("Hello {}, age {}, human? {}", name, age, is_human);
}

※ 基本的な型(String, integer, bool)以外を受け取るには serde::Deserialize を実装した構造体である必要があります。

フロントエンド側の実装

第2引数にオブジェクトとしてデータを渡します。

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

invoke('greet', {
  name: 'Tauri User',
  age: 25,
  isHuman: true // 注意: Rust側で is_human (snake_case) の場合、デフォルトではエラーになるか渡されない
  // Rust側を `isHuman` にするか、`#[serde(rename_all = "camelCase")]` を使うか、JS側を `is_human` に合わせる必要があります。
});

// 推奨: Rust 側を camelCase 対応にする
/*
#[derive(serde::Deserialize)]
#[serde(rename_all = "camelCase")]
struct User {
  name: String,
  is_active: bool,
}
*/

Tips: スネークケース変換

一般的に Rust はスネークケース (my_arg)、JS はキャメルケース (myArg) が好まれます。
これを自動変換するには、Rust 側の関数引数を構造体で受け取るようにし、その構造体に #[serde(rename_all = "camelCase")] を付けるのがベストプラクティスです。