Open3
Tauriで型安全なIPC通信を行いたい
通常のコマンド
フロントエンド側では、返り値、引数の型の情報は無い。実際に実行されるまで、どんな型が返ってくるか分からない。
フロントエンド
const kaeriti = await invoke<string>("command_name", {"arg1": "引数の値"})
console.log(kaeriti) // -> "返り値だよー"
バックエンド
#[tauri::command]
pub fn command_name(arg1: String) -> String {
String::from("返り値だよー")
}
解決策
- Rustで定義した型をTypeScriptでも手動で定義する。
- Rustで定義した型をTypeScriptで自動生成する。
- tauri-bindgenを使う。
- GraphQLを使う。
- rspcを使う。
↓ここで色々話されてる
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)
}