- Extend plugin-tester to support multi-box plugins with v2 API - Add nyash_plugin_get_box_count/get_box_info/get_type_id functions - Create test multi-box plugin providing TestBoxA and TestBoxB - Update plugin-system.md documentation for v2 format - Add nyash.toml v2 specification for multi-box support - Successfully tested multi-box plugin lifecycle and type resolution This enables one plugin to provide multiple Box types, solving the dependency issue where HTTPServerBox needs SocketBox. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
2.9 KiB
2.9 KiB
nyash.toml v2 仕様 - マルチBox型プラグイン対応
🎯 概要
1つのプラグインライブラリが複数のBox型を提供できるように拡張した仕様。
📝 基本構造
1. 後方互換性のある現行形式(単一Box型)
[plugins]
FileBox = "nyash-filebox-plugin"
[plugins.FileBox.methods]
read = { args = [] }
write = { args = [{ from = "string", to = "bytes" }] }
2. 新形式:マルチBox型プラグイン
# ライブラリ定義
[plugins.libraries]
"nyash-network" = {
plugin_path = "libnyash_network.so",
provides = ["SocketBox", "HTTPServerBox", "HTTPRequestBox", "HTTPResponseBox"]
}
# 各Box型の詳細定義
[plugins.types.SocketBox]
library = "nyash-network"
type_id = 100
methods = {
bind = { args = [
{ name = "address", from = "string", to = "string" },
{ name = "port", from = "integer", to = "u16" }
]}
}
[plugins.types.HTTPServerBox]
library = "nyash-network"
type_id = 101
methods = {
bind = { args = [
{ name = "address", from = "string", to = "string" },
{ name = "port", from = "integer", to = "u16" }
]},
route = { args = [
{ name = "path", from = "string", to = "string" },
{ name = "handler", from = "box", to = "box" }
]}
}
🔧 型システム
サポートする型(基本型のみ)
{ from = "string", to = "string" } # 文字列
{ from = "integer", to = "i64" } # 整数
{ from = "float", to = "f64" } # 浮動小数点
{ from = "bool", to = "bool" } # 真偽値
{ from = "bytes", to = "bytes" } # バイト配列
重要: プラグインとNyash本体間では基本型のみやり取り。Box型の受け渡しは行わない(箱は箱で完結)。
2. プラグインFFI拡張
// 既存: 単一Box型
nyash_plugin_abi_version()
nyash_plugin_init()
// 新規: 複数Box型
nyash_plugin_get_box_count() // 提供するBox型の数
nyash_plugin_get_box_info(index) // 各Box型の情報
📊 実装優先順位
-
Phase 1: nyash.toml v2パーサー実装
- 後方互換性維持
- 新形式の読み込み
-
Phase 2: plugin-tester拡張
- 複数Box型の検出
- 各Box型のメソッド検証
-
Phase 3: ローダー拡張
- 複数Box型の登録
- 型ID管理
🎯 HTTPServerBox依存問題の解決
この設計により、以下が可能になります:
[plugins.libraries]
"nyash-network" = {
plugin_path = "libnyash_network.so",
provides = ["SocketBox", "HTTPServerBox", "HTTPRequestBox", "HTTPResponseBox"]
}
# HTTPServerBoxはプラグイン内でSocketBoxを直接使用可能
# MapBoxへの依存は以下のように解決:
# - HTTPResponseBoxは内部でHashMapを使用
# - get_header("name") で個別アクセス
# - get_all_headers() は文字列配列として返す