# 画面設計書 42-設定一覧取得（served/listConfigurations）

## 概要

本ドキュメントは、serve-d LSPサーバーにおけるDUBプロジェクト設定一覧取得機能（`served/listConfigurations`）の画面設計書である。クライアントからのカスタムリクエストにより、アクティブなDUBプロジェクトで利用可能なビルド設定（Configuration）の一覧を返却する。

### 本画面の処理概要

本機能は、DUBプロジェクトが定義する複数のビルド設定（例：library、unittest、application等）の名称一覧をクライアントに提供するカスタムLSPメソッドハンドラである。

**業務上の目的・背景**：DUBパッケージマネージャでは、1つのプロジェクトに複数のビルド設定（Configuration）を定義できる。例えば、ライブラリとしてビルドする設定、ユニットテスト用の設定、実行ファイルとしてビルドする設定などがある。開発者がエディタ上でどの設定でビルド・解析するかを選択するためには、まず利用可能な設定の一覧を取得する必要がある。本機能はその一覧取得を担う。

**画面へのアクセス方法**：エディタのコマンドパレットやステータスバーから設定選択UIを開く際に、`served/listConfigurations`リクエストがserve-dに送信される。通常、No.43（設定切り替え）の前段階として呼び出される。

**主要な操作・処理内容**：
1. クライアントから`served/listConfigurations`リクエストを受信する
2. activeInstanceの存在とDubComponentの有無を確認する
3. DubComponentからconfigurationsプロパティを取得する
4. 設定名の文字列配列をクライアントに返却する

**画面遷移**：
- 遷移元：エディタのコマンドパレット、DUB設定管理フロー
- 遷移先：No.43 設定切り替え（served/switchConfig） - ユーザーが一覧から設定を選択した場合
- 関連画面：No.44 設定取得（served/getConfig）

**権限による表示制御**：LSPプロトコル上の権限制御は存在しない。アクティブなDUBプロジェクトが存在しない場合はnullが返却される。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 41 | 設定一覧取得 (served/listConfigurations) | 主機能 | アクティブなDUBプロジェクトの利用可能なビルド設定一覧を返却する |

## 画面種別

カスタムLSPリクエストハンドラ（protocolMethod）- 一覧取得

## URL/ルーティング

LSPカスタムメソッド: `served/listConfigurations`

## 入出力項目

### 入力パラメータ

| 項目名 | 型 | 必須 | 説明 |
|--------|-----|------|------|
| （なし） | - | - | 本リクエストはパラメータを受け取らない |

### 出力パラメータ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| （戻り値） | string[] \| null | 利用可能な設定名の文字列配列。DubComponentが存在しない場合はnull |

## 表示項目

クライアント側で設定選択UIとして表示される。

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 設定名 | string | DUBプロジェクトのビルド設定名（例："library", "unittest", "application"等） |

## イベント仕様

### 1-listConfigurations リクエスト受信

クライアントから`served/listConfigurations`リクエストを受信すると、以下の処理が実行される。

1. `activeInstance`がnullでないか確認する
2. `activeInstance.has!DubComponent`でDUBコンポーネントの有無を確認する
3. 上記いずれかがfalseの場合、`null`を返却する
4. `activeInstance.get!DubComponent.configurations`でDUBの設定一覧を取得する
5. 取得した`string[]`をそのままレスポンスとして返却する

## データベース更新仕様

### 操作別データベース影響一覧

本機能はデータベースへのアクセスを行わない。DUBプロジェクトの設定情報はメモリ上のDubComponentから読み取る。

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| - | - | - | データベースアクセスなし |

## メッセージ仕様

| メッセージID | 種別 | 表示条件 | メッセージ内容 |
|-------------|------|---------|--------------|
| - | - | - | 本リクエストは特にメッセージを送信しない |

## 例外処理

- activeInstanceがnullの場合：nullを返却（エラーではない）
- DubComponentが存在しない場合：nullを返却（エラーではない）
- DUBプロジェクトに設定が定義されていない場合：空配列が返却される

## 備考

- 本機能はDUB設定管理フロー（画面遷移図参照）の起点となり、`served/switchConfig`（No.43）で設定を切り替える前に呼び出される
- activeInstanceはクライアントが最後にアクセスしたドキュメントに基づいて自動的に選択される
- DUBのconfigurationsはdub.json/dub.sdl内の`configurations`セクションで定義される

---

## コードリーディングガイド

本画面を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

本機能の入出力は非常にシンプルで、パラメータなし・戻り値がstring[]である。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | types.d | `source/served/types.d` | 463-474行目でactiveInstanceプロパティの定義。DubComponentはworkspaced.comsからインポートされる |

**読解のコツ**: `activeInstance`はグローバル変数であり、直前のドキュメント操作によって自動的に設定される。DubComponentのconfigurationsプロパティはworkspace-d内部でDUBプロジェクトの設定を読み取って返す。

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | dub.d | `source/served/commands/dub.d` | 25-31行目のlistConfigurations関数。`@protocolMethod("served/listConfigurations")`アノテーションでLSPメソッドハンドラとして登録 |

**主要処理フロー**:
1. **25行目**: `@protocolMethod("served/listConfigurations")`デコレータ
2. **26行目**: `string[] listConfigurations()`関数定義
3. **28行目**: `if (!activeInstance || !activeInstance.has!DubComponent)` でガード条件チェック
4. **29行目**: ガード条件に該当した場合`return null`
5. **30行目**: `return activeInstance.get!DubComponent.configurations` でDUB設定一覧を取得して返却

#### Step 3: モジュール登録を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | extension.d | `source/served/extension.d` | 42行目で`public import served.commands.dub`が宣言され、dub.dの全ハンドラがLSPルーターに登録される |

### プログラム呼び出し階層図

```
served/listConfigurations (LSPリクエスト)
    │
    └─ listConfigurations() [dub.d:26]
           │
           ├─ activeInstance チェック [null判定]
           │
           ├─ activeInstance.has!DubComponent [存在確認]
           │
           └─ activeInstance.get!DubComponent.configurations [設定一覧取得]
                  │
                  └─ DubComponent内部 [workspace-d: DUBプロジェクト設定読み取り]
```

### データフロー図

```
[入力]                        [処理]                              [出力]

served/listConfigurations ──▶ listConfigurations()          ──▶ string[] | null
リクエスト（パラメータなし）      │                                  設定名の配列
                              ├─ activeInstance確認
                              │
                              └─ DubComponent.configurations
                                 (DUBプロジェクト設定を読み取り)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| dub.d | `source/served/commands/dub.d` | ソース | listConfigurations関数の実装（25-31行目） |
| extension.d | `source/served/extension.d` | ソース | dub.dモジュールのpublic import・LSPルーター登録 |
| types.d | `source/served/types.d` | ソース | activeInstanceの定義（463-474行目） |
| protoext.d | `source/served/lsp/protoext.d` | ソース | LSPプロトコル拡張型の定義 |
