コマンドへの引数の渡し方と、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.rs の invoke_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/core の invoke 関数を使用して呼び出します。
引数はオブジェクトとして渡し、キー名は 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));