# 🔄 ビルトインBox → プラグイン変換手順書

## 🎯 概要

ビルトインBoxをBID-FFI v1プラグインに変換する標準手順。実際の変換作業で発見された問題と解決策を蓄積し、効率的な開発手法を確立する。

## 📊 変換パターン分析

### 🏆 成功事例：FileBox変換
- **元実装**: `src/boxes/file/mod.rs` (RwLock<File>)
- **プラグイン**: `plugins/nyash-filebox-plugin/` (BID-FFI v1)
- **結果**: ✅ 完全動作、プラグイン優先使用

### 🔍 現状分析：HTTP系Box
- **実装状況**: 完全実装済み（432行の高機能HTTPサーバー）
- **問題**: Unified Registry未登録（Legacy Match使用）
- **潜在性**: 即座にプラグイン化可能

## 🚀 標準変換手順（3段階アプローチ）

### Phase 1: ビルトイン最適化
**目的**: 既存実装の性能向上・デバッグ
**期間**: 1-3日

#### 手順
1. **Unified Registry登録**
   ```rust
   // src/box_factory/builtin.rs 内
   fn register_io_types(&mut self) {
       // HTTPServerBox追加
       self.register("HTTPServerBox", |args| {
           if !args.is_empty() {
               return Err(RuntimeError::InvalidOperation {
                   message: format!("HTTPServerBox constructor expects 0 arguments, got {}", args.len()),
               });
           }
           Ok(Box::new(HTTPServerBox::new()))
       });
       // 他のHTTP系Boxも同様に追加
   }
   ```

2. **動作テスト作成**
   ```nyash
   // local_tests/test_http_builtin.hako
   static box Main {
       main() {
           local server = new HTTPServerBox()
           server.bind("localhost", 8080)
           server.get("/test", TestHandler.handle)
           return "HTTP builtin test complete"
       }
   }
   ```

3. **性能ベンチマーク**
   - Legacy Match vs Unified Registry比較
   - メモリ使用量測定

#### 期待効果
- ✅ 高速化（Legacy Match削除）
- ✅ デバッグ環境確立
- ✅ 安定性確認

### Phase 2: プラグイン変換実装
**目的**: BID-FFI v1プラグイン実装
**期間**: 3-7日

#### 手順
1. **プラグインプロジェクト作成**
   ```bash
   mkdir plugins/nyash-http-plugin
   cd plugins/nyash-http-plugin
   cargo init --lib
   ```

2. **Cargo.toml設定**
   ```toml
   [lib]
   crate-type = ["cdylib"]
   
   [dependencies]
   once_cell = "1.0"
   # HTTP依存関係
   ```

3. **BID-FFI v1実装**
   - マルチBox対応（HTTPServerBox, HTTPClientBox, SocketBox）
   - TLV Protocol実装
   - Method ID定義

4. **nyash.toml設定**
   ```toml
   [libraries."libnyash_http_plugin.so"]
   boxes = ["HTTPServerBox", "HTTPClientBox", "SocketBox"]
   
   [libraries."libnyash_http_plugin.so".HTTPServerBox]
   type_id = 10
   [libraries."libnyash_http_plugin.so".HTTPServerBox.methods]
   birth = { method_id = 0 }
   bind = { method_id = 1, args = ["address", "port"] }
   listen = { method_id = 2, args = ["backlog"] }
   start = { method_id = 3 }
   stop = { method_id = 4 }
   fini = { method_id = 4294967295 }
   ```

### Phase 3: 移行・検証
**目的**: 完全移行とパフォーマンス検証
**期間**: 1-2日

#### 手順
1. **プラグイン優先テスト**
   - 同じテストケースでビルトイン vs プラグイン比較
   - メモリリーク検証
   - エラーハンドリング確認

2. **ビルトイン実装削除**
   - `src/boxes/http_*` ファイル削除
   - BUILTIN_BOXES リストから除去
   - コンパイル確認

3. **本格アプリテスト**
   ```nyash
   // apps/http_example/
   // 実用的なHTTPサーバーアプリで動作確認
   ```

