代码拉取完成,页面将自动刷新
package plugin
import (
"fmt"
"sync"
"gitee.com/blizzard1413/dsl/function"
)
// ScriptPlugin 脚本插件
// 允许通过 DSL 脚本定义插件功能
type ScriptPlugin struct {
name string
version string
description string
dependencies []Dependency
script string // DSL 脚本内容
functions map[string]string
status PluginStatus
logger Logger
registry function.Registry
mu sync.RWMutex
}
// ScriptPluginConfig 脚本插件配置
type ScriptPluginConfig struct {
Name string
Version string
Description string
Dependencies []Dependency
Script string // DSL 脚本内容
Functions map[string]string
}
// NewScriptPlugin 创建脚本插件
func NewScriptPlugin(config ScriptPluginConfig) *ScriptPlugin {
return &ScriptPlugin{
name: config.Name,
version: config.Version,
description: config.Description,
dependencies: config.Dependencies,
script: config.Script,
functions: config.Functions,
status: StatusUnloaded,
}
}
// Name 返回插件名称
func (p *ScriptPlugin) Name() string {
return p.name
}
// Version 返回插件版本
func (p *ScriptPlugin) Version() string {
return p.version
}
// Description 返回插件描述
func (p *ScriptPlugin) Description() string {
return p.description
}
// Dependencies 返回插件依赖
func (p *ScriptPlugin) Dependencies() []Dependency {
return p.dependencies
}
// Initialize 初始化插件
func (p *ScriptPlugin) Initialize(ctx *PluginContext) error {
p.mu.Lock()
defer p.mu.Unlock()
p.logger = ctx.Logger
p.registry = ctx.FunctionRegistry
p.status = StatusInitialized
p.logger.Info(fmt.Sprintf("Script plugin '%s' initialized", p.name))
return nil
}
// Start 启动插件
func (p *ScriptPlugin) Start() error {
p.mu.Lock()
defer p.mu.Unlock()
// 注册脚本中定义的函数
for funcName, funcScript := range p.functions {
// 创建一个闭包来捕获脚本内容
script := funcScript
name := funcName
// 注册函数(简化版本,实际需要 DSL 引擎支持)
err := p.registry.RegisterNative(
name,
function.NewVariadicSignature(0, nil),
func(args []interface{}) (interface{}, error) {
// TODO: 这里需要实际的 DSL 引擎来执行脚本
// 目前返回一个占位符
return fmt.Sprintf("Script function '%s' called with args: %v\nScript: %s",
name, args, script), nil
},
)
if err != nil {
return fmt.Errorf("failed to register function '%s': %w", funcName, err)
}
p.logger.Info(fmt.Sprintf("Registered script function: %s", funcName))
}
p.status = StatusStarted
p.logger.Info(fmt.Sprintf("Script plugin '%s' started", p.name))
return nil
}
// Stop 停止插件
func (p *ScriptPlugin) Stop() error {
p.mu.Lock()
defer p.mu.Unlock()
p.status = StatusStopped
p.logger.Info(fmt.Sprintf("Script plugin '%s' stopped", p.name))
return nil
}
// Shutdown 卸载插件
func (p *ScriptPlugin) Shutdown() error {
p.mu.Lock()
defer p.mu.Unlock()
// 注销所有函数
for funcName := range p.functions {
p.registry.Unregister(funcName)
}
p.status = StatusUnloaded
p.logger.Info(fmt.Sprintf("Script plugin '%s' shutdown", p.name))
return nil
}
// Status 获取插件状态
func (p *ScriptPlugin) Status() PluginStatus {
p.mu.RLock()
defer p.mu.RUnlock()
return p.status
}
// GetScript 获取脚本内容
func (p *ScriptPlugin) GetScript() string {
p.mu.RLock()
defer p.mu.RUnlock()
return p.script
}
// GetFunctions 获取函数列表
func (p *ScriptPlugin) GetFunctions() []string {
p.mu.RLock()
defer p.mu.RUnlock()
funcs := make([]string, 0, len(p.functions))
for name := range p.functions {
funcs = append(funcs, name)
}
return funcs
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。