# 帳票設計書 10-アクティブDUB設定レポート

## 概要

本ドキュメントは、serve-dのアクティブDUB設定レポート機能の設計を記述する。現在アクティブなDUBプロジェクトのビルド設定詳細を出力し、パッケージパス、ターゲット情報、コンパイルフラグ、リンカフラグ、ソースファイル、インポートパス等の全設定項目を含む帳票である。

### 本帳票の処理概要

アクティブDUB設定レポートは、現在アクティブなDUBインスタンスのルートパッケージのビルド設定全体を取得し、JSON形式で返す帳票である。コンパイラ、リンカ、ソースファイル、インポートパスなど、ビルドに関する全ての設定項目を網羅する。

**業務上の目的・背景**：D言語開発者がDUBプロジェクトの現在のビルド設定を確認し、ビルドの問題を診断したり、IDE連携ツールがビルド設定に基づいて動作したりするための基盤情報を提供する。コンパイルフラグ、インポートパス、ソースファイル一覧など、ビルドシステムの全設定を一元的に参照できる。

**帳票の利用シーン**：デバッグ時にビルド設定を確認する場合、IDE拡張がビルド設定に基づいてコード補完やエラーチェックを行う場合、およびビルドの問題を調査する場合に使用される。

**主要な出力内容**：
1. パッケージパス（packagePath）
2. パッケージ名（packageName）
3. レシピパス（recipePath）
4. ターゲットパス・名前・タイプ（targetPath, targetName, targetType）
5. 作業ディレクトリ（workingDirectory）
6. メインソースファイル（mainSourceFile）
7. コンパイルフラグ群（dflags, lflags, libs, linkerFiles）
8. ソースファイル一覧（sourceFiles, copyFiles）
9. バージョン定義（versions, debugVersions）
10. インポートパス群（importPaths, stringImportPaths, importFiles, stringImportFiles）
11. ビルドコマンド群（pre/postGenerateCommands, pre/postBuildCommands, pre/postRunCommands）
12. ビルドオプション・要件（buildOptions, buildRequirements）

**帳票の出力タイミング**：served/getActiveDubConfigリクエストを受信した際にレスポンスとして返却される。

**帳票の利用者**：D言語開発者（ビルド設定の確認・診断を行う開発者）、IDE拡張機能

## 帳票種別

ビルド情報レポート（LSPレスポンス）

## 利用画面

| 画面No | 画面名 | URL/ルーティング | 出力操作 |
|--------|--------|-----------------|---------|
| - | ビルド設定パネル | `served/getActiveDubConfig` | 設定確認リクエスト時 |

## 出力形式

### 基本仕様

| 項目 | 内容 |
|-----|------|
| ファイル形式 | JSON-RPC（LSPプロトコル） |
| 用紙サイズ | N/A（デジタル出力） |
| 向き | N/A |
| ファイル名 | N/A（ストリーム出力） |
| 出力方法 | served/getActiveDubConfigレスポンス |
| 文字コード | UTF-8 |

### PDF固有設定

N/A

### Excel固有設定

N/A

## 帳票レイアウト

### レイアウト概要

StringMap!JsonValue（文字列キーのJSONマップ）として全ビルド設定を出力する。

```
┌──────────────────────────────────────────────┐
│  StringMap!JsonValue                          │
├──────────────────────────────────────────────┤
│  packagePath: string                          │
│  packageName: string                          │
│  recipePath: string                           │
│  targetPath: string                           │
│  targetName: string                           │
│  targetType: string                           │
│  workingDirectory: string                     │
│  mainSourceFile: string                       │
│  dflags: string[]                             │
│  lflags: string[]                             │
│  libs: string[]                               │
│  linkerFiles: string[]                        │
│  sourceFiles: string[]                        │
│  copyFiles: string[]                          │
│  versions: string[]                           │
│  debugVersions: string[]                      │
│  importPaths: string[]                        │
│  stringImportPaths: string[]                  │
│  importFiles: string[]                        │
│  stringImportFiles: string[]                  │
│  preGenerateCommands: string[]                │
│  postGenerateCommands: string[]               │
│  preBuildCommands: string[]                   │
│  postBuildCommands: string[]                  │
│  preRunCommands: string[]                     │
│  postRunCommands: string[]                    │
│  buildOptions: string[]                       │
│  buildRequirements: string[]                  │
└──────────────────────────────────────────────┘
```

### ヘッダー部

