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:
@ -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_optional(future で core_required に昇格の可能性)
|
||||
- **API**: open(path, mode) → read/write → close()
|
||||
- **プロファイル対応**: Default ✅、NoFs ❌
|
||||
- **実装**: Ring0FsFileIo を内部で再利用
|
||||
|
||||
### 設計原則
|
||||
|
||||
**FileBox(Phase 108)との違い**:
|
||||
- FileBox: 1ショット I/O(read/write を1回ずつ、ファイルを開いて→読む/書く→閉じるを隠す)
|
||||
- FileHandleBox: 複数回アクセス I/O(open → 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 / stat(size, 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
|
||||
|
||||
@ -579,13 +579,18 @@ Phase 106–108 では FileBox provider_lock / Ring0FsFileIo / write/write_all
|
||||
|
||||
今後の候補フェーズ(優先度の高い順):
|
||||
|
||||
- **Phase 109: runtime profiles(default/no-fs)**
|
||||
- ✅ **Phase 109: runtime profiles(default/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 側から扱えるようにする
|
||||
|
||||
|
||||
Reference in New Issue
Block a user