# 画面設計書 44-nim --version

## 概要

本ドキュメントは、Nimコンパイラの`nim --version`コマンドによるバージョン情報表示画面の設計書である。

### 本画面の処理概要

この画面は、Nimコンパイラのバージョン情報を表示するCLI画面である。コンパイラのバージョン、ターゲットプラットフォーム情報、コンパイル日時、gitハッシュ、有効なブートスイッチなどの詳細情報を出力する。

**業務上の目的・背景**：Nimコンパイラのバージョン情報は、バグ報告、環境構築の確認、互換性チェックなど多くの場面で必要となる。特に、コンパイラがどのようなオプションでビルドされたか（ブートスイッチ）を確認できることは、トラブルシューティングにおいて重要である。

**画面へのアクセス方法**：
- `nim --version` または `nim -v` コマンドを実行

**主要な操作・処理内容**：
1. コマンドライン引数の解析（`--version` または `-v` の検出）
2. バージョン情報の構築（バージョン番号、OS、CPU、コンパイル日時）
3. gitハッシュの取得と表示（存在する場合）
4. 有効なブートスイッチの一覧表示
5. 標準出力へのバージョン情報の表示
6. 終了コード0でのプログラム終了

**画面遷移**：
- この画面へ遷移：コマンドラインから直接アクセス
- この画面から遷移：なし（バージョン表示後にプログラム終了）

**権限による表示制御**：なし（すべてのユーザーが同一の情報を閲覧可能）

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 1 | Nimコンパイラ本体 | 主機能 | nimコンパイラのバージョン情報表示 |

## 画面種別

バージョン情報表示（情報出力）

## URL/ルーティング

```
nim --version
nim -v
```

## 入出力項目

### 入力項目

| 項目名 | 型 | 必須 | 説明 |
|--------|-----|------|------|
| --version | フラグ | - | バージョン表示を要求するオプション |
| -v | フラグ | - | バージョン表示を要求するオプション（短縮形） |

### 出力項目

| 項目名 | 説明 |
|--------|------|
| バージョン情報 | Nimコンパイラのバージョン番号（例：2.0.0） |
| ターゲットOS | コンパイラのターゲットOS（例：linux） |
| ターゲットCPU | コンパイラのターゲットCPU（例：amd64） |
| コンパイル日時 | コンパイラがビルドされた日時 |
| コピーライト | 著作権表示 |
| gitハッシュ | ソースコードのgitコミットハッシュ（40文字） |
| ブートスイッチ | 有効なコンパイル時定義（-d:release等） |

## 表示項目

### バージョン情報構成

```
Nim Compiler Version X.X.X [OS: CPU]
Compiled at YYYY-MM-DD
Copyright (c) 2006-YYYY by Andreas Rumpf

git hash: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
active boot switches: -d:release -d:nimUseLinenoise
```

### 各表示項目の詳細

| 項目 | 形式 | 例 |
|-----|------|-----|
| バージョン | X.X.X | 2.0.0 |
| OS | 文字列 | linux, windows, macosx |
| CPU | 文字列 | amd64, i386, arm64 |
| 日付 | YYYY-MM-DD | 2024-01-15 |
| gitハッシュ | 40文字の16進数 | a1b2c3d4... |
| ブートスイッチ | スペース区切りのフラグ | -d:release -d:danger |

## イベント仕様

### 1-バージョンオプション検出

**トリガー**: コマンドライン引数に`--version`または`-v`が指定された場合

**処理フロー**:
1. `processSwitch`関数でオプションを解析
2. "version"または"v"オプションを検出
3. `writeVersionInfo`関数を呼び出し
4. バージョン情報をフォーマットして出力
5. `msgQuit(0)`で正常終了

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

該当なし（データベース操作を行わない画面）

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|-------------|------|---------------|---------|
| HelpMessage | 情報 | バージョンヘッダー | 常に表示 |
| gitHash | 情報 | gitコミットハッシュ | 40文字のハッシュが存在する場合のみ |
| bootSwitches | 情報 | 有効なブートスイッチ | 常に表示 |

