# 機能設計書 70-Rust言語サポート

## 概要

本ドキュメントは、Doom EmacsにおけるRust言語サポートモジュールの機能設計を記述する。本モジュールはrusticをベースとしたRust開発環境を提供し、Cargo統合、LSP連携、Orgモード統合などの機能を含む。

### 本機能の処理概要

Rust言語サポートモジュールは、rusticパッケージをベースとしてRustコードの編集サポート、Cargo操作、テスト実行、LSP連携などの機能を提供する。rust-analyzer LSPとの統合により、高度なコード支援機能を利用できる。

**業務上の目的・背景**：
Rustはシステムプログラミングやパフォーマンスクリティカルなアプリケーション開発で急速に採用が進んでいる言語である。本モジュールにより、Rust開発に必要な機能を統合的に提供し、効率的な開発環境を実現する。

**機能の利用シーン**：
- Rustソースファイルの編集
- Cargoコマンド実行（build, test, run, clippy等）
- rust-analyzerによる補完・診断
- Org BabelでのRustコード実行

**主要な処理内容**：
1. rustic-modeによる編集サポート
2. Cargo操作コマンド（build, test, run, check, clippy, fmt等）
3. LSP連携（rust-analyzer / lsp-mode or eglot）
4. Org Babel統合（org-babel-execute:rust）
5. Tree-sitter連携（+tree-sitter時）

**関連システム・外部連携**：
- rustic：Rustメジャーモード
- rust-mode：ベースモード
- rust-analyzer：LSPサーバー
- Cargo：ビルドツール

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

## 関連画面

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

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | - | - | コード編集、Cargo実行 |

## 機能種別

言語サポート / ビルド統合 / LSP連携

## 入力仕様

### 入力パラメータ

本モジュールに固有のカスタム変数は定義されていないが、rusticパッケージの変数を設定する。

### 入力データソース

- Rustソースファイル（.rs）
- Cargo.tomlプロジェクト設定

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| compilation-buffer | buffer | Cargo実行結果 |

### 出力先

- *rustic-compilation* バッファ
- *cargo-run* バッファ

## 処理フロー

### 処理シーケンス

```
1. .rs ファイルオープン
   └─ rustic-mode 有効化

2. モード初期化
   ├─ docsets設定
   ├─ popup-rule設定
   └─ LSP起動（-lsp以外）

3. Cargo操作
   ├─ rustic-cargo-build
   ├─ rustic-cargo-test
   ├─ rustic-cargo-run
   └─ rustic-cargo-clippy
```

### フローチャート

```mermaid
flowchart TD
    A[.rs ファイルオープン] --> B[rustic-mode 有効化]
    B --> C[docsets設定]
    C --> D{-lsp フラグ?}
    D -->|No| E{+eglot フラグ?}
    D -->|Yes| F[LSPなし]
    E -->|Yes| G[rustic-lsp-client = eglot]
    E -->|No| H[rustic-lsp-client = lsp-mode]
    G --> I[rustic-setup-lsp]
    H --> I
    F --> J[編集開始]
    I --> J
    J --> K{Cargo操作?}
    K -->|build| L[rustic-cargo-build]
    K -->|test| M[rustic-cargo-test]
    K -->|run| N[rustic-cargo-run]
    K -->|clippy| O[rustic-cargo-clippy]
    L --> J
    M --> J
    N --> J
    O --> J
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | LSPクライアント選択 | +eglot時はeglot、それ以外はlsp-mode | -lspフラグがない時 |
| BR-02 | フォーマット無効化 | rustic-format-trigger = nil（:editor formatに委譲） | 常時 |
| BR-03 | Babel統合 | org-babel-execute:rustをorg-babel-execute:rusticにエイリアス | org-src-lang-modes |
| BR-04 | clippy統合 | -lsp時はflycheck-checkersにrustic-clippyを追加 | -lsp フラグ時 |

### 計算ロジック

特になし。

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

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

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | Cargo未インストール | cargoコマンドが見つからない | doctor.elで検出 |
| - | rust-analyzer未インストール | LSPサーバーが見つからない | 警告表示 |

### リトライ仕様

特になし。

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

該当なし。

## パフォーマンス要件

- rust-analyzer署名表示の最適化（lsp--hover-saved-bounds = nil）

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

- cargo auditによるセキュリティ監査機能を提供

## 備考

- -lspフラグでLSPを無効化
- +tree-sitterフラグでrust-ts-mode相当の機能を使用

---

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

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

### 推奨読解順序

#### Step 1: rustic設定を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | config.el | `modules/lang/rust/config.el` | rustic use-package（17-114行目） |

**読解のコツ**:
- `rustic-lsp-client = nil`：初期化時は無効、後で設定
- `rustic-format-trigger = nil`：:editor formatに委譲

#### Step 2: LSP設定を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | config.el | `modules/lang/rust/config.el` | LSP設定分岐（52-89行目） |

**主要処理フロー**:
- **52-54行目**: -lsp時のflycheck設定
- **55-58行目**: LSPクライアント選択
- **59行目**: rustic-setup-lspフック追加
- **61-89行目**: lsp-mode固有の最適化

#### Step 3: Cargoキーバインドを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | config.el | `modules/lang/rust/config.el` | map! localleader（98-114行目） |

**主要処理フロー**:
- **100-111行目**: buildプレフィックス（a/b/B/c/C/d/D/f/n/o/r）
- **112-114行目**: testプレフィックス（a/t）

#### Step 4: autoload関数を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | rust.el | `modules/lang/rust/autoload/rust.el` | カスタムコマンド |

**主要処理フロー**:
- **4-6行目**: +rust-cargo-project-p（プロジェクト検出）
- **13-17行目**: +rust/cargo-audit（セキュリティ監査）

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

```
rustic-mode
    │
    ├─ set-docsets! "Rust"
    │
    ├─ set-popup-rule! ("*rustic-compilation", "*cargo-run")
    │
    ├─ [LSP有効時]
    │      │
    │      ├─ rustic-lsp-client設定
    │      │      ├─ eglot
    │      │      └─ lsp-mode
    │      │
    │      └─ rustic-setup-lsp
    │
    └─ [localleader]
           │
           ├─ +rust/cargo-audit
           ├─ rustic-cargo-build
           ├─ rustic-cargo-bench
           ├─ rustic-cargo-check
           ├─ rustic-cargo-clippy
           ├─ rustic-cargo-build-doc
           ├─ rustic-cargo-doc
           ├─ rustic-cargo-fmt
           ├─ rustic-cargo-new
           ├─ rustic-cargo-outdated
           ├─ rustic-cargo-run
           ├─ rustic-cargo-test
           └─ rustic-cargo-current-test
```

### データフロー図

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

.rs ファイル ───▶ rustic-mode ───▶ シンタックスハイライト
                      │
                      ├─ LSP連携 ───▶ 補完・診断
                      │      │
                      │      └─ rust-analyzer
                      │
                      └─ Cargo ───▶ ビルド/テスト結果
                             │
                             └─ *rustic-compilation*
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| config.el | `modules/lang/rust/config.el` | ソース | メイン設定 |
| rust.el | `modules/lang/rust/autoload/rust.el` | ソース | cargo-audit等 |
| compat.el | `modules/lang/rust/autoload/compat.el` | ソース | 互換レイヤー |
| doctor.el | `modules/lang/rust/doctor.el` | 診断 | Cargo/rustc診断 |
| packages.el | `modules/lang/rust/packages.el` | 設定 | 依存パッケージ定義 |
