feat(phase110): FileHandleBox実装(ハンドルベース複数回アクセス)

Phase 110 完全実装完了:
- FileHandleBox struct で open → read/write → close の複数回アクセスをサポート
- 各インスタンスが独立した Ring0FsFileIo を保持
- Fail-Fast 原則:二重 open、close後アクセス、NoFsプロファイル全て即座にエラー
- RuntimeProfile 対応:Default で使用可能、NoFs で禁止

実装ファイル:
- src/boxes/file/handle_box.rs (新規, 450行)
- src/boxes/file/mod.rs (修正, export追加)

テスト: 7/7 PASS 
- test_filehandlebox_basic_write_read
- test_filehandlebox_double_open_error
- test_filehandlebox_closed_access_error
- test_filehandlebox_write_wrong_mode
- test_filehandlebox_multiple_writes
- test_filehandlebox_unsupported_mode
- test_filehandlebox_independent_instances

ドキュメント更新:
- core_boxes_design.md (Section 16 追加)
- ring0-inventory.md (Phase 110完了)
- CURRENT_TASK.md (Phase 110完了セクション)

設計原則:
- FileBox: ワンショット I/O(open/close隠蔽)
- FileHandleBox: ハンドルベース I/O(複数回アクセス対応)
- Ring0FsFileIo を内部で再利用

次フェーズ: Phase 111(append mode + metadata)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
nyash-codex
2025-12-03 20:28:33 +09:00
parent bc1fce3dfe
commit acd1b54ef9
5 changed files with 695 additions and 5 deletions

View File

@ -1730,3 +1730,117 @@ NYASH_USE_PLUGIN_HOST=1 ./target/release/hakorune test.hako
**Phase 98 実装完了日**: 2025-12-03
**Phase 99 ポリシー確定日**: 2025-12-03
---
## Section 16: Phase 110 - FileHandleBoxハンドルベース複数回アクセス I/O
### 概要
FileBoxワンショット I/Oを補完するハンドルベースのファイル I/O。
- **位置づけ**: core_optionalfuture で core_required に昇格の可能性)
- **API**: open(path, mode) → read/write → close()
- **プロファイル対応**: Default ✅、NoFs ❌
- **実装**: Ring0FsFileIo を内部で再利用
### 設計原則
**FileBoxPhase 108との違い**:
- FileBox: 1ショット I/Oread/write を1回ずつ、ファイルを開いて→読む/書く→閉じるを隠す)
- FileHandleBox: 複数回アクセス I/Oopen → read/write複数回可→ close を明示的に制御)
**Fail-Fast 原則**:
- open() 呼び出し時に既に open 済み → 即座に Err
- close() 後の read/write → 即座に Err
- NoFs profile で open → 即座に Err
**独立インスタンス設計**:
- 各 FileHandleBox インスタンスが独立した Ring0FsFileIo を保持
- 複数の FileHandleBox が同時に異なるファイルを open 可能
### API
```rust
pub struct FileHandleBox {
base: BoxBase,
path: String,
mode: String,
io: Option<Arc<dyn FileIo>>,
}
impl FileHandleBox {
pub fn new() -> Self;
pub fn open(&mut self, path: &str, mode: &str) -> Result<(), String>;
pub fn read_to_string(&self) -> Result<String, String>;
pub fn write_all(&self, content: &str) -> Result<(), String>;
pub fn close(&mut self) -> Result<(), String>;
pub fn is_open(&self) -> bool;
}
```
### サポートモード
**Phase 110**:
- "r" (read): ファイル読み込み専用
- "w" (write): ファイル上書き書き込みtruncate mode
**Phase 111 予定**:
- "a" (append): ファイル追記モード
### プロファイル対応
| Profile | FileHandleBox | 動作 |
|----------|---------------|------|
| Default | ✅ | Ring0FsFileIo を使用(完全なファイル I/O |
| NoFs | ❌ | open() が Err を返す("File I/O disabled in no-fs profile" |
| TestMock (TBD) | ✅ mock | テスト用ダミー |
| Sandbox (TBD) | ✅ dir限定 | サンドボックス内のみアクセス可能 |
### 実装詳細
**ファイル**: `src/boxes/file/handle_box.rs`
**主要機能**:
1. new() - ハンドル作成ファイルは未open
2. open(path, mode) - ファイルを開く
- 二重 open チェックFail-Fast
- mode 検証("r" or "w"
- NoFs profile チェック
- Ring0FsFileIo インスタンス作成
3. read_to_string() - ファイル内容を読み込み
4. write_all(content) - ファイルに書き込み
- write mode チェック
5. close() - ファイルを閉じる
- FileIo インスタンスを drop
6. is_open() - ファイルが open されているかチェック
### テスト
**実装済みテスト** (7個):
1. test_filehandlebox_basic_write_read - 基本的な書き込み・読み込み
2. test_filehandlebox_double_open_error - 二重 open エラー
3. test_filehandlebox_closed_access_error - close 後アクセスエラー
4. test_filehandlebox_write_wrong_mode - read mode で write エラー
5. test_filehandlebox_multiple_writes - 複数回書き込み
6. test_filehandlebox_unsupported_mode - 未サポートモードエラー
7. test_filehandlebox_independent_instances - 独立インスタンス動作確認
**テスト結果**: ✅ 7/7 PASS
### 将来の拡張ポイント
- **Phase 111**: append mode (`mode = "a"`)
- **Phase 112**: file metadata / statsize, mtime 等)
- **Phase 113**: Ring0 service registry 統一化
- **Phase 114**: 並行アクセス安全性Arc<Mutex<...>>
- **Phase 115**: file encoding explicit 指定UTF-8 以外)
### 関連ドキュメント
- [Phase 110 設計書](phase110_filehandlebox_design.md) - 完全仕様
- [Ring0 Inventory](ring0-inventory.md) - FileIo/FsApi レイヤー設計
---
**Phase 110 実装完了日**: 2025-12-03

View File

@ -579,13 +579,18 @@ Phase 106108 では FileBox provider_lock / Ring0FsFileIo / write/write_all
今後の候補フェーズ(優先度の高い順):
- **Phase 109: runtime profilesdefault/no-fs**
- **Phase 109: runtime profilesdefault/no-fs** (COMPLETED)
- `NYASH_PROFILE={default|no-fs}` などのプロファイル導入
- default では FileBox 必須、no-fs では FileBox provider 未登録(エラー文字列で通知)
- **Phase 110: FileHandleBox**
- **Phase 110: FileHandleBox** (COMPLETED - 2025-12-03)
- FileBox を「1ファイル専用」に保ちつつ、複数ファイル同時アクセスは FileHandleBox 側に切り出す
- Ring0FsFileIo を再利用してハンドル単位の管理を行う
- **Phase 111: Fs metadata 拡張**
- ハンドルベース複数回アクセス I/O 完全実装
- 実装: `src/boxes/file/handle_box.rs` (7テスト全PASS)
- API: open(path, mode) → read/write → close()
- プロファイル対応: Default ✅、NoFs ❌
- **Phase 111: Fs metadata 拡張 + append mode**
- FileHandleBox に append mode ("a") を追加
- `exists/metadata/canonicalize` を FileIo / FileBox 側にきちんとエクスポート
- Ring0.FsApi の stat 情報を Nyash 側から扱えるようにする