# 画面設計書 45-アーキテクチャ一覧取得（served/listArchTypes）

## 概要

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

### 本画面の処理概要

本機能は、DUBプロジェクトで利用可能なビルドアーキテクチャ（例：x86、x86_64等）の一覧をクライアントに提供するカスタムLSPメソッドハンドラである。

**業務上の目的・背景**：DUBビルドシステムでは、ターゲットアーキテクチャを指定してビルドできる。開発者が異なるアーキテクチャ向けにビルドやテストを行う場合、まず利用可能なアーキテクチャの一覧を確認する必要がある。本機能はその一覧取得を担い、エディタUIでのアーキテクチャ選択を可能にする。他のlist系機能（No.42, No.48）と同様のパターンで実装されているが、`withMeaning`パラメータによりラベル付きの詳細情報も返却できる点が特徴的である。

**画面へのアクセス方法**：エディタのコマンドパレットやステータスバーからアーキテクチャ選択UIを開く際に、`served/listArchTypes`リクエストがserve-dに送信される。

**主要な操作・処理内容**：
1. クライアントから`served/listArchTypes`リクエストを受信する（オプションでwithMeaningパラメータ）
2. activeInstanceの存在とDubComponentの有無を確認する
3. DubComponentからextendedArchTypesを取得する
4. withMeaningがtrueの場合はArchType構造体（value + label）の配列、falseの場合は文字列配列で返却する

**画面遷移**：
- 遷移元：エディタのコマンドパレット、DUB設定管理フロー
- 遷移先：No.46 アーキテクチャ切り替え（served/switchArchType）- ユーザーがアーキテクチャを選択した場合
- 関連画面：No.47 アーキテクチャ取得（served/getArchType）

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

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 44 | アーキテクチャ一覧取得 (served/listArchTypes) | 主機能 | 利用可能なアーキテクチャタイプ（x86, x86_64等）の一覧を返却する |

## 画面種別

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

## URL/ルーティング

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

## 入出力項目

### 入力パラメータ

| 項目名 | 型 | 必須 | 説明 |
|--------|-----|------|------|
| withMeaning | bool | いいえ（デフォルト: false） | trueの場合、ArchType構造体（value + label）で返却。falseの場合は文字列のみで返却 |

### 出力パラメータ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| （戻り値） | Variant!(string, ArchType)[] \| null | アーキテクチャ情報の配列。withMeaning=falseの場合はstring、trueの場合はArchType（value, label）。DubComponentが存在しない場合はnull |

### ArchType構造体

| フィールド名 | 型 | 説明 |
|-------------|-----|------|
| value | string | switchArchType呼び出し時に使用する値（DUBが使用するアーキテクチャ名） |
| label | string | UIに表示するラベル。nullの場合はvalueをそのまま表示 |

## 表示項目

クライアント側でアーキテクチャ選択UIとして表示される。

| 項目名 | 型 | 説明 |
|--------|-----|------|
| アーキテクチャ値 | string | DUBのアーキテクチャ名（例："x86", "x86_64"等） |
| アーキテクチャラベル | string | UI表示用ラベル（withMeaning=true時のみ） |

## イベント仕様

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

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

1. `activeInstance`がnullでないか確認する
2. `activeInstance.has!DubComponent`でDUBコンポーネントの有無を確認する
3. 上記いずれかがfalseの場合、`null`を返却する
4. `activeInstance.get!DubComponent.extendedArchTypes`で拡張アーキテクチャ情報を取得する
5. `params.withMeaning`がtrueの場合：
   - 各アーキテクチャをArchType(value, label)構造体として配列に格納
6. `params.withMeaning`がfalseの場合：
   - 各アーキテクチャのvalueのみを文字列として配列に格納
7. 結果をレスポンスとして返却する

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

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

本機能はデータベースへのアクセスを行わない。

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

## メッセージ仕様

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

## 例外処理

- activeInstanceがnullの場合：nullを返却
- DubComponentが存在しない場合：nullを返却

## 備考

- 他のlist系機能（No.42 listConfigurations, No.48 listBuildTypes）と異なり、`withMeaning`パラメータによりラベル付きの詳細情報を返却できる
- Variant!(string, ArchType)型により、withMeaning=falseの場合はstringのみ、trueの場合はArchType構造体が返却されるため、クライアント側でレスポンスの型を適切に処理する必要がある
- `extendedArchTypes`はDubComponentの拡張メソッドで、標準のDUBアーキテクチャタイプに加えてカスタムアーキテクチャも含む

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | protoext.d | `source/served/lsp/protoext.d` | 314-319行目のListArchTypesParams構造体。withMeaningフィールドがオプション |
| 1-2 | protoext.d | `source/served/lsp/protoext.d` | 323-329行目のArchTypeInfo構造体（value, label） |
| 1-3 | protoext.d | `source/served/lsp/protoext.d` | 332-339行目のArchType構造体（@serdeFallbackStruct付き）。レスポンスで使用 |

**読解のコツ**: `ArchTypeInfo`はドキュメンテーション用の構造体で、実際のレスポンスでは`ArchType`構造体が使用される。`Variant!(string, ArchType)`型により、各要素がstringまたはArchTypeのいずれかとなる。

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

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

**主要処理フロー**:
1. **49行目**: `@protocolMethod("served/listArchTypes")`デコレータ
2. **50行目**: `Variant!(string, ArchType)[] listArchTypes(ListArchTypesParams params)`関数定義
3. **51行目**: `auto ret = appender!(typeof(return))`で結果用バッファを初期化
4. **53-54行目**: `activeInstance`とDubComponentの存在確認、なければnullを返却
5. **57行目**: `activeInstance.get!DubComponent.extendedArchTypes`で拡張アーキテクチャ情報を取得
6. **59-64行目**: `withMeaning`がtrueの場合、ArchType(value, label)として追加
7. **65-71行目**: `withMeaning`がfalseの場合、valueのみstringとして追加
8. **73行目**: `ret.data`を返却

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

```
served/listArchTypes (LSPリクエスト)
    │
    └─ listArchTypes(ListArchTypesParams) [dub.d:50]
           │
           ├─ activeInstance チェック [null判定]
           │
           ├─ activeInstance.has!DubComponent [存在確認]
           │
           └─ activeInstance.get!DubComponent.extendedArchTypes [アーキテクチャ取得]
                  │
                  ├─ [withMeaning=true] ArchType(value, label)として構築
                  │
                  └─ [withMeaning=false] value文字列のみ抽出
```

### データフロー図

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

served/listArchTypes          ──▶ listArchTypes()                 ──▶ Variant!(string,ArchType)[]
ListArchTypesParams               │                                    | null
  withMeaning: bool               ├─ activeInstance確認
                                  │
                                  ├─ DubComponent.extendedArchTypes
                                  │
                                  └─ withMeaning分岐
                                     ├─ true  → ArchType[] (value+label)
                                     └─ false → string[] (valueのみ)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| dub.d | `source/served/commands/dub.d` | ソース | listArchTypes関数の実装（49-74行目） |
| protoext.d | `source/served/lsp/protoext.d` | ソース | ListArchTypesParams, ArchTypeInfo, ArchType構造体の定義（314-339行目） |
| extension.d | `source/served/extension.d` | ソース | dub.dモジュールのpublic import・LSPルーター登録 |
| types.d | `source/served/types.d` | ソース | activeInstanceの定義（463-474行目） |
