# 機能設計書 66-Terraform統合

## 概要

本ドキュメントは、Doom EmacsにおけるTerraform統合モジュールの機能設計を記述する。本モジュールはTerraform/OpenTofuの設定ファイル編集とコマンド実行機能を提供する。

### 本機能の処理概要

Terraform統合モジュールは、Terraformおよび互換ツール（Terragrunt、OpenTofu）の設定ファイル（.tf、.tofu）の編集サポートと、terraform/terragruntコマンドの実行機能を提供する。LSP連携、補完機能、Dashドキュメント参照も含む。

**業務上の目的・背景**：
Infrastructure as Code（IaC）の普及により、Terraformはクラウドインフラストラクチャのプロビジョニングにおいて標準的なツールとなっている。本モジュールにより、Terraform設定の編集と実行をEmacs内で効率的に行え、インフラ管理の生産性が向上する。

**機能の利用シーン**：
- Terraform設定ファイル（.tf）の編集
- OpenTofu設定ファイル（.tofu）の編集
- terraform/terragruntコマンドの実行（init, plan, apply等）
- リソース定義のシンタックスハイライト
- LSPによる補完・診断

**主要な処理内容**：
1. terraform-modeによるシンタックスハイライト
2. LSP連携（terraform-ls/tofu-ls）
3. compile-commandの自動設定
4. localleaderキーバインドによるコマンド実行
5. company-terraformによる補完
6. Dashドキュメント参照

**関連システム・外部連携**：
- terraform-mode：メジャーモード
- terraform-ls/tofu-ls：LSPサーバー
- company-terraform：補完バックエンド

**権限による制御**：
本機能に権限による制御は存在しない。

## 関連画面

本機能は画面を持たないエディタ機能である。

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | - | - | ファイル編集、コマンド実行 |

## 機能種別

言語サポート / コマンド実行 / LSP連携

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| +terraform-runner | string | No | 実行コマンド（デフォルト:terraform/terragrunt） | 実行可能コマンド |

### 入力データソース

- Terraform設定ファイル（.tf、.tofu）
- terraform/terragruntコマンド出力

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| compilation-buffer | buffer | コマンド実行結果 |

### 出力先

- *compilation* バッファ

## 処理フロー

### 処理シーケンス

```
1. .tf/.tofu ファイルオープン
   └─ terraform-mode 有効化

2. モード初期化
   ├─ compile-command 設定
   ├─ LSP起動（+lsp時）
   └─ company-terraform 設定（:completion company時）

3. 編集・コマンド実行
   ├─ シンタックスハイライト
   ├─ LSP補完・診断
   └─ localleaderコマンド
```

### フローチャート

```mermaid
flowchart TD
    A[.tf/.tofu ファイルオープン] --> B[terraform-mode 有効化]
    B --> C{terragrunt 利用可能?}
    C -->|Yes| D[+terraform-runner = terragrunt]
    C -->|No| E[+terraform-runner = terraform]
    D --> F[compile-command 設定]
    E --> F
    F --> G{+lsp フラグ?}
    G -->|Yes| H[LSP 起動]
    G -->|No| I[編集開始]
    H --> I
    I --> J{コマンド実行?}
    J -->|Yes| K[compile 実行]
    J -->|No| L[編集継続]
    K --> L
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | ランナー自動選択 | terragruntが利用可能な場合は優先使用 | executable-find "terragrunt" |
| BR-02 | LSPサーバー選択 | tofu-lsを優先、次にterraform-ls | +lsp フラグ有効時 |
| BR-03 | Dashドキュメント | Terraform docsetを設定 | モード有効化時 |

### 計算ロジック

特になし。

## データベース操作仕様

本機能はデータベースを使用しない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | コマンド未発見 | terraform/terragruntがPATHにない | doctor.elで検出 |
| - | LSPサーバー未発見 | terraform-ls/tofu-lsがない | 警告表示 |

### リトライ仕様

特になし。

## トランザクション仕様

該当なし。

## パフォーマンス要件

特になし。

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

- Terraform設定には機密情報（APIキー等）が含まれる可能性があるため、取り扱いに注意

## 備考

- +lspフラグでLSPサポートを有効化
- .tofuファイルもterraform-modeで編集可能

---

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

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

### 推奨読解順序

#### Step 1: 設定変数を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | config.el | `modules/tools/terraform/config.el` | +terraform-runner変数（3-4行目） |

**読解のコツ**:
- terragruntが利用可能ならそれを、なければterraformを使用

#### Step 2: terraform-mode設定を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | config.el | `modules/tools/terraform/config.el` | terraform-mode use-package（10-27行目） |

**主要処理フロー**:
- **11行目**: .tofuファイルの関連付け
- **13行目**: Dashドキュメント設定
- **14行目**: compile-commandの設定
- **16-18行目**: LSP設定（+lsp時）
- **20-27行目**: localleaderキーバインド

#### Step 3: company-terraform設定を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | config.el | `modules/tools/terraform/config.el` | company-terraform use-package（30-34行目） |

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

```
terraform-mode
    │
    ├─ set-docsets! "Terraform"
    │
    ├─ setq-hook! compile-command
    │
    ├─ [+lsp]
    │      ├─ set-eglot-client! ("tofu-ls" "terraform-ls")
    │      └─ add-hook lsp!
    │
    └─ [localleader]
           ├─ terraform apply
           ├─ terraform init
           ├─ terraform plan
           ├─ terraform validate
           ├─ terraform fmt
           └─ terraform destroy
```

### データフロー図

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

.tf/.tofu ファイル ───▶ terraform-mode ───▶ シンタックスハイライト
                              │
                              ├─ LSP連携 ───▶ 補完・診断
                              │
                              └─ コマンド実行 ───▶ *compilation*
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| config.el | `modules/tools/terraform/config.el` | ソース | メイン設定 |
| doctor.el | `modules/tools/terraform/doctor.el` | 診断 | コマンド存在確認 |
| packages.el | `modules/tools/terraform/packages.el` | 設定 | 依存パッケージ定義 |
