# 画面設計書 7-Tryビュー

## 概要

本ドキュメントは、Nushell Exploreにおける Tryビュー画面の設計仕様を定義する。Tryビューは、インタラクティブにコマンドを入力・実行できるREPL風の画面である。

### 本画面の処理概要

Tryビューは、レコードビューから`:try`コマンドで呼び出される画面である。現在表示中のデータに対してNushellコマンドを試行し、結果を即座に確認できるインタラクティブな環境を提供する。コマンド入力エリアと結果表示エリアの2ペイン構成となっている。

**業務上の目的・背景**：
データ分析や変換を行う際、試行錯誤しながらコマンドを組み立てることが多い。Tryビューは、Explore内でコマンドを試行し、結果を即座に確認できる環境を提供する。メインREPLに戻ることなく、現在のデータに対するフィルタリングや変換を試すことができる。`try_reactive`設定により、入力中にリアルタイムで結果を更新することも可能。

**画面へのアクセス方法**：
- レコードビューで `:try` コマンドを入力
- Exploreの任意の画面でコマンドバーから `:try` を実行

**主要な操作・処理内容**：
1. コマンド入力エリアでNushellコマンドを入力
2. Enterでコマンドを実行
3. 結果がRecordView形式で表示
4. Tab/Downで結果ビューにフォーカス移動
5. 結果ビュー内でレコードビューと同様の操作が可能

**画面遷移**：
- レコードビュー（画面No.4） → :try → Tryビュー
- Tryビュー → Tab/Down → 結果ビュー（フォーカス移動）
- Tryビュー → Esc → レコードビュー（画面No.4）

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

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 71 | 探索モード | 主機能 | インタラクティブなコマンド入力・実行環境 |
| 1 | シェル実行環境 | API連携 | 入力コマンドの実行とパイプラインデータ処理 |
| 2 | パーサー | API連携 | 入力コマンドの構文解析 |
| 69 | テーブル表示 | 補助機能 | コマンド実行結果のRecordView形式での表示 |

## 画面種別

TUI（Terminal User Interface）インタラクティブREPL

## URL/ルーティング

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

## 入出力項目

| 項目名 | 型 | 入力/出力 | 説明 |
|--------|-----|----------|------|
| 入力データ | Value | 入力 | パイプライン入力として渡されるデータ |
| コマンド文字列 | String | 入力 | ユーザーが入力するNushellコマンド |
| 結果テーブル | RecordView | 出力 | コマンド実行結果のRecordView |
| immediate | bool | 設定 | リアルタイム実行モード |

## 表示項目

| 項目名 | 説明 | 表示形式 |
|--------|------|----------|
| コマンド入力エリア | Nushellコマンドを入力するブロック | 上部、Rounded borders |
| 結果表示エリア | コマンド実行結果を表示するブロック | 下部、RecordView |
| プロンプト | コマンド入力位置を示す | `>` 記号 |
| ヒントテキスト | 初期状態のガイド | "Type a command and press Enter..." |
| フォーカスインジケータ | アクティブなペインを示す | ボーダーのBOLD表示 |

## イベント仕様

### 1-Enter押下（コマンド実行）

1. 入力されたコマンドを取得
2. `run_command_with_value`で入力データに対してコマンドを実行
3. 結果をRecordViewに変換
4. 結果をtableフィールドに設定
5. エラーの場合はReportにエラーメッセージを表示

### 2-Tab/Down押下（フォーカス移動）

1. tableがSome（結果が存在）の場合のみ有効
2. view_modeをtrueに設定
3. 結果ビューにフォーカスを移動

### 3-Esc押下（戻る）

**コマンド入力モードの場合：**
- TryビューをExit

**結果ビューモードの場合：**
- view_modeをfalseに設定
- コマンド入力モードに戻る

### 4-文字入力（コマンド編集）

1. commandフィールドに文字を追加
2. immediateがtrueの場合、即座にコマンドを実行

### 5-Backspace押下（文字削除）

1. commandフィールドから最後の文字を削除
2. immediateがtrueの場合、即座にコマンドを実行

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

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

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 発生条件 |
|-------------|------|---------------|----------|
| ERROR | エラー | Error: {エラー詳細} | コマンド実行エラー時 |
| HINT | 情報 | Type a command and press Enter to see results | 結果がない時 |

