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

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
}