bindings.json
bindings.json
功能
bindings.json 描述扩展对 BT 脚本公开的调用表面。它不写业务逻辑,只声明入口函数、扩展对象、对象方法、参数类型、返回类型和对象生命周期语义。
脚本能调用什么,完全由 bindings.json 决定;扩展后端必须提供与 bindings 对应的实现。
语法
{ "api_version": 1, "functions": [ { "name": "calc", "id": 1, "params": [ { "name": "value", "type": "int" } ], "returns": "Calc" } ], "objects": [ { "name": "Calc", "type_id": 1, "methods": [ { "name": "add", "id": 2, "params": [ { "name": "value", "type": "int" } ], "returns": "Calc" }, { "name": "value", "id": 3, "params": [], "returns": "int" }, { "name": "close", "id": 4, "params": [], "returns": "bool", "lifecycle": "dispose" } ] } ] }
参数
| 字段 | 说明 |
|---|---|
api_version | 必须和 manifest.api_version 一致,使用 1。 |
functions | 公开入口函数列表,至少需要一个入口。 |
functions[].name | 脚本里看到的全局入口名,例如 calc。 |
functions[].id | 后端调用 ID,WASM 扩展用它分发到具体 handler。 |
functions[].params | 参数列表。 |
functions[].returns | 返回类型,可以是原始类型或 objects 中声明的对象类型。 |
objects | 扩展对象类型列表。 |
objects[].name | 对象类型名,必须大写字母开头,例如 Calc。 |
objects[].type_id | 对象类型 ID,不能为 0。 |
objects[].methods | 对象方法列表。 |
methods[].lifecycle | 方法生命周期,默认 call,可写 dispose。 |
参数类型
bindings 支持以下参数类型:
| 类型 | 说明 |
|---|---|
empty | BT 的 empty。 |
null | BT 的 null。 |
bool | 布尔值。 |
int | 整数。 |
float | 浮点数。 |
string | 字符串。 |
bytes | Bytes 二进制字节。 |
array | 数组。 |
object | 普通对象。 |
返回类型可以使用这些原始类型,也可以使用 objects 中已声明的对象类型名。
返回值
bindings 本身没有运行时返回值。扩展实际返回值由 returns 字段约束:如果写原始类型,运行时会校验真实返回值类型;如果写对象类型名,运行时会要求返回对应扩展对象。
参数 role
参数默认是普通值:
{ "name": "value", "type": "int" }
如果参数是给 WASM 扩展使用的路径,可以声明 role:
{ "name": "input", "type": "string", "role": "path_read" }
| role | 说明 |
|---|---|
value | 普通值,不做路径处理。 |
path_read | 读取文件路径,要求 type 为 string,并声明 fs_read。 |
path_write | 写入文件路径,要求 type 为 string,并声明 fs_write。 |
path_dir | 目录路径,要求 type 为 string,并声明 fs_read 或 fs_write。 |
代码示例
上面的 bindings 会让脚本获得这样的调用体验:
num = calc(1) num.add(2) value = num.value() // 输出:3 print value
注意事项
- 入口名、方法名、参数名必须使用 snake_case,不能以下划线开头或结尾。
-
id在同一个 bindings 文件中不能重复,且不能为0。 - 对象
type_id不能为0,同一个扩展内不能重复。 -
lifecycle: "dispose"只能用于close或dispose方法;方法不能有参数,返回类型必须是原始类型。 - 纯 BT 扩展要求 bindings 中的入口函数和对象方法在
src/lib.bt中存在同名实现。