package paneldecl import "git.yeij.top/AskaEth/Cyrene_v2/pkg/plugins/sdk" // 本文件是 `when` 条件显示的求值(§5.2.1 nav.item:「`when` 不满足 ⇒ 条目不出现」)。 // Context 是 when 求值的上下文:**调用方注入的最小事实**。 // // 为什么本包不自己去问「这个插件启用了吗」:AGENTS §9 要求单一事实来源,启用状态的真源在 // 插件管理器(§5.2.1 B 的生命周期一栏),本包去读 config / env / 文件只会造出第二份可能 // 不一致的状态,而且让单测依赖外部环境。所以这里只声明「求值需要什么」,由调用方填。 type Context struct { // Enabled 是「该插件当前已启用」这一事实。install / enable / disable / uninstall // 之后由管理器给出最新值,对应 §5.2.1「都重算面板集合」。 Enabled bool } // Resolver 按插件 id 给出求值上下文。用函数类型而不是接口:调用方通常只是读一张 map 或 // 问一次管理器,闭包足够,不值得为它定义一个类型。 // // 约束(写在这里因为编译器管不了):Resolver 不得回调 Catalog 的 Register/List/Groups —— // 那些方法持有目录锁,回调会自锁死。 type Resolver func(pluginID string) Context // Eval 求值一份 when 声明,报告该面板的入口是否应当出现。 // // 语义(本期闭集只有 enabled 一个条件键): // - when 为 nil、或对象里没写 enabled ⇒ **无条件** ⇒ 显示(条件显示是可选能力, // 不写就等于不设条件); // - when.enabled = true ⇒ 仅当 ctx.Enabled 为真时显示(§5.6.1「未启用的插件 ⇒ 入口不出现」); // - when.enabled = false ⇒ 仅当 ctx.Enabled 为假时显示 —— 条件是「要求值相等」, // 写 false 不等于没写(把 false 当「无条件」会让声明表达力凭空消失一半)。 // // 「不满足」的效果是**入口整个不出现**,不是灰掉(§5.2.1 nav.item 明写)。 func Eval(w *sdk.When, ctx Context) bool { if w == nil || w.Enabled == nil { return true } return ctx.Enabled == *w.Enabled }