## 例外処理

| 例外条件 | 処理内容 |
|----------|---------|
| 引数エラー | 通常は発生しない（バージョンオプションは引数不要） |

## 備考

- gitハッシュは`{.strdefine.}`プラグマを使用してコンパイル時に取得される
- gitハッシュが40文字でない場合は表示されない（開発環境でない場合など）
- ブートスイッチは`bootSwitch`テンプレートで条件付きで生成される
- VersionAsStringは`system.NimVersion`から取得される

---

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

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

### 推奨読解順序

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

まず、バージョン情報に関連する定数とメッセージテンプレートを理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | commands.nim | `compiler/commands.nim` | HelpMessage定数、bootSwitch定数群 |
| 1-2 | nversion.nim | `compiler/nversion.nim` | VersionAsString定数 |

**読解のコツ**: bootSwitchはテンプレートマクロで、コンパイル時の条件に応じて文字列を生成する。

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

処理の起点となるファイル・関数を特定。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | nim.nim | `compiler/nim.nim` | コンパイラのエントリーポイント |
| 2-2 | commands.nim | `compiler/commands.nim` | processSwitch関数での"version"処理 |

**主要処理フロー**:
1. **行98-106**: `handleCmdLine`関数 - コマンドライン処理の起点
2. **行991-993**: processSwitch内の"version", "v"ケース処理

#### Step 3: バージョン情報出力処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | commands.nim | `compiler/commands.nim` | writeVersionInfo関数 |

**主要処理フロー**:
- **行50-52**: HelpMessage定数 - バージョン情報のテンプレート
- **行14-26**: bootSwitch定数群 - 有効なブートスイッチの定義
- **行92-108**: `writeVersionInfo`関数 - バージョン情報の出力処理

#### Step 4: ブートスイッチの生成を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | commands.nim | `compiler/commands.nim` | bootSwitchテンプレートマクロ |

**主要処理フロー**:
- **行14-17**: `bootSwitch`テンプレート - 条件付き文字列生成
- **行18-26**: 各種bootSwitchの定義（usedRelease, usedDanger等）
- **行40-41**: usedTinyC, usedFFIの定義

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

```
nim (エントリーポイント)
    │
    ├─ handleCmdLine (compiler/nim.nim:98)
    │      │
    │      └─ processCmdLine → processSwitch (compiler/commands.nim:644)
    │              │
    │              └─ "version", "v" ケース (行991-993)
    │                      │
    │                      └─ writeVersionInfo (compiler/commands.nim:92)
    │                              │
    │                              ├─ HelpMessage % [VersionAsString, OS, CPU, CompileDate]
    │                              │
    │                              ├─ gitHash 出力（40文字の場合のみ）
    │                              │
    │                              ├─ ブートスイッチ一覧出力
    │                              │
    │                              └─ msgQuit(0)
```

### データフロー図

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

コマンドライン引数 ───▶ parseopt.initOptParser ───▶ OptParser
        │
        ▼
    引数解析 ───────────▶ processSwitch ───────────▶ オプション判定
        │
        ▼
--version/-v 検出 ────▶ writeVersionInfo ─────────▶ stdout
        │                    │
        │                    ├─ HelpMessage (バージョンヘッダー)
        │                    ├─ gitHash (存在する場合)
        │                    └─ bootSwitches
        │
        ▼
    msgQuit(0) ───────────────────────────────────▶ プロセス終了
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| nim.nim | `compiler/nim.nim` | ソース | コンパイラのメインエントリーポイント |
| commands.nim | `compiler/commands.nim` | ソース | コマンドライン引数の解析とバージョン表示 |
| nversion.nim | `compiler/nversion.nim` | ソース | バージョン情報の定義 |
| options.nim | `compiler/options.nim` | ソース | コンパイラ設定の管理 |
| msgs.nim | `compiler/msgs.nim` | ソース | メッセージ出力機能 |
| platform.nim | `compiler/platform.nim` | ソース | OS/CPU情報の管理 |
