# 画面設計書 5-バイナリビュー

## 概要

本ドキュメントは、Nushell Exploreにおけるバイナリビュー画面の設計仕様を定義する。バイナリビューは、バイナリデータをhex dump形式で表示するTUI画面である。

### 本画面の処理概要

バイナリビューは、`explore`コマンドでバイナリデータを渡した際に表示される画面である。バイナリデータを16進数表示とASCII表示のデュアルビューで表示し、スクロールによるナビゲーションを提供する。

**業務上の目的・背景**：
バイナリファイルやバイナリデータの内容を確認する際、hex dumpは標準的な表示形式である。バイナリビューは、Nushellでバイナリデータを扱う際に、その内容をインタラクティブに閲覧できる機能を提供する。ファイルの先頭マジックバイトの確認や、バイナリプロトコルのデバッグなどに有用である。

**画面へのアクセス方法**：
- メインREPLで `explore` コマンドにバイナリデータを渡す
- 例: `open file.bin | explore`
- 例: `0x[00 01 02 03] | explore`

**主要な操作・処理内容**：
1. バイナリデータのhex dump形式表示
2. 16進数表示（各バイトを2桁の16進数で表示）
3. ASCII表示（印刷可能文字のみ、それ以外は`.`）
4. 上下スクロールによるナビゲーション

**画面遷移**：
- メインREPL（画面No.1） → explore コマンド（バイナリ） → バイナリビュー
- バイナリビュー → :q / Esc → メインREPL（画面No.1）

**権限による表示制御**：
- 特になし。全ユーザーが同一の機能を利用可能

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 64 | バイナリ処理 | 主機能 | バイナリデータのhex dump形式での表示処理 |
| 71 | 探索モード | 主機能 | バイナリデータのカーソル移動・ページング操作 |

## 画面種別

TUI（Terminal User Interface）バイナリビューア

## URL/ルーティング

N/A（CLI/TUIアプリケーションのためURL概念なし）

## 入出力項目

| 項目名 | 型 | 入力/出力 | 説明 |
|--------|-----|----------|------|
| バイナリデータ | Vec<u8> | 入力 | 表示対象のバイナリデータ |
| 表示設定 | BinarySettings | 入力 | 表示オプション（グループサイズ等） |
| スタイル設定 | BinaryStyle | 入力 | 表示スタイル（パディング等） |

## 表示項目

| 項目名 | 説明 | 表示形式 |
|--------|------|----------|
| オフセット | 行頭のバイトオフセット | 16進数 |
| Hexビュー | バイトの16進数表示 | `00 01 02 ...` |
| ASCIIビュー | 印刷可能文字の表示 | `.abc...` |
| ステータスバー | スクロール位置 | Top/X%/All |

## イベント仕様

### 1-上下矢印キー（スクロール）

1. WindowCursor2Dのrow位置を更新
2. 表示開始行を変更
3. ステータスバーを更新

### 2-Page Up/Page Down（ページ移動）

1. ウィンドウ高さ分だけ移動
2. 表示開始行を更新
3. ステータスバーを更新

### 3-Esc / :q（終了）

1. バイナリビューを終了
2. メインREPLに戻る

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

N/A（データベース操作なし）

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 発生条件 |
|-------------|------|---------------|----------|
| TOP | 情報 | Top | スクロール位置が先頭 |
| ALL | 情報 | All | 全データが表示されている |
| PERCENT | 情報 | X% | スクロール位置のパーセント |
| MODE | 情報 | VIEW | 常にVIEWモード |

## 例外処理

| 例外状態 | 対応処理 |
|---------|---------|
| 空のバイナリデータ | 空のビューを表示 |

## 備考

- BinarySettingsでグループサイズ（デフォルト8バイト）とセグメント数（デフォルト2）を設定
- BinaryStyleでパディングをカスタマイズ可能
- CursorMoveHandlerトレイトを実装するが、垂直方向のみ使用
- 検索機能は未実装（collect_dataが空ベクトルを返す）

---

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

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

### 推奨読解順序

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

バイナリビューで扱う主要なデータ構造を把握する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | mod.rs | `crates/nu-explore/src/explore/views/binary/mod.rs` | BinaryView構造体（29-34行） |
| 1-2 | mod.rs | `crates/nu-explore/src/explore/views/binary/mod.rs` | Settings構造体（36-40行） |

**読解のコツ**: BinaryViewはdataとしてVec<u8>を持ち、cursorで表示位置を管理

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

Viewトレイト実装を通じて画面描画と入力処理を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | mod.rs | `crates/nu-explore/src/explore/views/binary/mod.rs` | View for BinaryView実装（56-93行） |

**主要処理フロー**:
1. **57-60行**: `draw`関数 - BinaryWidgetの描画
2. **62-77行**: `handle_input`関数 - キー入力処理

#### Step 3: ウィジェット描画を理解する

BinaryWidgetの実装を追う。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | mod.rs | `crates/nu-explore/src/explore/views/binary/mod.rs` | create_binary_widget関数（101-112行） |
| 3-2 | binary_widget.rs | `crates/nu-explore/src/explore/views/binary/binary_widget.rs` | BinaryWidget構造体 |

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

```
explore コマンド（バイナリデータ）
    |
    +-- BinaryView::new()                [mod.rs:43]
            |
            +-- settings_from_config()   [mod.rs:114]
            +-- BinaryWidget::count_lines()
            +-- WindowCursor2D::new()

BinaryView::draw()                       [mod.rs:57]
    |
    +-- create_binary_widget()           [mod.rs:101]
    |       +-- BinaryWidget::new()
    |       +-- set_row_offset()
    |
    +-- f.render_widget()

BinaryView::handle_input()               [mod.rs:62]
    |
    +-- handle_input_key()               [CursorMoveHandler]
            |
            +-- prev_row() / next_row()
```

### データフロー図

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

Vec<u8>（バイナリ） ─────▶ BinaryView::new()
                            │
                            ▼
                      settings_from_config()
                      count_lines()
                            │
                            ▼
                      draw()
                            │
                            ▼
                      create_binary_widget()
                            │
                            ▼
                      BinaryWidget ──────────────────▶ TUI画面描画
                            │                          - オフセット
                            │                          - Hexビュー
                            │                          - ASCIIビュー
                      handle_input()
                            │
                            ▼
                      cursor更新 ────────────────────▶ 表示位置変更
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| mod.rs | `crates/nu-explore/src/explore/views/binary/mod.rs` | ソース | バイナリビューのコア実装 |
| binary_widget.rs | `crates/nu-explore/src/explore/views/binary/binary_widget.rs` | ソース | hex dump描画ウィジェット |
| cursor/mod.rs | `crates/nu-explore/src/explore/views/cursor/mod.rs` | ソース | カーソル管理 |
| window_cursor_2d.rs | `crates/nu-explore/src/explore/views/cursor/window_cursor_2d.rs` | ソース | 2Dカーソル実装 |
| config.rs | `crates/nu-explore/src/explore/config.rs` | ソース | Explore設定 |
| report.rs | `crates/nu-explore/src/explore/pager/report.rs` | ソース | レポート生成 |
