# 画面設計書 27-nimprettyメイン画面

## 概要

本ドキュメントは、Nimprettyツールのメイン画面（CLIインターフェース）に関する画面設計書である。

### 本画面の処理概要

nimprettyは、Nimソースコードを自動的に整形（フォーマット）するCLIツールである。コードスタイルを統一し、可読性を向上させる。

**業務上の目的・背景**：チーム開発において、コードスタイルの統一は可読性とメンテナンス性に直結する重要な要素である。手動でのフォーマット修正は時間がかかり、ミスも発生しやすい。nimprettyを使用することで、自動的にコードを整形し、一貫したスタイルを維持できる。CIパイプラインに組み込むことで、コードレビューの負担も軽減される。

**画面へのアクセス方法**：コマンドラインから直接実行する。
```
nimpretty [options] nimfiles...
```

**主要な操作・処理内容**：
1. コマンドライン引数を解析
2. 対象ファイルを読み込み
3. 字句解析・構文解析を実行
4. レイアウトルールに基づいてコードを整形
5. 整形結果を出力（上書きまたは指定ファイル）

**画面遷移**：
- 遷移元: シェル/ターミナルからの直接実行、またはエディタ/ビルドスクリプトからの呼び出し
- 遷移先: 処理完了後、シェルに戻る

**権限による表示制御**：本ツールはCLIベースであり、権限による表示制御は存在しない。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 26 | Nimpretty | 主機能 | Nimコード自動整形のメイン処理 |
| 2 | レキサー（字句解析） | 補助機能 | コード整形のための字句解析 |
| 3 | パーサー（構文解析） | 補助機能 | コード整形のための構文解析 |

## 画面種別

コマンドライン（CLI）

## URL/ルーティング

```
# 基本使用法
nimpretty file.nim

# オプション指定
nimpretty --indent:2 --maxLineLen:100 file.nim
nimpretty --out:formatted.nim file.nim
nimpretty --outDir:formatted/ *.nim

# 標準入出力
nimpretty --stdin
```

## 入出力項目

### コマンドラインオプション

| オプション | 型 | デフォルト | 説明 |
|-----------|-----|----------|------|
| --out | string | (入力ファイルを上書き) | 出力ファイルパス |
| --outDir | string | (入力ファイルを上書き) | 出力ディレクトリ |
| --stdin | flag | false | 標準入力から読み込み |
| --indent | int | 0 (自動検出) | インデント幅（スペース数） |
| --maxLineLen | int | 80 | 最大行長 |
| --version | flag | - | バージョン表示 |
| --help | flag | - | ヘルプ表示 |

### 入力

| 項目名 | 型 | 説明 |
|--------|-----|------|
| nimfiles | seq[string] | 整形対象のNimソースファイル（複数指定可） |

### 出力

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 整形済みコード | string | フォーマット後のNimソースコード |

## 表示項目

CLIツールとして、以下の出力がある:

| 表示項目 | 説明 | 例 |
|---------|------|-----|
| バージョン | --version時 | `0.2` |
| ヘルプ | --help時 | Usage説明 |
| バックアップ通知 | --backup時 | `writing backup file.nim > file.nim.backup` |
| エラー | エラー発生時 | `[Error] no input file.` |

## イベント仕様

### 1-コマンドライン解析

1. `main`関数でgetoptを使用してオプションを解析（行134-156）
2. オプションに応じて`PrettyOptions`を設定
3. 入力ファイルリストを収集

### 2-ファイル整形

1. `prettyPrint`関数を呼び出し（行90-103）
2. パーサーを初期化し、ファイルを開く
3. `parseAll`でAST全体を取得
4. `closeEmitter`で整形結果を出力

### 3-標準入出力処理

1. --stdinが指定された場合、`handleStdinInput`を呼び出し（行105-117）
2. 一時ファイルを作成
3. 整形処理を実行
4. 結果を標準出力に書き出し

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| - | - | - | データベースは使用しない |