N/A（リクエストにパラメータなし）

### 明細部

| No | 項目名 | 説明 | データ取得元 | 表示形式 | 列幅 |
|----|-------|------|-------------|---------|-----|
| 1 | packagePath | パッケージのルートディレクトリパス | rootPackageBuildSettings().packagePath | 文字列 | - |
| 2 | packageName | パッケージ名 | rootPackageBuildSettings().packageName | 文字列 | - |
| 3 | recipePath | dub.jsonまたはdub.sdlのパス | rootPackageBuildSettings().recipePath | 文字列 | - |
| 4 | targetPath | ビルド出力先パス | rootPackageBuildSettings().targetPath | 文字列 | - |
| 5 | targetName | ビルド出力名 | rootPackageBuildSettings().targetName | 文字列 | - |
| 6 | targetType | ターゲットタイプ（executable等） | rootPackageBuildSettings().targetType | 文字列 | - |
| 7 | workingDirectory | 作業ディレクトリ | rootPackageBuildSettings().workingDirectory | 文字列 | - |
| 8 | mainSourceFile | メインソースファイル | rootPackageBuildSettings().mainSourceFile | 文字列 | - |
| 9 | dflags | Dコンパイラフラグ | rootPackageBuildSettings().dflags | 文字列配列 | - |
| 10 | lflags | リンカフラグ | rootPackageBuildSettings().lflags | 文字列配列 | - |
| 11 | libs | リンクするライブラリ | rootPackageBuildSettings().libs | 文字列配列 | - |
| 12 | linkerFiles | リンカに渡すファイル | rootPackageBuildSettings().linkerFiles | 文字列配列 | - |
| 13 | sourceFiles | ソースファイル一覧 | rootPackageBuildSettings().sourceFiles | 文字列配列 | - |
| 14 | copyFiles | コピーするファイル一覧 | rootPackageBuildSettings().copyFiles | 文字列配列 | - |
| 15 | versions | バージョン定義 | rootPackageBuildSettings().versions | 文字列配列 | - |
| 16 | debugVersions | デバッグバージョン定義 | rootPackageBuildSettings().debugVersions | 文字列配列 | - |
| 17 | importPaths | インポートパス | rootPackageBuildSettings().importPaths | 文字列配列 | - |
| 18 | stringImportPaths | 文字列インポートパス | rootPackageBuildSettings().stringImportPaths | 文字列配列 | - |
| 19 | importFiles | インポートファイル | rootPackageBuildSettings().importFiles | 文字列配列 | - |
| 20 | stringImportFiles | 文字列インポートファイル | rootPackageBuildSettings().stringImportFiles | 文字列配列 | - |
| 21 | preGenerateCommands | 生成前コマンド | rootPackageBuildSettings().preGenerateCommands | 文字列配列 | - |
| 22 | postGenerateCommands | 生成後コマンド | rootPackageBuildSettings().postGenerateCommands | 文字列配列 | - |
| 23 | preBuildCommands | ビルド前コマンド | rootPackageBuildSettings().preBuildCommands | 文字列配列 | - |
| 24 | postBuildCommands | ビルド後コマンド | rootPackageBuildSettings().postBuildCommands | 文字列配列 | - |
| 25 | preRunCommands | 実行前コマンド | rootPackageBuildSettings().preRunCommands | 文字列配列 | - |
| 26 | postRunCommands | 実行後コマンド | rootPackageBuildSettings().postRunCommands | 文字列配列 | - |
| 27 | buildOptions | ビルドオプション | rootPackageBuildSettings().buildOptions | 文字列配列 | - |
| 28 | buildRequirements | ビルド要件 | rootPackageBuildSettings().buildRequirements | 文字列配列 | - |

### フッター部

N/A

## 出力条件

### 抽出条件

| 条件名 | 説明 | 必須 |
|-------|------|-----|
| activeInstance有効 | activeInstanceが設定されていること | Yes |
| DUBコンポーネント有効 | activeInstance.has!DubComponentがtrue | Yes |

### ソート順

N/A（単一レコード出力）

### 改ページ条件

N/A

## データベース参照仕様

### 参照テーブル一覧

本帳票はデータベースを使用しない。DUBコンポーネントからビルド設定を取得する。

| テーブル名 | 用途 | 結合条件 |
|-----------|------|---------|
| N/A | - | - |

### テーブル別参照項目詳細

N/A

## 計算仕様

### 計算項目一覧

