You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
2.6 KiB
Go
135 lines
2.6 KiB
Go
package plugin
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"sync"
|
|
|
|
"github.com/noahlann/nnet/pkg/config"
|
|
pluginpkg "github.com/noahlann/nnet/pkg/plugin"
|
|
)
|
|
|
|
// manager 插件管理器实现
|
|
type manager struct {
|
|
plugins map[string]pluginpkg.Plugin
|
|
mu sync.RWMutex
|
|
}
|
|
|
|
// NewManager 创建插件管理器
|
|
func NewManager() pluginpkg.Manager {
|
|
return &manager{
|
|
plugins: make(map[string]pluginpkg.Plugin),
|
|
}
|
|
}
|
|
|
|
// Register 注册插件
|
|
func (m *manager) Register(plugin pluginpkg.Plugin) error {
|
|
if plugin == nil {
|
|
return fmt.Errorf("plugin cannot be nil")
|
|
}
|
|
|
|
name := plugin.Name()
|
|
if name == "" {
|
|
return fmt.Errorf("plugin name cannot be empty")
|
|
}
|
|
|
|
m.mu.Lock()
|
|
defer m.mu.Unlock()
|
|
|
|
if _, exists := m.plugins[name]; exists {
|
|
return fmt.Errorf("plugin %s already registered", name)
|
|
}
|
|
|
|
m.plugins[name] = plugin
|
|
return nil
|
|
}
|
|
|
|
// Unregister 取消注册插件
|
|
func (m *manager) Unregister(name string) error {
|
|
m.mu.Lock()
|
|
defer m.mu.Unlock()
|
|
|
|
plugin, exists := m.plugins[name]
|
|
if !exists {
|
|
return fmt.Errorf("plugin %s not found", name)
|
|
}
|
|
|
|
// 停止插件
|
|
ctx := context.Background()
|
|
if err := plugin.Stop(ctx); err != nil {
|
|
return fmt.Errorf("failed to stop plugin %s: %w", name, err)
|
|
}
|
|
|
|
delete(m.plugins, name)
|
|
return nil
|
|
}
|
|
|
|
// Get 获取插件
|
|
func (m *manager) Get(name string) (pluginpkg.Plugin, error) {
|
|
m.mu.RLock()
|
|
defer m.mu.RUnlock()
|
|
|
|
plugin, exists := m.plugins[name]
|
|
if !exists {
|
|
return nil, fmt.Errorf("plugin %s not found", name)
|
|
}
|
|
|
|
return plugin, nil
|
|
}
|
|
|
|
// List 列出所有插件
|
|
func (m *manager) List() []pluginpkg.Plugin {
|
|
m.mu.RLock()
|
|
defer m.mu.RUnlock()
|
|
|
|
plugins := make([]pluginpkg.Plugin, 0, len(m.plugins))
|
|
for _, plugin := range m.plugins {
|
|
plugins = append(plugins, plugin)
|
|
}
|
|
|
|
return plugins
|
|
}
|
|
|
|
// InitAll 初始化所有插件
|
|
func (m *manager) InitAll(config *config.Config) error {
|
|
m.mu.RLock()
|
|
defer m.mu.RUnlock()
|
|
|
|
for name, plugin := range m.plugins {
|
|
if err := plugin.Init(config); err != nil {
|
|
return fmt.Errorf("failed to init plugin %s: %w", name, err)
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// StartAll 启动所有插件
|
|
func (m *manager) StartAll(ctx context.Context) error {
|
|
m.mu.RLock()
|
|
defer m.mu.RUnlock()
|
|
|
|
for name, plugin := range m.plugins {
|
|
if err := plugin.Start(ctx); err != nil {
|
|
return fmt.Errorf("failed to start plugin %s: %w", name, err)
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// StopAll 停止所有插件
|
|
func (m *manager) StopAll(ctx context.Context) error {
|
|
m.mu.RLock()
|
|
defer m.mu.RUnlock()
|
|
|
|
for name, plugin := range m.plugins {
|
|
if err := plugin.Stop(ctx); err != nil {
|
|
return fmt.Errorf("failed to stop plugin %s: %w", name, err)
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|