# 画面設計書 8-エラーメッセージ通知

## 概要

本ドキュメントは、serve-d LSPサーバーにおけるエラーメッセージ通知の画面設計書である。無効な設定（configuration, archType, buildType, compiler）が指定された場合にクライアントにエラーメッセージを表示する。

### 本画面の処理概要

**業務上の目的・背景**：ユーザーがエディタ設定でDUBのビルド設定、アーキテクチャタイプ、ビルドタイプ、コンパイラに無効な値を指定した場合、コード補完やビルドが正しく動作しなくなる。本通知は無効な設定値をユーザーに即座にフィードバックし、正しい設定への修正を促すために存在する。

**画面へのアクセス方法**：No.7 設定変更通知（`changedConfig` 関数）内で、DUBコンポーネントに対する設定適用が失敗した場合に自動的に表示される。ユーザーが直接アクセスすることはできない。

**主要な操作・処理内容**：
1. `changedConfig` 関数内の各設定パスの処理で、無効な値の検証を実行
2. `d.dubConfiguration`: 指定された設定名がDUBプロジェクトの利用可能な設定に含まれない場合
3. `d.dubArchType`: `setArchType` が失敗を返した場合
4. `d.dubBuildType`: `setBuildType` が失敗を返した場合
5. `d.dubCompiler`: `setCompiler` が失敗を返した場合
6. 各ケースで `rpc.window.showErrorMessage` により翻訳済みエラーメッセージをクライアントに表示

**画面遷移**：
- 遷移元：No.7 設定変更通知（changedConfig関数内の無効値検出時）
- 遷移先：なし（エラーメッセージ表示のみ、ユーザーアクションは不要）

**権限による表示制御**：なし。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 5 | 設定変更処理 | 主機能 | 無効な設定値（configuration, archType, buildType, compiler）が指定された場合にshowErrorMessageでエラーを表示する |
| 81 | 翻訳・多言語対応 | 補助機能 | エラーメッセージの翻訳にtranslate機能を使用する |

## 画面種別

LSP通知（`window/showMessage` によるエラーメッセージ表示）

## URL/ルーティング

LSPメソッド名: `window/showMessage`（サーバーからクライアントへの通知）

## 入出力項目

### 入力（内部パラメータ）

| 項目名 | 型 | 必須 | 説明 |
|--------|------|------|------|
| 設定パス | string | はい | 無効な値が検出された設定パス名 |
| 設定値 | string | はい | ユーザーが指定した無効な設定値 |

### 出力

| 項目名 | 種別 | 説明 |
|--------|------|------|
| エラーメッセージ | showErrorMessage | エディタのエラー通知としてユーザーに表示 |

## 表示項目

### エラーメッセージ一覧

| 設定パス | メッセージID | エラーメッセージ | 表示条件 |
|---------|------------|--------------|----------|
| d.dubConfiguration | d.ext.config.invalid.configuration | "Configuration '{0}' which is specified in the config is not available!" | 指定設定名が利用可能設定に含まれない |
| d.dubArchType | d.ext.config.invalid.archType | "Arch Type '{0}' which is specified in the config is not available!" | setArchType()が失敗を返す |
| d.dubBuildType | d.ext.config.invalid.buildType | "Build Type '{0}' which is specified in the config is not available!" | setBuildType()が失敗を返す |
| d.dubCompiler | d.ext.config.invalid.compiler | "Compiler '{0}' which is specified in the config is not available!" | setCompiler()が失敗を返す |

## イベント仕様

### 1-dubConfiguration無効値検出

1. `changedConfig` で `d.dubConfiguration` パスを処理
2. DubComponentから利用可能な設定一覧を取得
3. 設定が0件の場合: `showInformationMessage` で "No configurations available..." を表示
4. 指定された設定名が一覧に存在しない場合: `showErrorMessage` でエラー表示
5. 設定名が空の場合: 最初の設定をデフォルトとして適用

### 2-dubArchType無効値検出

1. `changedConfig` で `d.dubArchType` パスを処理
2. DubComponentが存在し、設定値が空でない場合
3. `backend.get!DubComponent.setArchType(config.d.dubArchType)` を実行
4. 戻り値がfalseの場合: `showErrorMessage` でエラー表示

### 3-dubBuildType無効値検出

1. `changedConfig` で `d.dubBuildType` パスを処理
2. DubComponentが存在し、設定値が空でない場合
3. `backend.get!DubComponent.setBuildType(config.d.dubBuildType)` を実行
4. 戻り値がfalseの場合: `showErrorMessage` でエラー表示

### 4-dubCompiler無効値検出

