Rust 側で起きたエラーを JS でキャッチする

Recipe ID: front-004

Rust 側で発生したエラーを JS 側で適切にキャッチして処理する方法を解説します。
Rust の Result<T, E> 型が、JS の Promise の resolve/reject にマッピングされます。

Rust 側の定義

戻り値を Result<T, String> (または Result<T, custom_error::Error>) にします。
エラー型 ESerialize を実装している必要があります(String は実装済み)。

#[tauri::command]
fn divide(a: f64, b: f64) -> Result<f64, String> {
    if b == 0.0 {
        Err("Cannot divide by zero".into()) // Promise.reject になる
    } else {
        Ok(a / b) // Promise.resolve になる
    }
}

フロントエンド側の実装

try...catch 構文または .catch() メソッドを使用します。

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

try {
  const result = await invoke<number>('divide', { a: 10, b: 0 });
  console.log('Result:', result);
} catch (error) {
  // Rust が Err を返すとここに来る
  console.error('Calculation failed:', error); // "Cannot divide by zero"
}

anyhow などのエラー型を返す場合は、.to_string() やカスタム Serialize 実装を使って文字列やオブジェクトに変換して返すのが一般的です。