条目注册表

查询和修改已注册条目。访问元数据、快照和版本历史。

加载

local registry = require("registry")

条目结构

{
    id = "app.lib:assert",     -- string: "namespace:name"
    kind = "function.lua",     -- string: 条目类型
    meta = {type = "test"},    -- table: 可搜索元数据
    data = {...}               -- any: 条目负载
}

获取条目

local entry, err = registry.get("app.lib:assert")

权限: 条目 ID 上的 registry.get

查找条目

local entries, err = registry.find({kind = "function.lua"})
local entries, err = registry.find({kind = "http.endpoint", namespace = "app.api"})

过滤字段与条目元数据匹配。

解析 ID

local id = registry.parse_id("app.lib:assert")
-- id.ns = "app.lib", id.name = "assert"

快照

注册表的时间点视图:

local snap, err = registry.snapshot()           -- 当前状态
local snap, err = registry.snapshot_at(5)       -- 版本 5 时

快照方法

方法 返回 描述
snap:entries() Entry[], error 所有可访问条目
snap:get(id) Entry, error 按 ID 获取单个条目
snap:find(filter) Entry[] 过滤条目
snap:namespace(ns) Entry[] 命名空间中的条目
snap:version() Version 快照版本
snap:changes() Changes 创建变更集

版本

local version, err = registry.current_version()
local versions, err = registry.versions()

print(version:id())       -- 数字 ID
print(version:string())   -- 显示字符串
local prev = version:previous()  -- 上一版本或 nil

历史

local hist, err = registry.history()
local versions, err = hist:versions()
local version, err = hist:get_version(5)
local snap, err = hist:snapshot_at(version)

变更集

构建并应用修改:

local snap, err = registry.snapshot()
local changes = snap:changes()

changes:create({
    id = "test:new_entry",
    kind = "test.kind",
    meta = {type = "test"},
    data = {config = "value"}
})

changes:update({
    id = "test:existing",
    kind = "test.kind",
    meta = {updated = true},
    data = {new_value = true}
})

changes:delete("test:old_entry")

local new_version, err = changes:apply()

权限: changes:apply() 需要 registry.apply

Changes 方法

方法 描述
changes:create(entry) 添加创建操作
changes:update(entry) 添加更新操作
changes:delete(id) 添加删除操作(字符串或 {ns, name}
changes:ops() 获取待处理操作
changes:apply() 应用变更,返回新 Version

应用版本

回滚或前进到特定版本:

local prev = current_version:previous()
local ok, err = registry.apply_version(prev)

权限: registry.apply_version

构建差异

计算状态转换所需的操作:

local from = {{id = "test:a", kind = "test", meta = {}, data = {}}}
local to = {{id = "test:b", kind = "test", meta = {}, data = {}}}

local ops, err = registry.build_delta(from, to)
for _, op in ipairs(ops) do
    print(op.kind, op.entry.id)  -- "entry.create"、"entry.update"、"entry.delete"
end

权限

权限 资源 描述
registry.get 条目 ID 读取条目(也过滤 find/entries 结果)
registry.apply - 应用变更集
registry.apply_version - 应用/回滚版本

错误

条件 类型
条目未找到 errors.NOT_FOUND
版本未找到 errors.NOT_FOUND
权限被拒绝 errors.PERMISSION_DENIED
无效参数 errors.INVALID
无变更可应用 errors.INVALID
注册表不可用 errors.INTERNAL

参见 错误处理 了解错误处理方法。