# 画面設計書 43-設定切り替え（served/switchConfig）

## 概要

本ドキュメントは、serve-d LSPサーバーにおけるDUBプロジェクト設定切り替え機能（`served/switchConfig`）の画面設計書である。クライアントからのカスタムリクエストにより、アクティブなDUBプロジェクトのビルド設定（Configuration）を指定された設定名に切り替える。

### 本画面の処理概要

本機能は、DUBプロジェクトのビルド設定を指定された設定名に切り替えるカスタムLSPメソッドハンドラである。

**業務上の目的・背景**：DUBプロジェクトでは複数のビルド設定を定義でき、開発者は用途に応じて適切な設定を選択する必要がある。例えば、ライブラリとしてビルドする場合と実行ファイルとしてビルドする場合では、異なる設定を使用する。本機能により、エディタ上から直接ビルド設定を切り替えることで、コード解析やビルドの対象設定を変更できる。設定変更はインポートパスやビルドフラグに影響し、コード補完やリント結果にも反映される。

**画面へのアクセス方法**：エディタのコマンドパレットやステータスバーから設定選択UIを操作し、`served/switchConfig`リクエストをserve-dに送信する。通常、No.42（設定一覧取得）で取得した一覧から選択した値を送信する。

**主要な操作・処理内容**：
1. クライアントから`served/switchConfig`リクエストを受信する（設定名をパラメータとして受け取る）
2. activeInstanceの存在とDubComponentの有無を確認する
3. DubComponentのsetConfigurationメソッドで設定を切り替える
4. 成功/失敗をbool値で返却する

**画面遷移**：
- 遷移元：No.42 設定一覧取得（served/listConfigurations）での設定選択後
- 遷移先：設定反映後、リント・補完等の各機能に影響
- 関連画面：No.44 設定取得（served/getConfig）

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

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 42 | 設定切り替え (served/switchConfig) | 主機能 | DUBビルド設定を指定された設定に切り替える |

## 画面種別

カスタムLSPリクエストハンドラ（protocolMethod）- 設定変更

## URL/ルーティング

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

## 入出力項目

### 入力パラメータ

| 項目名 | 型 | 必須 | 説明 |
|--------|-----|------|------|
| value | string | はい | 切り替え先のビルド設定名。SwitchConfigParamsとして送信。直接文字列または`{"value": "設定名"}`の形式で送信可能 |

### 出力パラメータ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| （戻り値） | bool | 切り替え成功時true、失敗時false |

## 表示項目

本機能自体はバックエンド処理であり、表示項目はクライアント側で管理される。成功時にはステータスバー等の設定表示が更新される。

## イベント仕様

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

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

1. `activeInstance`がnullでないか確認する
2. `activeInstance.has!DubComponent`でDUBコンポーネントの有無を確認する
3. 上記いずれかがfalseの場合、`false`を返却する
4. `activeInstance.get!DubComponent.setConfiguration(value)`で設定を切り替える
5. setConfigurationの結果（bool）をそのまま返却する

### パラメータのデシリアライズ

`SwitchConfigParams`は`SingleValueParams!string`ミックスインを使用しており、以下の2つの形式でパラメータを受け取れる：
- JSON文字列直接：`"configuration_name"`
- オブジェクト形式：`{"value": "configuration_name"}`

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

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

本機能はデータベースへのアクセスを行わない。DubComponentの内部状態を変更するのみである。

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

## メッセージ仕様

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

## 例外処理

- activeInstanceがnullの場合：falseを返却
- DubComponentが存在しない場合：falseを返却
- 存在しない設定名を指定した場合：DubComponent.setConfigurationがfalseを返却する可能性がある

## 備考

- 設定切り替え後、インポートパスやビルドフラグが変更されるため、コード補完やリントの結果に影響する
- DUB設定管理フロー（画面遷移図参照）では、listConfigurations -> switchConfig の順で呼び出される
- 設定変更はNo.8（エラーメッセージ通知）の`changedConfig`経由で無効な設定をチェックする仕組みとは独立している

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | protoext.d | `source/served/lsp/protoext.d` | 490-494行目のSwitchConfigParams構造体。SingleValueParams!stringミックスインにより文字列を直接受け取れる |
| 1-2 | protoext.d | `source/served/lsp/protoext.d` | 422-488行目のSingleValueParamsミックスインテンプレート。JSON文字列またはオブジェクト形式のデシリアライズロジック |

**読解のコツ**: `SingleValueParams`はD言語のミックスインテンプレートで、`{"value": "xxx"}`形式と`"xxx"`形式の両方をデシリアライズ可能にする汎用パターンである。496-505行目のunittestがデシリアライズの動作を示している。

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

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

**主要処理フロー**:
1. **33行目**: `@protocolMethod("served/switchConfig")`デコレータ
2. **34行目**: `bool switchConfig(SwitchConfigParams value)`関数定義
3. **36行目**: `if (!activeInstance || !activeInstance.has!DubComponent)` でガード条件チェック
4. **37行目**: ガード条件に該当した場合`return false`
5. **38行目**: `return activeInstance.get!DubComponent.setConfiguration(value)` で設定を切り替えて結果を返却

#### Step 3: 関連コードを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | types.d | `source/served/types.d` | 463-474行目のactiveInstanceプロパティ |
| 3-2 | extension.d | `source/served/extension.d` | 42行目でdub.dモジュールがpublic importされLSPルーターに登録 |

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

```
served/switchConfig (LSPリクエスト)
    │
    └─ switchConfig(SwitchConfigParams) [dub.d:34]
           │
           ├─ activeInstance チェック [null判定]
           │
           ├─ activeInstance.has!DubComponent [存在確認]
           │
           └─ activeInstance.get!DubComponent.setConfiguration(value) [設定切り替え]
                  │
                  └─ DubComponent内部 [workspace-d: DUB設定を変更]
```

### データフロー図

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

served/switchConfig         ──▶ switchConfig()                 ──▶ bool
SwitchConfigParams              │                                  成功/失敗
  value: string                 ├─ activeInstance確認
  (設定名)                      │
                                └─ DubComponent.setConfiguration(value)
                                   (DUBプロジェクト設定を切り替え)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| dub.d | `source/served/commands/dub.d` | ソース | switchConfig関数の実装（33-39行目） |
| protoext.d | `source/served/lsp/protoext.d` | ソース | SwitchConfigParams構造体の定義（490-494行目） |
| extension.d | `source/served/extension.d` | ソース | dub.dモジュールのpublic import・LSPルーター登録 |
| types.d | `source/served/types.d` | ソース | activeInstanceの定義（463-474行目） |