1. `changedConfig` で `d.dubCompiler` パスを処理
2. DubComponentが存在し、設定値が空でない場合
3. `backend.get!DubComponent.setCompiler(config.d.dubCompiler)` を実行
4. 戻り値がfalseの場合: `showErrorMessage` でエラー表示

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

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

本画面ではデータベースへのアクセスは発生しない。エラーメッセージの表示のみ。

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| - | - | - | なし |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|------------|------|--------------|----------|
| d.ext.config.invalid.configuration | error | "Configuration '{0}' which is specified in the config is not available!" | 無効な設定名 |
| d.ext.config.invalid.archType | error | "Arch Type '{0}' which is specified in the config is not available!" | 無効なアーキテクチャ |
| d.ext.config.invalid.buildType | error | "Build Type '{0}' which is specified in the config is not available!" | 無効なビルドタイプ |
| d.ext.config.invalid.compiler | error | "Compiler '{0}' which is specified in the config is not available!" | 無効なコンパイラ |
| d.ext.noConfigurations.project | info | "No configurations available for this project. Autocompletion could be broken!" | DUB設定0件 |

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| DubComponentが未初期化 | `backend.has!DubComponent` でチェックし、存在しない場合は設定変更をスキップ |
| 設定値が空文字列 | 無効値チェックを行わず、処理をスキップする |

## 備考

- エラーメッセージは `translate!` テンプレートにより多言語対応されている（en, de, fr, ja, ru）
- `showErrorMessage` は LSPの `window/showMessage` の `MessageType.Error` に対応する
- 設定値の検証はDubComponentの実メソッド（`setArchType`, `setBuildType`, `setCompiler`）の戻り値に依存する
- `d.dubConfiguration` のみ追加のバリデーションロジック（設定一覧の `canFind` チェック）を持つ

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | types.d | `source/served/types.d` | `Configuration.D` の `dubConfiguration`（102行目）、`dubArchType`（103行目）、`dubBuildType`（104行目）、`dubCompiler`（105行目）を確認 |

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | extension.d | `source/served/extension.d` | `changedConfig` 関数内の各設定パスのエラー処理（116-155行目） |

**主要処理フロー**:
1. **116-136行目**: `d.dubConfiguration` - 設定一覧取得 → canFindチェック → showErrorMessage
2. **121行目**: 設定0件時の `showInformationMessage`
3. **127-129行目**: `canFind(defaultConfig)` が false の場合に `showErrorMessage`
4. **138-142行目**: `d.dubArchType` - `setArchType` 失敗時に `showErrorMessage`
5. **144-148行目**: `d.dubBuildType` - `setBuildType` 失敗時に `showErrorMessage`
6. **150-154行目**: `d.dubCompiler` - `setCompiler` 失敗時に `showErrorMessage`

#### Step 3: 翻訳メッセージを確認する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | en.txt | `views/en.txt` | 88-91行目: d.ext.config.invalid.configuration / archType / buildType / compiler |
| 3-2 | en.txt | `views/en.txt` | 76行目: d.ext.noConfigurations.project |

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

```
changedConfig(target, paths, config)  [60行目]
    │
    └─ [paths走査 switch文]
           │
           ├─ "d.dubConfiguration"  [116行目]
           │      ├─ DubComponent.configurations
           │      ├─ [0件] → showInformationMessage("d.ext.noConfigurations.project")
           │      ├─ [canFind失敗] → showErrorMessage("d.ext.config.invalid.configuration")
           │      └─ [成功] → DubComponent.setConfiguration()
           │
           ├─ "d.dubArchType"  [138行目]
           │      └─ [setArchType失敗] → showErrorMessage("d.ext.config.invalid.archType")
           │
           ├─ "d.dubBuildType"  [144行目]
           │      └─ [setBuildType失敗] → showErrorMessage("d.ext.config.invalid.buildType")
           │
           └─ "d.dubCompiler"  [150行目]
                  └─ [setCompiler失敗] → showErrorMessage("d.ext.config.invalid.compiler")
```

### データフロー図

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

設定パス ──────────▶ changedConfig()                     showErrorMessage
設定値                   │                                 （window/showMessage）
                         ├─ DubComponent検証                    │
                         └─ set*メソッド実行              ├─ 無効設定エラー
                                │                         └─ 設定0件情報
                                └─ 戻り値チェック
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| extension.d | `source/served/extension.d` | ソース | changedConfig関数内のエラー検出・表示処理 |
| types.d | `source/served/types.d` | ソース | Configuration.D構造体（DUB設定フィールド） |
| translate.d | `source/served/utils/translate.d` | ソース | エラーメッセージの翻訳機能 |
| en.txt | `views/en.txt` | リソース | エラーメッセージ翻訳テキスト |
