Open3

Tauriで型安全なIPC通信を行いたい

r4air4ai

通常のコマンド

フロントエンド側では、返り値、引数の型の情報は無い。実際に実行されるまで、どんな型が返ってくるか分からない。

フロントエンド
const kaeriti = await invoke<string>("command_name", {"arg1": "引数の値"})
console.log(kaeriti)  // -> "返り値だよー"
バックエンド
#[tauri::command]
pub fn command_name(arg1: String) -> String {
    String::from("返り値だよー")
}
r4air4ai

1. Rustで定義した型をTypeScriptでも手動で定義する。

コマンドに一対一対応する関数をTypeScriptで書く。一度関数だけ定義してしまえば、あとは快適に使える。でもめんどいから自動化したいよね。

メリット:

  • シンプルで導入が簡単。
  • 型安全でないコードを最小限に隔離できる。

デメリット:

  • 同じ内容のコードを2回書くことになるので、めんどくさい。
  • Rust側のコードを変更した際に、TypeScript側のコードも同時に修正しないならずめんどくさい。忘れた場合には不具合になる。
greet.ts
import { invoke } from "@tauri-apps/api";

export async function greet(name: string): Promise<string> {
    return invoke<string>("greet", { name });
}
main.ts
import { greet } from "./greet";

const result = greet("綾波");
console.log(result);  // -> おはよう綾波!
command.rs(バックエンド)
#[tauri::command]
pub fn greet(name: String) -> String {
    format!("おはよう{}!", name)
}