## メッセージ仕様

| メッセージ種別 | メッセージ | 発生条件 |
|---------------|----------|---------|
| エラー | `[Error] no input file.` | 入力ファイル未指定時 |
| エラー | `[Error] out and outDir cannot both be specified` | --outと--outDir両方指定時 |
| 情報 | `writing backup file.nim > file.nim.backup` | バックアップ作成時 |

## 例外処理

| 例外状況 | 処理内容 |
|---------|---------|
| 入力ファイルなし | エラーメッセージを表示して終了 |
| outとoutDir両方指定 | エラーメッセージを表示して終了 |
| パースエラー | 元ファイルは変更せず終了 |

## 備考

- バージョン0.2（行22）
- インデント幅0は自動検出を意味する
- デフォルトの最大行長は80文字
- --stdinモードでは一時ファイルを使用して処理
- 整形後のASTが元のASTと等価かチェックする`finalCheck`機能あり

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | nimpretty.nim | `nimpretty/nimpretty.nim` | PrettyOptions型（行49-52） |
| 1-2 | layouter.nim | `compiler/layouter.nim` | Emitter型、レイアウト処理 |

**読解のコツ**: PrettyOptionsはインデント幅と最大行長を保持するシンプルな構造体である。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | nimpretty.nim | `nimpretty/nimpretty.nim` | main関数（行119-189） |

**主要処理フロー**:
1. **行119-132**: 変数初期化
2. **行134-156**: コマンドライン解析（getopt）
3. **行158-189**: ファイル処理ループ

#### Step 3: 整形処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | nimpretty.nim | `nimpretty/nimpretty.nim` | prettyPrint関数（行90-103） |
| 3-2 | layouter.nim | `compiler/layouter.nim` | closeEmitter関数 |

**主要処理フロー**:
- **行90-103**: prettyPrint関数
```nim
proc prettyPrint*(infile, outfile: string; opt: PrettyOptions) =
  var conf = newConfigRef()
  let fileIdx = fileInfoIdx(conf, AbsoluteFile infile)
  # ...
  var parser: Parser
  parser.em.indWidth = opt.indWidth
  if setupParser(parser, fileIdx, newIdentCache(), conf):
    parser.em.maxLineLen = opt.maxLineLen
    let fullAst = parseAll(parser)
    closeParser(parser)
    when defined(nimpretty):
      closeEmitter(parser.em, fullAst, finalCheck)
```

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

```
main (行119)
    │
    ├─ getopt - コマンドライン解析 (行134)
    │
    ├─ handleStdinInput (行105) - --stdin時
    │      │
    │      ├─ createTempFile
    │      │
    │      ├─ prettyPrint
    │      │
    │      └─ stdout出力
    │
    └─ prettyPrint (行90)
           │
           ├─ newConfigRef - 設定初期化
           │
           ├─ setupParser - パーサー初期化
           │
           ├─ parseAll - AST取得
           │
           ├─ closeParser
           │
           └─ closeEmitter - 整形出力
```

### データフロー図

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

コマンドライン            nimpretty                       ファイル/stdout
    │                         │                              │
    │  file.nim              │                              │
    │────────────────────────>│                              │
    │                         │                              │
    │                    字句解析                            │
    │                         │                              │
    │                    構文解析                            │
    │                         │                              │
    │                    AST取得                             │
    │                         │                              │
    │                    レイアウト整形                      │
    │                         │                              │
    │                         │  整形済みコード              │
    │                         │──────────────────────────────>│
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| nimpretty.nim | `nimpretty/nimpretty.nim` | ソース | メインエントリ、CLI処理 |
| layouter.nim | `compiler/layouter.nim` | ソース | コード整形エンジン |
| syntaxes.nim | `compiler/syntaxes.nim` | ソース | パーサー初期化 |
| parser.nim | `compiler/parser.nim` | ソース | 構文解析 |
| llstream.nim | `compiler/llstream.nim` | ソース | ストリーム処理 |
