概要
検索結果を human / json / path の3形式で出力するフォーマッターを実装する。
背景・動機
CLI出力の多様な用途(目視確認、プログラム連携、パイプ連携)に対応するため。--format フラグで切り替える。
提案する解決策
src/output/ モジュールとして以下を実装する。
human 形式(デフォルト)
docs/auth.md:12 [## 認証フロー]
認証はJWTベースで行い、セッション管理には...
Tags: auth, security
docs/api.md:45 [### エンドポイント]
/api/auth/login にPOSTリクエストを...
- ファイルパス:行番号 [見出し] の形式
- 本文スニペット(最大2行、超過時は末尾に「...」を付与。改行がない場合は先頭120文字で切り詰め)
- タグがあれば表示(カンマ区切り)
- ターミナル色付き出力(
colored クレートを使用)
- score は human 形式では非表示
json 形式(JSONL)
{"path":"docs/auth.md","heading":"認証フロー","heading_level":2,"body":"認証はJWTベースで...","tags":["auth","security"],"line_start":12,"score":1.5}
{"path":"docs/api.md","heading":"エンドポイント","heading_level":3,"body":"/api/auth/login に...","tags":[],"line_start":45,"score":1.2}
SearchResult.tags(スペース区切り文字列)を split してJSON配列に変換する
- 空文字列の場合は空配列
[] を出力
score フィールドを含む(検索スコアの伝達用)
path 形式
実装詳細
SearchResult の利用
- 既存の
indexer::reader::SearchResult をそのまま利用する(重複定義しない)
- JSON出力のために
SearchResult に serde::Serialize derive を追加する
- tags フィールド(String型)のJSON配列化はフォーマッター側で変換処理を行う
tags 変換ルール
SearchResult.tags はスペース区切り文字列(例: "auth security")
- JSON出力時:
split_whitespace() で Vec<String> に変換して配列出力
- human出力時: カンマ区切り(例:
Tags: auth, security)
- 空文字列の場合: JSON は空配列
[]、human はタグ行自体を非表示
エラー型
OutputError enum を src/output/mod.rs に定義
Io(std::io::Error) / Json(serde_json::Error) バリアントを含む
std::error::Error + Display + From 変換を実装
CLI --format フラグ
src/main.rs の Search サブコマンドに --format オプションを追加
OutputFormat enum(Human, Json, Path)を src/output/mod.rs で定義
- clap の
ValueEnum derive で直接パース
- デフォルト値は
OutputFormat::Human(default_value_t 使用)
色付き出力の制御
colored クレート(バージョン 2)を使用
NO_COLOR 環境変数によるANSIエスケープ無効化に対応(colored crateの標準機能)
- パイプ出力時のANSIコード抑制を考慮
スニペット切り詰めルール
- body を改行(
\n)で分割し、最大2行を取得
- 3行目以降がある場合は末尾に「...」を付与
- 改行がない場合のフォールバック: 先頭120文字で切り詰め、超過時に「...」を付与
受け入れ基準
影響範囲
新規ファイル
src/output/mod.rs — モジュール定義・OutputFormat enum・OutputError enum
src/output/human.rs — Human形式フォーマッター
src/output/json.rs — JSONL形式フォーマッター
src/output/path.rs — Path形式フォーマッター
tests/output_format.rs — 出力フォーマットテスト
既存ファイルの変更
src/main.rs — Search サブコマンドに --format オプション追加
src/lib.rs — pub mod output; の有効化
src/indexer/reader.rs — SearchResult に Serialize derive 追加
Cargo.toml — colored = "2" クレート追加
概要
検索結果を human / json / path の3形式で出力するフォーマッターを実装する。
背景・動機
CLI出力の多様な用途(目視確認、プログラム連携、パイプ連携)に対応するため。
--formatフラグで切り替える。提案する解決策
src/output/モジュールとして以下を実装する。human 形式(デフォルト)
coloredクレートを使用)json 形式(JSONL)
{"path":"docs/auth.md","heading":"認証フロー","heading_level":2,"body":"認証はJWTベースで...","tags":["auth","security"],"line_start":12,"score":1.5} {"path":"docs/api.md","heading":"エンドポイント","heading_level":3,"body":"/api/auth/login に...","tags":[],"line_start":45,"score":1.2}SearchResult.tags(スペース区切り文字列)を split してJSON配列に変換する[]を出力scoreフィールドを含む(検索スコアの伝達用)path 形式
実装詳細
SearchResult の利用
indexer::reader::SearchResultをそのまま利用する(重複定義しない)SearchResultにserde::Serializederive を追加するtags 変換ルール
SearchResult.tagsはスペース区切り文字列(例:"auth security")split_whitespace()でVec<String>に変換して配列出力Tags: auth, security)[]、human はタグ行自体を非表示エラー型
OutputErrorenum をsrc/output/mod.rsに定義Io(std::io::Error)/Json(serde_json::Error)バリアントを含むstd::error::Error+Display+From変換を実装CLI --format フラグ
src/main.rsの Search サブコマンドに--formatオプションを追加OutputFormatenum(Human,Json,Path)をsrc/output/mod.rsで定義ValueEnumderive で直接パースOutputFormat::Human(default_value_t使用)色付き出力の制御
coloredクレート(バージョン 2)を使用NO_COLOR環境変数によるANSIエスケープ無効化に対応(colored crateの標準機能)スニペット切り詰めルール
\n)で分割し、最大2行を取得受け入れ基準
--format humanでカラー付き・スニペット付きの出力ができる--format jsonで JSONL 形式の出力ができる(score 含む)--format pathでファイルパスのみの出力ができる(重複除去)影響範囲
新規ファイル
src/output/mod.rs— モジュール定義・OutputFormat enum・OutputError enumsrc/output/human.rs— Human形式フォーマッターsrc/output/json.rs— JSONL形式フォーマッターsrc/output/path.rs— Path形式フォーマッターtests/output_format.rs— 出力フォーマットテスト既存ファイルの変更
src/main.rs— Search サブコマンドに--formatオプション追加src/lib.rs—pub mod output;の有効化src/indexer/reader.rs—SearchResultにSerializederive 追加Cargo.toml—colored = "2"クレート追加