Files
ssq-desk/internal/module/manager.go
2026-01-14 14:17:38 +08:00

120 lines
2.2 KiB
Go

package module
import (
"context"
"fmt"
"sync"
)
// Manager 模块管理器
type Manager struct {
modules map[string]Module
mu sync.RWMutex
}
// NewManager 创建模块管理器
func NewManager() *Manager {
return &Manager{
modules: make(map[string]Module),
}
}
// Register 注册模块
func (m *Manager) Register(module Module) error {
if module == nil {
return fmt.Errorf("模块不能为空")
}
name := module.Name()
if name == "" {
return fmt.Errorf("模块名称不能为空")
}
m.mu.Lock()
defer m.mu.Unlock()
if _, exists := m.modules[name]; exists {
return fmt.Errorf("模块 %s 已存在", name)
}
m.modules[name] = module
return nil
}
// Get 获取模块
func (m *Manager) Get(name string) (Module, bool) {
m.mu.RLock()
defer m.mu.RUnlock()
module, exists := m.modules[name]
return module, exists
}
// GetAll 获取所有模块
func (m *Manager) GetAll() []Module {
m.mu.RLock()
defer m.mu.RUnlock()
modules := make([]Module, 0, len(m.modules))
for _, module := range m.modules {
modules = append(modules, module)
}
return modules
}
// InitAll 初始化所有模块
func (m *Manager) InitAll(ctx context.Context) error {
m.mu.RLock()
defer m.mu.RUnlock()
for name, module := range m.modules {
if err := module.Init(ctx); err != nil {
return fmt.Errorf("初始化模块 %s 失败: %v", name, err)
}
}
return nil
}
// StartAll 启动所有模块
func (m *Manager) StartAll(ctx context.Context) error {
m.mu.RLock()
defer m.mu.RUnlock()
for name, module := range m.modules {
if err := module.Start(ctx); err != nil {
return fmt.Errorf("启动模块 %s 失败: %v", name, err)
}
}
return nil
}
// StopAll 停止所有模块
func (m *Manager) StopAll(ctx context.Context) error {
m.mu.RLock()
defer m.mu.RUnlock()
for name, module := range m.modules {
if err := module.Stop(ctx); err != nil {
return fmt.Errorf("停止模块 %s 失败: %v", name, err)
}
}
return nil
}
// GetAPIs 获取所有模块的 API
func (m *Manager) GetAPIs() []interface{} {
m.mu.RLock()
defer m.mu.RUnlock()
apis := make([]interface{}, 0, len(m.modules))
for _, module := range m.modules {
if api := module.GetAPI(); api != nil {
apis = append(apis, api)
}
}
return apis
}