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 }