Files
hakorune/docs/development/runtime/FILEBOX_PROVIDER.md
nyash-codex cef820596f FileBox SSOT設計移行完了: Provider Pattern実装
## 🎯 目的
FileBoxをSSOT(Single Source of Truth)設計に移行し、
static/dynamic/builtin providerを統一的に扱える基盤を構築。

##  実装完了(7タスク)

### 1. Provider Lock Global
**File**: `src/runtime/provider_lock.rs`
- `FILEBOX_PROVIDER: OnceLock<Arc<dyn FileIo>>` 追加
- `set_filebox_provider()` / `get_filebox_provider()` 実装

### 2. VM初期化時のProvider選択
**File**: `src/runner/modes/vm.rs`
- `execute_vm_mode()` 冒頭でprovider選択・登録
- ENV(`NYASH_FILEBOX_MODE`, `NYASH_DISABLE_PLUGINS`)対応

### 3. CoreRoFileIo完全実装
**File**: `src/boxes/file/core_ro.rs` (NEW)
- Read-onlyファイルI/O実装
- Thread-safe: `RwLock<Option<File>>`
- Newline正規化(CRLF→LF)

### 4. FileBox委譲化
**File**: `src/boxes/file/mod.rs`
- 直接`std::fs::File`使用 → `Arc<dyn FileIo>` provider委譲
- 全メソッドをprovider経由に変更
- Fail-Fast: write/delete等の非対応操作は明確エラー

### 5. basic/file_box.rs Deprecate
**File**: `src/boxes/file/basic/file_box.rs`
- 120行 → 12行に削減
- `#[deprecated]` マーク + 再エクスポート
- 後方互換性維持

### 6. Feature Flag追加
**File**: `Cargo.toml`
- `builtin-filebox = []` feature追加

### 7. Provider抽象・選択ロジック
**Files**:
- `src/boxes/file/provider.rs` (NEW) - FileIo trait定義
- `src/boxes/file/box_shim.rs` (NEW) - 薄いラッパー
- `src/runner/modes/common_util/provider_registry.rs` (NEW) - 選択ロジック

## 📊 アーキテクチャ進化

**Before**:
```
FileBox (mod.rs) ──直接使用──> std::fs::File
FileBox (basic/)  ──直接使用──> std::fs
```

**After**:
```
FileBox ──委譲──> Arc<dyn FileIo> ──実装──> CoreRoFileIo
                                        ├──> PluginFileIo (future)
                                        └──> BuiltinFileIo (future)
```

## 🔧 技術的成果

1. **Thread Safety**: `RwLock<Option<File>>` で並行アクセス安全
2. **Fail-Fast**: 非対応操作は明確エラー(silent failure無し)
3. **後方互換性**: deprecated re-exportで既存コード維持
4. **環境制御**: `NYASH_FILEBOX_MODE` でランタイム切替

## 📝 環境変数

- `NYASH_FILEBOX_MODE=auto|core-ro|plugin-only`
  - `auto`: プラグインあれば使用、なければCoreRoにフォールバック
  - `core-ro`: 強制的にCoreRo(read-only)
  - `plugin-only`: プラグイン必須(なければFail-Fast)
- `NYASH_DISABLE_PLUGINS=1`: 強制的にcore-roモード

## 🎯 次のステップ(Future)

- [ ] Dynamic統合(plugin_loaderとの連携)
- [ ] BuiltinFileIo実装(feature builtin-filebox)
- [ ] Write/Delete等の操作対応(provider拡張)

## 📚 ドキュメント

- 詳細仕様: `docs/development/runtime/FILEBOX_PROVIDER.md`

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 15:13:22 +09:00

46 lines
2.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# File I/O Provider Architecture (CoreRO + Plugin)
目的
- File I/O の意味論を単一起源SSOTに集約し、コアとプラグインの二重実装・分岐をなくす。
- Analyzer/テスト/CI は FileBox に依存せず動作(--source-file で直接テキストを渡す)。必要時はコアの readonly 実装で安全に実行。
- 開発/本番はプラグイン(拡張版)を優先し、無い場合はコアにフォールバック。
設計3層
- リング0SSOT / 共有抽象)
- `src/boxes/file/provider.rs`
- `trait FileIo { open(&str), read(), close(), caps(), … }`
- `struct FileCaps { read: bool, write: bool }`
- 共通エラー型・正規化ヘルパ(改行など)
- 役割: File I/O の“意味論”の唯一の真実源。
- リング1コア最小実装 + 薄いラッパ)
- `src/boxes/file/core_ro.rs``CoreRoFileIo`readonly; write は FailFast
- `src/boxes/file/box_shim.rs``FileBox { provider: Arc<dyn FileIo> }`(委譲のみ; 分岐ロジックなし)
- リング1選択ポリシー
- `src/runner/modes/common_util/provider_registry.rs`
- `select_file_provider(mode: auto|core-ro|plugin-only) -> Arc<dyn FileIo>`
- 選択はここに閉じ込めるFileBox から分岐を排除)
- リング2プラグイン実装
- `plugins/nyash-filebox-plugin/src/provider.rs``PluginFileIo`write/拡張を実装)
- SSOT の `FileIo` を実装し、共通意味論に従う
モードと運用
- `NYASH_FILEBOX_MODE=auto|core-ro|plugin-only`
- auto既定: プラグインがあれば PluginFileIo、無ければ CoreRoFileIo
- core-ro: 常に CoreRoFileIoAnalyzer/CI 向け)
- plugin-only: プラグイン必須(無い場合は FailFast
- `NYASH_DISABLE_PLUGINS=1` のときは自動で corero を選択
- Analyzer/テスト/CI
- `--source-file <path> <text>` を第一経路FileBox 非依存)
- jsonlsp の stdout は純 JSONログは stderr
利点
- File I/O の重複・分岐が provider_registry に一元化され、コードの責務が明確。
- Analyzer/テストはプラグイン非依存で安定(ノイズやロード失敗の影響を受けない)。
- 本番は拡張可能なプラグインを優先しつつ、不在時はコアにフォールバック。
テスト方針
- CoreRo: open/read/close 正常、存在しないパスで FailFast
- Pluginonly: write を含む拡張 API 正常(プラグインが無い場合は FailFast
- Auto: プラグイン不在時に CoreRo へフォールバック
- Analyzer: 全 HC テストが jsonlsp で緑、stdout は純 JSON を維持