# 画面設計書 32-設定取得

## 概要

本ドキュメントは、Lua Language ServerのLSPコマンド「設定取得（lua.getConfig）」の画面設計書です。

### 本画面の処理概要

この画面（LSPコマンド）は、エディタからLua Language Serverの現在の設定値を取得するための機能を提供します。

**業務上の目的・背景**：
開発者やエディタ拡張機能が、Language Serverの現在の設定状態を確認する必要がある場面があります。例えば、診断設定の確認、ワークスペースライブラリパスの取得、補完設定の確認など、プログラム的に設定値を取得することで、エディタUIへの反映や条件分岐処理が可能になります。本コマンドは、指定されたキーに対応する設定値をJSON形式で返却し、エディタ側での設定状態の可視化や連携処理を実現します。

**画面へのアクセス方法**：
本コマンドは、以下の方法でトリガーされます：
- LSPクライアント（VS Code等）からの `workspace/executeCommand` リクエストで `lua.getConfig` コマンドを実行
- エディタ拡張機能からのAPI呼び出し
- デバッグや診断目的でのコマンド実行

**主要な操作・処理内容**：
1. クライアントの準備完了を待機（client:isReady()）
2. 設定取得要求（uri, key）を受信
3. config.get()を呼び出して設定値を取得
4. 設定値をレスポンスとして返却

**画面遷移**：
- 入力元：エディタ拡張機能、デバッグツール
- 出力先：呼び出し元に設定値を返却

**権限による表示制御**：
設定取得は読み取り専用の操作であり、特別な権限制御はありません。スコープに応じて、ワークスペース設定またはグローバル設定が返却されます。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 72 | 設定管理 | 主機能 | 現在のLua設定を取得するコマンド処理 |

## 画面種別

LSPコマンド（非同期処理）

## URL/ルーティング

- LSPコマンド名: `lua.getConfig`
- プロトコル: `workspace/executeCommand`
- ハンドラファイル: `script/core/command/getConfig.lua`

## 入出力項目

### 入力パラメータ

| 項目名 | 型 | 必須 | 説明 |
|--------|-----|------|------|
| data | table | Yes | 設定取得パラメータの配列 |
| data[1].uri | uri | Yes | 対象ファイルのURI（スコープ特定用） |
| data[1].key | string | Yes | 取得する設定キー（例: `Lua.diagnostics.enable`） |

### 出力

| 項目名 | 型 | 説明 |
|--------|-----|------|
| result | any | 指定されたキーの設定値 |

## 表示項目

本機能はコマンド処理であり、直接的なUI表示項目はありません。

## イベント仕様

### 1-設定取得実行

1. **リクエスト受信**: クライアントから `workspace/executeCommand` でコマンドを受信
2. **パラメータ解析**: data[1]からuri, keyを抽出
3. **準備待機**: クライアントの準備完了（client:isReady()）を待機
4. **設定取得**: config.get(uri, key)を呼び出し
5. **結果返却**: 設定値をレスポンスとして返却

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

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

本機能は読み取り専用であり、データの更新は行いません。

| 操作（イベント） | 対象 | 操作種別 | 概要 |
|----------------|------|---------|------|
| 設定取得 | scope.config.now | SELECT | メモリ上の現在設定を参照 |

## メッセージ仕様

本機能は単純な値返却のため、特定のメッセージを出力しません。

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| クライアント未準備 | 0.1秒間隔でリトライ |
| 不明な設定キー | デフォルト値を返却（template[key].default） |
| スコープ解決失敗 | fallbackスコープから取得 |

## 備考

- 設定値はスコープに応じて異なる値が返却されることがあります
- override > folder > linked > fallback の優先順位でスコープが解決されます
- 存在しないキーに対してはテンプレートのデフォルト値が返却されます

---

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

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

### 推奨読解順序

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

まず、設定管理で使用されるデータ構造を理解します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | config.lua | `script/config/config.lua` | 設定の内部表現（scope.config.now/raw）を理解 |
| 1-2 | scope.lua | `script/workspace/scope.lua` | スコープの階層構造を理解 |

**読解のコツ**: 設定は`scope`オブジェクトに紐づいて管理されます。`config.now`が処理済みの値、`config.raw`が生の値です。

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

コマンドの起点となるファイルを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | getConfig.lua | `script/core/command/getConfig.lua` | コマンドのメイン処理（6-13行目） |

**主要処理フロー**:
1. **7-8行目**: パラメータからuri, keyを抽出
2. **9-11行目**: クライアントの準備完了を待機
3. **12行目**: config.get(uri, key)を呼び出し

#### Step 3: 設定取得処理を理解する

config.get()の内部実装を追跡します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | config.lua | `script/config/config.lua` | get関数（157-170行目）の実装 |
| 3-2 | config.lua | `script/config/config.lua` | getScope関数（31-51行目）の実装 |

**主要処理フロー**:
- **161行目**: スコープを解決
- **162行目**: scope.config.nowから値を取得
- **163-165行目**: nilの場合はテンプレートのデフォルト値を使用

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

```
workspace/executeCommand (lua.getConfig)
    │
    └─ getConfig.lua (エントリーポイント)
           │
           ├─ await.sleep() (クライアント準備待機)
           │
           └─ config.get(uri, key)
                  │
                  ├─ getScope(uri, key)
                  │      ├─ scope.override
                  │      ├─ scope.getFolder(uri)
                  │      ├─ scope.getLinkedScope(uri)
                  │      └─ scope.fallback
                  │
                  └─ getNowTable(scp)[key]
                         └─ scp:get('config.now')
```

### データフロー図

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

{ uri, key } ───▶ getConfig.lua ───▶ 設定値
                        │
                        ▼
                  config.get(uri, key)
                        │
                        ▼
                  getScope(uri, key)
                        │
                        ▼
                  scope.config.now[key]
                        │
                        ▼
                  (value or default)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| getConfig.lua | `script/core/command/getConfig.lua` | ソース | コマンドエントリーポイント |
| config.lua | `script/config/config.lua` | ソース | 設定管理モジュール |
| template.lua | `script/config/template.lua` | ソース | 設定項目のテンプレート定義 |
| scope.lua | `script/workspace/scope.lua` | ソース | スコープ管理 |
| client.lua | `script/client.lua` | ソース | クライアント準備状態確認 |
| await.lua | `script/await.lua` | ソース | 非同期処理ユーティリティ |
