コマンドで引数を受け取る処理を書く

Recipe ID: rust-002

コマンドへの引数の渡し方と、Rust 側での受け取り方を解説します。
キャメルケース(JS)とスネークケース(Rust)の自動変換が行われます。

通常の引数

#[tauri::command]
fn calculate_sum(value_a: i32, value_b: i32) -> i32 {
    value_a + value_b
}

引数名の変更 (rename_all)

フロントエンドからの引数名がスネークケースなどで送られてくる場合、#[tauri::command(rename_all = "snake_case")] などを指定してマッピングルールを変更できます。

構造体で受け取る

引数が多い場合は構造体にまとめるのがベストプラクティスです。

use serde::Deserialize;

#[derive(Deserialize)]
struct UserInfo {
    name: String,
    age: u8,
}

#[tauri::command]
fn save_user(info: UserInfo) {
    println!("Saving user: {}, age: {}", info.name, info.age);
}

コマンドの登録

定義したコマンドは lib.rsinvoke_handler に登録する必要があります。

#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
    tauri::Builder::default()
        .invoke_handler(tauri::generate_handler![
            calculate_sum,
            save_user
        ])
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

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

@tauri-apps/api/coreinvoke 関数を使用して呼び出します。
引数はオブジェクトとして渡し、キー名は Rust 側の引数名をキャメルケースに変換したものになります(デフォルト設定の場合)。

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

// 1. 通常の引数の呼び出し例
// Rust: fn calculate_sum(value_a: i32, value_b: i32)
// JS: 引数はキャメルケース (valueA, valueB) になる
invoke('calculate_sum', { valueA: 10, valueB: 20 })
  .then((sum) => console.log('Sum:', sum))
  .catch((e) => console.error(e));

// 2. 構造体で受け取る場合の例
// Rust: fn save_user(info: UserInfo)
// JS: 引数名 'info' に対応するオブジェクトを渡す
// ※ Rust側の引数名 'info' プロパティの中にデータを入れる必要がある点に注意
const userInfo = { name: 'Alice', age: 30 };
invoke('save_user', { info: userInfo })
  .then(() => console.log('User saved'))
  .catch((e) => console.error(e));