Files
hakorune/docs/phases/phase-12/archive/PLUGIN-BOX-ARG-DECLARATION.md

102 lines
2.6 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.

# プラグインBoxの箱引数宣言方法
## 📊 nyash_box.tomlでの宣言
### 1. 基本的な箱引数の宣言
```toml
[HttpRequestBox.methods.respond]
id = 3
args = [ { name = "resp", type = "box" } ] # type = "box" で箱引数を宣言
returns = { type = "void" }
```
### 2. 引数の型一覧
| 型指定 | 説明 | TLVタグ |
|--------|------|---------|
| `"i64"` | 64ビット整数 | 3 |
| `"f64"` | 64ビット浮動小数点 | 5 |
| `"string"` | UTF-8文字列 | 6 |
| `"bool"` | 真偽値 | 1 |
| `"box"` | **箱(ハンドル)** | 8 |
### 3. 実際の使用例
#### NetプラグインのHttpRequestBox
```toml
[HttpRequestBox]
type_id = 21
[HttpRequestBox.methods.respond]
id = 3
args = [ { name = "resp", type = "box" } ] # HttpResponseBoxを受け取る
returns = { type = "void" }
```
使用方法Nyash
```nyash
local request = server.accept() // HttpRequestBox
local response = new HttpResponseBox() // 別のプラグインBox
response.setStatus(200)
request.respond(response) // 箱を引数として渡す!
```
#### 戻り値が箱の例
```toml
[HttpServerBox.methods.accept]
id = 3
args = []
returns = { type = "box" } # HttpRequestBoxを返す
```
## 🔧 C実装側での処理
### TLVデコード
```c
// HttpRequestBox.respondの実装例
case 3: { // respond
// 引数をデコード
if (args_len < 12) return -1; // header(4) + handle(8)
// TLVタグチェック
uint8_t tag = args[4];
if (tag != 8) return -1; // TAG_HANDLE = 8
// ハンドルデータ取得
uint32_t resp_type_id = *(uint32_t*)&args[8];
uint32_t resp_instance_id = *(uint32_t*)&args[12];
// HttpResponseBoxtype_id=22であることを確認
if (resp_type_id != 22) return -1;
// レスポンス処理...
}
```
## 💡 重要なポイント
### 1. 型安全性
- `type = "box"`は任意の箱を受け取れる
- 実装側で`type_id`チェックにより型安全性を確保
### 2. 相互運用性
- 異なるプラグイン間でも箱の受け渡しが可能
- ハンドルtype_id + instance_idにより参照
### 3. 宣言の簡潔さ
```toml
# シンプルな宣言
args = [ { name = "box_arg", type = "box" } ]
# 複数の箱引数も可能
args = [
{ name = "box1", type = "box" },
{ name = "box2", type = "box" },
{ name = "count", type = "i64" }
]
```
## 🎯 結論
プラグインBoxは`nyash_box.toml``type = "box"`と宣言するだけで、他の箱を引数に取ることができます。C ABIレベルではTLVハンドルタグ8として処理され、完全な相互運用性が実現されています。