120 lines
2.2 KiB
Go
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
|
|
}
|