概要
- CLIツールのバリデーションコードの繰り返し問題
- 「Parse, don’t validate」の考え方をCLIにも適用
- Optiqueによる型安全なCLIパーサの実現
- TypeScriptの型推論活用でバリデーション不要化
- コードの信頼性・可読性・保守性向上
CLIバリデーションコードの苦痛と解決策
- CLIツール開発で 同じようなバリデーションコード が乱立する現状
- オプション依存、排他フラグ、環境別要件など 複雑なパターン の繰り返し出現
- バリデーション自体は難しくないが、 どのプロジェクトでも冗長 になりがち
- 他のデータ型(JSON等)では Zod等のパーサで直接型安全に処理 している事実
- CLIだけが「とりあえずパース→バリデーション地獄」の 旧来方式 に留まる現状
「Parse, don't validate」のCLI適用
- Alexis Kingの「Parse, don’t validate」ブログに 大きな影響 を受けた経験
- データを「あとから検証」ではなく「最初から正しい型へパース」 する発想
- 無効データは パース時点で拒否、余計なif文不要
- CLIでも 型安全なパース を実現すべきという着想
Optiqueによる型安全なCLIパース
- Optiqueは CLIバリデーションの繰り返し問題 を根本解決するために開発
- 典型的なバリデーションパターンを パーサの型定義で吸収
- 依存オプション :serverがfalseならport存在せず、serverがtrueなら必須
- 排他オプション :or()で「どれか一つだけ」を型で表現
- 環境依存オプション :or()で環境ごとに異なる型を指定
- TypeScriptの型推論 で、正しい組み合わせしか許可されない状態を自動生成
- ランタイムバリデーション不要化、バグ発生源の大幅削減
パーサコンビネータの直感的応用
- 「パーサコンビネータ」は 難解そうな名前だが実はシンプル
- パーサは関数、コンビネータはパーサを組み合わせる関数
- Haskellのoptparse-applicativeに着想を得て CLIパースに応用
- モナドや圏論不要、ただの関数合成で完結
TypeScript型推論の恩恵
- Optiqueでは CLIオプション型を手書き不要
- パーサ定義だけで TypeScriptが型を自動生成
- actionが"deploy"ならenvironment必須、"rollback"ならversion必須など 型レベルで厳密化
- 型安全・自動補完・バグ防止 を実現
Optique導入後の変化
- バリデーションロジックの大部分を削除 可能
- CLI引数仕様の変更も パーサ定義修正+型エラー修正で完結
- 複雑なオプション関係も気軽に追加可能
- オプショングループの再利用性向上 (merge等で柔軟に合成)
- 「コンパイルが通れば動く」 という強い信頼感
Optiqueを使うべき人・使わなくていい人
- 10行スクリプト や単一引数なら不要
- 以下の経験がある人にはおすすめ
- バリデーションロジックの同期ずれ
- 本番での オプション組み合わせ爆発
- --verboseと--jsonの併用バグ の追跡
- 依存関係チェックの繰り返し実装
- Optiqueは若いプロジェクト だが、「parse, don’t validate」の思想は堅牢
まとめ・導入のすすめ
- Optique公式チュートリアル やGitHubで実際に試すことを推奨
- CLIのバリデーション地獄からの解放 を目指す開発者向け
- Optiqueが CLI問題の万能薬とは言わない が、同じバリデーションを何度も書く無駄は減らせる
- 「そのバリデーションコード、本当に必要?」と 自問自答を促すツール