## 🔧 BID-FFI v1必須要件

### ✅ **絶対必須の2つのメソッド**

すべてのBID-FFI v1プラグインで実装必須：

**🔧 birth() - コンストラクタ (METHOD_ID = 0)**
```rust
const METHOD_BIRTH: u32 = 0;  // Constructor
```
- **機能**: インスタンス作成、instance_id返却
- **必須実装**: インスタンス管理、メモリ確保
- **戻り値**: TLV形式のinstance_id (u32)

**🧹 fini() - デストラクタ (METHOD_ID = u32::MAX)**
```rust
const METHOD_FINI: u32 = u32::MAX;  // Destructor (4294967295)
```
- **機能**: インスタンス解放、メモリクリーンアップ
- **必須実装**: INSTANCES.remove(), リソース解放
- **戻り値**: 成功ステータス

### 📝 設定例
```toml
[libraries."libnyash_example_plugin.so".ExampleBox.methods]
birth = { method_id = 0 }                    # 🔧 必須
# ... カスタムメソッド ...
fini = { method_id = 4294967295 }           # 🧹 必須
```

## 🐛 発見済み問題と解決策

### Problem 1: toString()メソッドエラー
**現象**: `Unknown method 'toString' for FileBox`
```
❌ Interpreter error: Invalid operation: Unknown method 'toString' for FileBox
```

**原因**: プラグインにtoString()メソッド未定義
**解決策**: nyash.tomlでtoStringメソッド追加
```toml
toString = { method_id = 5 }
```

### Problem 2: Unified Registry未登録Box
**現象**: `Falling back to legacy match statement`
```
🔍 Unified registry failed for HTTPServerBox: Unknown Box type
🔍 Falling back to legacy match statement
```

**原因**: BuiltinBoxFactory.register_io_types()未登録
**解決策**: HTTP系Box登録追加

### Problem 3: 複雑な依存関係
**予想問題**: HTTPServerBox → SocketBox → OS固有API
**解決策**: プラグイン内で依存関係完結

## 📋 チェックリスト

### ✅ Phase 1完了条件
- [ ] Unified Registry登録完了
- [ ] Legacy Match削除確認
- [ ] 基本動作テスト成功
- [ ] パフォーマンス改善確認

### ✅ Phase 2完了条件
- [ ] プラグインビルド成功
- [ ] BID-FFI v1インターフェース実装
- [ ] 全メソッドTLV対応
- [ ] plugin-testerで検証成功

### ✅ Phase 3完了条件
- [ ] プラグイン優先動作確認
- [ ] ビルトイン実装削除成功
- [ ] 実用アプリケーション動作確認
- [ ] メモリリーク・エラーなし

## 🚀 期待効果

### 短期効果（Phase 1）
- **5-10倍高速化**: Legacy Match → Unified Registry
- **保守性向上**: 統一的なファクトリパターン
- **デバッグ環境**: 安定したテスト基盤

### 長期効果（Phase 3）
- **プラグイン化完了**: 外部配布可能
- **アーキテクチャ改善**: コア軽量化
- **拡張性向上**: 独立開発可能

## 🎯 次期対象Box候補

### 優先度高（実装済み）
1. **HTTP系**: HTTPServerBox, HTTPClientBox, SocketBox
2. **BufferBox**: バイナリデータ処理
3. **RegexBox**: 正規表現処理

### 優先度中（要調査）
1. **MathBox, RandomBox**: プラグイン実装あり（第1世代C ABI）
2. **JSONBox**: データ交換
3. **StreamBox**: ストリーム処理

## 📝 学習記録

### 成功パターン
- FileBox: 単純構造、明確API → スムーズ変換
- プラグイン優先システム動作確認済み

### 注意点
- toString()等の基本メソッド必須
- 依存関係の循環に注意
- メモリ管理の完全分離

---

**最終更新**: 2025年8月20日 - 初版作成  
**Phase**: 9.75g-0 完了後 - HTTP系Box変換準備完了  
**Next**: Phase 1実装→Phase 2プラグイン化