Ai
1 Star 0 Fork 0

blizzard/dsl

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
script_plugin.go 3.67 KB
一键复制 编辑 原始数据 按行查看 历史
blizzard 提交于 2026-01-07 14:14 +08:00 . feat(v1.1.0): 实现脚本插件系统
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
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/blizzard1413/dsl.git
git@gitee.com:blizzard1413/dsl.git
blizzard1413
dsl
dsl
v1.2.0

搜索帮助