mirror of
https://github.com/m1k1o/neko.git
synced 2025-05-31 09:57:08 +02:00
load plugins in order of dependencies.
This commit is contained in:
parent
cd2d9b413d
commit
49ff490640
7 changed files with 804 additions and 33 deletions
|
@ -16,18 +16,22 @@ import (
|
|||
|
||||
type ManagerCtx struct {
|
||||
logger zerolog.Logger
|
||||
plugins map[string]types.Plugin
|
||||
plugins dependiencies
|
||||
}
|
||||
|
||||
func New(config *config.Plugins) *ManagerCtx {
|
||||
manager := &ManagerCtx{
|
||||
logger: log.With().Str("module", "plugins").Logger(),
|
||||
plugins: map[string]types.Plugin{},
|
||||
logger: log.With().Str("module", "plugins").Logger(),
|
||||
plugins: dependiencies{
|
||||
deps: make(map[string]*dependency),
|
||||
},
|
||||
}
|
||||
|
||||
manager.plugins.logger = manager.logger
|
||||
|
||||
if config.Enabled {
|
||||
err := manager.loadDir(config.Dir)
|
||||
manager.logger.Err(err).Msgf("loading finished, total %d plugins", len(manager.plugins))
|
||||
manager.logger.Err(err).Msgf("loading finished, total %d plugins", manager.plugins.len())
|
||||
}
|
||||
|
||||
return manager
|
||||
|
@ -45,7 +49,6 @@ func (manager *ManagerCtx) loadDir(dir string) error {
|
|||
|
||||
err = manager.load(path)
|
||||
manager.logger.Err(err).Str("plugin", path).Msg("loading a plugin")
|
||||
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
@ -66,27 +69,28 @@ func (manager *ManagerCtx) load(path string) error {
|
|||
return fmt.Errorf("not a valid plugin")
|
||||
}
|
||||
|
||||
_, ok = manager.plugins[p.Name()]
|
||||
if ok {
|
||||
return fmt.Errorf("plugin '%s' already exists", p.Name())
|
||||
if err = manager.plugins.addPlugin(p); err != nil {
|
||||
return fmt.Errorf("failed to add plugin '%s': %w", p.Name(), err)
|
||||
}
|
||||
|
||||
manager.plugins[p.Name()] = p
|
||||
manager.logger.Info().Msgf("loaded plugin '%s', total %d plugins", p.Name(), manager.plugins.len())
|
||||
return nil
|
||||
}
|
||||
|
||||
func (manager *ManagerCtx) InitConfigs(cmd *cobra.Command) {
|
||||
for path, plug := range manager.plugins {
|
||||
if err := plug.Config().Init(cmd); err != nil {
|
||||
log.Err(err).Str("plugin", path).Msg("unable to initialize configuration")
|
||||
_ = manager.plugins.forEach(func(plug *dependency) error {
|
||||
if err := plug.plugin.Config().Init(cmd); err != nil {
|
||||
log.Err(err).Str("plugin", plug.plugin.Name()).Msg("unable to initialize configuration")
|
||||
}
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
func (manager *ManagerCtx) SetConfigs() {
|
||||
for _, plug := range manager.plugins {
|
||||
plug.Config().Set()
|
||||
}
|
||||
_ = manager.plugins.forEach(func(plug *dependency) error {
|
||||
plug.plugin.Config().Set()
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
func (manager *ManagerCtx) Start(
|
||||
|
@ -94,34 +98,30 @@ func (manager *ManagerCtx) Start(
|
|||
webSocketManager types.WebSocketManager,
|
||||
apiManager types.ApiManager,
|
||||
) {
|
||||
for path, plug := range manager.plugins {
|
||||
err := plug.Start(types.PluginManagers{
|
||||
SessionManager: sessionManager,
|
||||
WebSocketManager: webSocketManager,
|
||||
ApiManager: apiManager,
|
||||
LoadServiceFromPlugin: manager.LookupService,
|
||||
})
|
||||
|
||||
manager.logger.Err(err).Str("plugin", path).Msg("plugin start")
|
||||
}
|
||||
_ = manager.plugins.start(types.PluginManagers{
|
||||
SessionManager: sessionManager,
|
||||
WebSocketManager: webSocketManager,
|
||||
ApiManager: apiManager,
|
||||
LoadServiceFromPlugin: manager.LookupService,
|
||||
})
|
||||
}
|
||||
|
||||
func (manager *ManagerCtx) Shutdown() error {
|
||||
for path, plug := range manager.plugins {
|
||||
err := plug.Shutdown()
|
||||
manager.logger.Err(err).Str("plugin", path).Msg("plugin shutdown")
|
||||
}
|
||||
|
||||
_ = manager.plugins.forEach(func(plug *dependency) error {
|
||||
err := plug.plugin.Shutdown()
|
||||
manager.logger.Err(err).Str("plugin", plug.plugin.Name()).Msg("plugin shutdown")
|
||||
return nil
|
||||
})
|
||||
return nil
|
||||
}
|
||||
|
||||
func (manager *ManagerCtx) LookupService(pluginName string) (any, error) {
|
||||
plug, ok := manager.plugins[pluginName]
|
||||
plug, ok := manager.plugins.findPlugin(pluginName)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("plugin '%s' not found", pluginName)
|
||||
}
|
||||
|
||||
expPlug, ok := plug.(types.ExposablePlugin)
|
||||
expPlug, ok := plug.plugin.(types.ExposablePlugin)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("plugin '%s' is not exposable", pluginName)
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue