RustからTypeScriptの型を生成するツールを作った話
🧪 作ったもの
tauria-tsgen
というツールを作りました。
Tauri環境で、RustのコードからTypeScript側のインターフェース定義を自動生成するやつです。
Rustで書いて、GitHub Actionsでビルド、npmにも配布してるので、Tauriとの親和性も高めです。
npm install tauria-tsgen --save-dev
🛠 使い方
基本的な使い方はこんな感じ:
tauria-tsgen --config tauria-tsgen-config.json
tauria-tsgen-config.json
{
"input_path": "src-tauri/src",
"output_path": "src/app/external/tauri-api"
}
入出力のイメージ
Rust側(入力)
#[command]
pub fn command1() -> String {
"Command 1 executed".to_string()
}
TypeScript側(出力)
import { invoke } from '@tauri-apps/api/tauri';
export class Cmd1 : implements T.ICmd1 {
async command1(): Promise<string> {
return await invoke('command1');
}
static create(): T.ICmd1 {
return new Cmd1();
}
}
// factory function
export function createCmd1(): T.ICmd1 {
return Cmd1.create();
}
🔍 ポイント
- 私はRust書けません(ほんとに)
- gemini-cliが無料になったので、どこまでできるか試してみました
- 結果 → 結構すごいなぁ…これ…
🧠 やってみて得た知見
- 入力と出力がしっかり定義されてると、LLMとの相性が良い。
- 最初はざっくり作って、出力の理想を人間が定義してあげると、そこに向けてちゃんと改善してくれる。
- 放置すると同じ修正ループにハマることがあるので、ちょいちょい人間が口を出してあげるとよい。
- UT(ユニットテスト)はやっぱり大事。ただし、人間が書く必要はなくて、「前と同じことができてるか」の確認として使う。
- お試しプロジェクトでもGit管理は必須。リセットできる安心感があると、安心して壊せる。
- github actionとか手でやると面倒で着手しない部分もいい感じにやってくれる。
- readmeとかも、日英同時に書いてもらうことができる。(英語版が合っているかは...祈ろう...。)
🦀 Rustとの相性が良かった理由
Rustは言語処理系のライブラリが充実してて、ツールを作るのがめっちゃやりやすい。
今までこのような言語補助ツールを作る場合、正規表現で頑張ってたところを、ちゃんと構文解析で処理できるのはしゅごい。
LLMさんもこのへん得意みたいで、わりとそれっぽいコードがポンポン出てくる。
🤖 LLMは言語の計算機
LLMは、言葉の意味空間を進むラジコンロボットみたいなもの。
プロンプトという出発点から、意図した方向に進んで、適切な単語やコードを生成してくれる。
「アーキテクチャ」とかの専門用語は、この“意図の圧縮”みたいなもの。
目標に向けた経路を強力にナビゲーションしてくれる。
アーキテクチャや専門用語に裏打ちされた正しい理解と具体的な最終結果に対する象を持った上で、正しく指示を出せると、LLMはめちゃくちゃ便利な相棒になります。
単純に「バイブス」で使うとどっかあさっての方向に行っちゃう…
(バイブスでやりたければ、バイブスから具体的なイメージのプロンプトをLLMに作られるループを繰り返す必用が...。)
基本知識は重要ですね。
とりあえず、もう手でコード書きたくないし、レートリミットがきたらその日の業務は終了となる事が体感として理解できた🥺