## 例外処理

| 例外状態 | 対応処理 |
|---------|---------|
| コマンド実行エラー | info.reportにエラーメッセージを設定 |
| パースエラー | 同上 |
| 空のコマンド | 何も実行せず現状維持 |

## 備考

- `try_reactive`設定でリアルタイム実行モードを切り替え
- Recordの場合はLeft orientationで表示
- 結果ビュー内のRecordViewは通常のRecordViewと同様の操作が可能
- Unicode対応のプロンプト表示（UnicodeWidthStrで幅計算）

---

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

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

### 推奨読解順序

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

Tryビューで扱う主要なデータ構造を把握する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | try.rs | `crates/nu-explore/src/explore/views/try.rs` | TryView構造体（22-30行） |

**読解のコツ**: TryViewはinput（元データ）、command（入力コマンド）、table（結果RecordView）を持つ

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

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | try.rs | `crates/nu-explore/src/explore/views/try.rs` | View for TryView実装（62-313行） |

**主要処理フロー**:
1. **63-213行**: `draw`関数 - 2ペインのUI描画
2. **215-298行**: `handle_input`関数 - キー入力処理

#### Step 3: コマンド実行を理解する

コマンド実行と結果変換の処理を追う。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | try.rs | `crates/nu-explore/src/explore/views/try.rs` | try_run関数（49-59行） |
| 3-2 | try.rs | `crates/nu-explore/src/explore/views/try.rs` | run_command関数（315-334行） |

**主要処理フロー**:
- **49-59行**: `try_run` - コマンド実行とRecordView作成
- **315-322行**: `run_command_with_value`でコマンド実行
- **324行**: `is_record`でRecordかどうか判定
- **326行**: `collect_pipeline`で結果を収集
- **328-332行**: RecordViewを作成、Recordなら Left orientation

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

```
:try コマンド
    |
    +-- TryView::new()                   [try.rs:33]
            |
            +-- 入力データ保存
            +-- border_color設定
            +-- immediate設定（config.try_reactive）

TryView::draw()                          [try.rs:63]
    |
    +-- cmd_block / table_block 作成     [Rounded borders]
    |
    +-- Paragraph（コマンド入力）
    |
    +-- table.draw()（結果表示）
    |   or
    +-- ヒントテキスト表示

TryView::handle_input()                  [try.rs:215]
    |
    +-- view_mode == true の場合:
    |       +-- table.handle_input()
    |       +-- Tab/Up → view_mode = false
    |       +-- Exit → view_mode = false
    |
    +-- view_mode == false の場合:
            +-- Esc → Transition::Exit
            +-- Enter → try_run()
            +-- Char(c) → command.push(c)
            +-- Backspace → command.pop()
            +-- Tab/Down → view_mode = true

try_run()                                [try.rs:49]
    |
    +-- run_command()                    [try.rs:315]
            +-- run_command_with_value()
            +-- collect_pipeline()
            +-- RecordView::new()
```

### データフロー図

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

input: Value ─────────────▶ TryView
command: String             │
                            ▼
                      try_run()
                            │
                            ▼
                      run_command_with_value()
                            │
                            ▼
                      PipelineData ──────────────────▶ 実行結果
                            │
                            ▼
                      collect_pipeline()
                            │
                            ▼
(columns, values) ──────▶ RecordView::new() ─────────▶ 結果表示
                            │
                      draw()
                            │
     ┌──────────────────────┴──────────────────────┐
     │                                             │
     ▼                                             ▼
コマンド入力エリア                           結果表示エリア
(Paragraph)                                 (RecordView)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| try.rs | `crates/nu-explore/src/explore/views/try.rs` | ソース | Tryビューのコア実装 |
| commands/try.rs | `crates/nu-explore/src/explore/commands/try.rs` | ソース | :tryコマンド定義 |
| record/mod.rs | `crates/nu-explore/src/explore/views/record/mod.rs` | ソース | 結果表示用RecordView |
| command.rs | `crates/nu-explore/src/explore/nu_common/command.rs` | ソース | run_command_with_value関数 |
| value.rs | `crates/nu-explore/src/explore/nu_common/value.rs` | ソース | collect_pipeline関数 |
| config.rs | `crates/nu-explore/src/explore/config.rs` | ソース | try_reactive設定 |
