# 機能設計書 46-Rust

## 概要

本ドキュメントは、space-vimにおけるRust言語サポート機能の設計仕様を定義する。本機能はrust.vimプラグインを統合し、Rustファイル編集時の構文ハイライト、自動フォーマット、Tagbar連携等の開発支援機能を提供する。

### 本機能の処理概要

本機能は、Rustファイル（.rs）およびCargo設定ファイル（Cargo.toml）の編集時に、Rust開発に必要な言語サポート機能を提供する。rust.vimプラグインを中心として、rustfmtによる自動フォーマット、Tagbarでのシンボル表示等を実現する。

**業務上の目的・背景**：RustはMozillaが開発したシステムプログラミング言語であり、メモリ安全性と高パフォーマンスを両立する。WebAssembly、システムプログラミング、CLI ツール開発で採用が増加している。Vim上でのRust開発を効率化し、rustfmtによる一貫したコードスタイルを強制することで、コード品質の向上を実現する。

**機能の利用シーン**：
- Rustクレート・モジュールの作成・編集
- Cargo.toml の編集
- rustfmtによる自動フォーマット（保存時）
- Tagbarによるシンボル一覧表示

**主要な処理内容**：
1. Rustファイルタイプ検出時のrust.vim遅延読み込み
2. TOML構文サポートの有効化（Cargo.toml用）
3. rustfmt自動実行設定の適用
4. Tagbar用のRustシンボル設定
5. 構文ハイライトの適用

**関連システム・外部連携**：
- rust-lang/rust.vim プラグイン
- cespare/vim-toml プラグイン
- rustfmt（フォーマッター）
- Tagbar（シンボル一覧表示）

**権限による制御**：特になし（全ユーザー共通機能）

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 6 | Tagbar（タグバー） | 参照画面 | Rustシンボル（関数、構造体、トレイト等）の一覧表示 |
| 8 | 補完ポップアップ | 参照画面 | Rustコードの補完候補表示（racer連携時） |

## 機能種別

言語サポート / 構文ハイライト / フォーマット / ナビゲーション

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| g:rustfmt_autosave | Number | No | 保存時の自動フォーマット | 0または1 |

### 入力データソース

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

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 構文ハイライト | Highlight | Rust構文の色分け表示 |
| フォーマット済みコード | String | rustfmt整形後のコード |
| タグ情報 | List | Tagbar用シンボル情報 |

### 出力先

- エディタバッファ（構文ハイライト、フォーマット）
- Tagbarウィンドウ（シンボル一覧）

## 処理フロー

### 処理シーケンス

```
1. Rust/TOMLファイルオープン
   └─ ファイルタイプ検出

2. TOML構文サポート（vim-toml）
   └─ 即時読み込み

3. rust.vim プラグイン読み込み判定
   └─ speed_up_via_timer による遅延読み込み or 即時読み込み

4. User rust.vim autocmd 発火
   └─ spacevim#autocmd#rust#Init() 呼び出し

5. Tagbar設定適用
   └─ g:tagbar_type_rust 設定

6. 保存時フォーマット設定
   └─ g:rustfmt_autosave = 1
```

### フローチャート

```mermaid
flowchart TD
    A[Rust/TOMLファイルオープン] --> B{ファイルタイプ?}
    B -->|.toml| C[vim-toml読み込み]
    B -->|.rs| D{speed_up_via_timer?}
    D -->|Yes| E[遅延読み込み登録]
    D -->|No| F[即時読み込み]
    E --> G[User rust.vim イベント]
    F --> G
    G --> H[spacevim#autocmd#rust#Init]
    H --> I[Tagbar設定適用]
    I --> J[rustfmt_autosave設定]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-46-01 | 遅延読み込みルール | speed_up_via_timer設定時はrustファイルタイプ検出まで読み込みを遅延 | プラグイン登録時 |
| BR-46-02 | TOML先行読み込み | Cargo.toml用にvim-tomlは常に即時読み込み | パッケージ登録時 |
| BR-46-03 | 自動フォーマットルール | 保存時にrustfmtを自動実行 | g:rustfmt_autosave=1 |

### 計算ロジック

該当なし

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

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

本機能はデータベース操作を行わない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | rustfmt未インストール | rustfmtが見つからない | rustup component add rustfmt 実行案内 |
| - | Rustツールチェーン未インストール | rustcが見つからない | Rustインストール案内 |

### リトライ仕様

該当なし

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

該当なし

## パフォーマンス要件

- rust.vimの遅延読み込みにより起動時間を最適化

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

- 外部ツール（rustfmt）はローカル環境のものを使用

## 備考

- vim-toml はCargo.tomlのTOML構文サポートのために含まれる
- racer連携による補完機能は別途設定が必要

---

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

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

### 推奨読解順序

#### Step 1: プラグイン登録を理解する

rust.vimプラグインの登録方法を把握する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | packages.vim | `layers/+lang/rust/packages.vim` | プラグイン登録 |

**読解のコツ**: vim-tomlは常に読み込まれ、rust.vimは条件付きで遅延読み込みされる。

**主要処理フロー**:
1. **1-2行目**: vim-toml 即時読み込み（Cargo.toml用）
2. **4-8行目**: 条件付きrust.vim登録（遅延 or 即時）
3. **9行目**: `autocmd! User rust.vim` でInit関数を呼び出し

#### Step 2: 初期化処理を理解する

rust.vimロード後の初期化処理を把握する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | rust.vim | `core/autoload/spacevim/autocmd/rust.vim` | 初期化関数の実装 |

**主要処理フロー**:
- **1-14行目**: `spacevim#autocmd#rust#Init()` - 初期化処理
- **2-13行目**: Tagbar用のRust設定（ctagstype、kinds定義）
- **15行目**: `let g:rustfmt_autosave = 1` - 保存時自動フォーマット有効化

#### Step 3: 遅延読み込み処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | defer.vim | `core/autoload/spacevim/defer.vim` | 遅延読み込み実装 |

**主要処理フロー**:
- **73-75行目**: `spacevim#defer#rust()` 関数でrust.vim読み込み

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

```
Rust/TOMLファイルオープン
    │
    ├─ layers/+lang/rust/packages.vim
    │      ├─ vim-toml 即時読み込み
    │      ├─ 条件判定（speed_up_via_timer）
    │      ├─ rust.vim 登録（遅延 or 即時）
    │      └─ autocmd User rust.vim 設定
    │
    ├─ rust.vim ロード後
    │      └─ User rust.vim イベント発火
    │             └─ spacevim#autocmd#rust#Init()
    │
    └─ core/autoload/spacevim/autocmd/rust.vim
           ├─ g:tagbar_type_rust 設定
           └─ g:rustfmt_autosave = 1
```

### データフロー図

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

Rustソースコード ───▶ rust.vim 読み込み ─────▶ ハイライト表示
     │                      │
     ├─────────────────▶ :w (保存) ────────────▶ rustfmt 自動実行
     │                      │                       │
     │                      │                       ▼
     │                      │                 フォーマット済みコード
     │
     └─────────────────▶ ctags ────────────────▶ Tagbar表示
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| packages.vim | `layers/+lang/rust/packages.vim` | 設定 | rust.vim/vim-tomlプラグイン登録 |
| config.vim | `layers/+lang/rust/config.vim` | 設定 | Rust設定（空ファイル） |
| rust.vim | `core/autoload/spacevim/autocmd/rust.vim` | ソース | 初期化・Tagbar設定 |
| defer.vim | `core/autoload/spacevim/defer.vim` | ソース | 遅延読み込み処理 |