| 項目名 | 計算式 | 端数処理 | 備考 |
|-------|-------|---------|------|
| 全設定項目 | rootPackageBuildSettings().toJsonValue.get!(StringMap!JsonValue) | - | ビルド設定構造体全体をJSON化して返却（行201） |

## 処理フロー

### 出力フロー

```mermaid
flowchart TD
    A[served/getActiveDubConfigリクエスト受信] --> B{activeInstance有効?}
    B -->|No| Z1[空のStringMap返却]
    B -->|Yes| C{DubComponent有効?}
    C -->|No| Z1
    C -->|Yes| D[DubComponent.rootPackageBuildSettings取得]
    D --> E[toJsonValueでJSON化]
    E --> F[StringMap!JsonValueにキャスト]
    F --> G[レスポンス返却]
```

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 表示メッセージ | 対処方法 |
|----------|---------|--------------|---------|
| インスタンス未設定 | activeInstanceがnull | なし | StringMap!JsonValue.init返却 |
| DUB未設定 | DubComponentが利用不可 | なし | StringMap!JsonValue.init返却 |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定データ件数 | 1レコード（28フィールド） |
| 目標出力時間 | DUBコンポーネントのプロパティ参照で即時応答 |
| 同時出力数上限 | 制限なし |

## セキュリティ考慮事項

- ビルド設定情報にはファイルパスやビルドコマンドが含まれるため、信頼できるクライアントのみがアクセスすべき
- 外部リソースへのアクセスは行わない

## 備考

- static assertによるAPI保証チェック（行172-199）で、全28フィールドの型が保証されている
- 文字列型フィールド8個（packagePath〜mainSourceFile）と文字列配列型フィールド20個（dflags〜buildRequirements）
- rootPackageBuildSettingsの戻り値をtoJsonValueで動的JSON型に変換後、StringMap!JsonValueとしてレスポンスに含める
- DubComponent未設定時はStringMap!JsonValue.init（空マップ）を返却

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | dub.d | `source/served/commands/dub.d` | getActiveDubConfig関数のDocコメント（行132-165）: 返却されるJSONオブジェクトの全フィールド定義 |

**読解のコツ**: D言語の`static assert`はコンパイル時チェックであり、APIの型安全性を保証する。この関数ではrootPackageBuildSettingsの戻り値が期待する型を持つことを28個のstatic assertで検証している。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | dub.d | `source/served/commands/dub.d` | getActiveDubConfig関数（行166-202）: served/getActiveDubConfigハンドラ |

**主要処理フロー**:
1. **行169**: activeInstanceとDubComponentの有効性チェック
2. **行171**: DubComponent.rootPackageBuildSettings()で全ビルド設定取得
3. **行172-199**: 28個のstatic assertでAPI型保証
4. **行201**: toJsonValue.get!(StringMap!JsonValue)でJSON形式に変換して返却

#### Step 3: API保証を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | dub.d | `source/served/commands/dub.d` | static assertブロック（行172-199）: 文字列型8フィールドと文字列配列型20フィールドの型チェック |

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

```
getActiveDubConfig()                              [dub.d:166]
    |
    +-- activeInstance チェック                     [dub.d:169]
    +-- activeInstance.has!DubComponent              [dub.d:169]
    +-- activeInstance.get!DubComponent              [dub.d:171]
    +-- DubComponent.rootPackageBuildSettings()      [dub.d:171]
    +-- [static assert x 28]                        [dub.d:172-199]
    +-- ret.toJsonValue                             [dub.d:201]
    +-- .get!(StringMap!JsonValue)                   [dub.d:201]
```

### データフロー図

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

getActiveDubConfigリクエスト ──> getActiveDubConfig()     ──> StringMap!JsonValue

DubComponent ────────────────> rootPackageBuildSettings() ──> ビルド設定構造体
(アクティブインスタンス)

ビルド設定構造体 ────────────> toJsonValue()              ──> JsonValue
                               .get!(StringMap!JsonValue)     StringMap!JsonValue
                                                              (28フィールドのJSONマップ)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| dub.d | `source/served/commands/dub.d` | ソース | アクティブDUB設定レポートの主処理（getActiveDubConfig） |
| protoext.d | `source/served/lsp/protoext.d` | ソース | LSP拡張プロトコル型定義 |
| types.d | `source/served/types.d` | ソース | 共通型定義 |
| extension.d | `source/served/extension.d` | ソース | LSPサーバー拡張機能 |
