mirror of
https://github.com/m1k1o/neko.git
synced 2024-07-24 14:40:50 +12:00
82 lines
1.5 KiB
Go
82 lines
1.5 KiB
Go
package types
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
|
|
"github.com/demodesk/neko/pkg/utils"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
var (
|
|
ErrPluginSettingsNotFound = errors.New("plugin settings not found")
|
|
)
|
|
|
|
type Plugin interface {
|
|
Name() string
|
|
Config() PluginConfig
|
|
Start(PluginManagers) error
|
|
Shutdown() error
|
|
}
|
|
|
|
type DependablePlugin interface {
|
|
Plugin
|
|
DependsOn() []string
|
|
}
|
|
|
|
type ExposablePlugin interface {
|
|
Plugin
|
|
ExposeService() any
|
|
}
|
|
|
|
type PluginConfig interface {
|
|
Init(cmd *cobra.Command) error
|
|
Set()
|
|
}
|
|
|
|
type PluginMetadata struct {
|
|
Name string
|
|
IsDependable bool
|
|
IsExposable bool
|
|
DependsOn []string `json:",omitempty"`
|
|
}
|
|
|
|
type PluginManagers struct {
|
|
SessionManager SessionManager
|
|
WebSocketManager WebSocketManager
|
|
ApiManager ApiManager
|
|
LoadServiceFromPlugin func(string) (any, error)
|
|
}
|
|
|
|
func (p *PluginManagers) Validate() error {
|
|
if p.SessionManager == nil {
|
|
return errors.New("SessionManager is nil")
|
|
}
|
|
|
|
if p.WebSocketManager == nil {
|
|
return errors.New("WebSocketManager is nil")
|
|
}
|
|
|
|
if p.ApiManager == nil {
|
|
return errors.New("ApiManager is nil")
|
|
}
|
|
|
|
if p.LoadServiceFromPlugin == nil {
|
|
return errors.New("LoadServiceFromPlugin is nil")
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
type PluginSettings map[string]any
|
|
|
|
func (p PluginSettings) Unmarshal(name string, def any) error {
|
|
if p == nil {
|
|
return fmt.Errorf("%w: %s", ErrPluginSettingsNotFound, name)
|
|
}
|
|
if _, ok := p[name]; !ok {
|
|
return fmt.Errorf("%w: %s", ErrPluginSettingsNotFound, name)
|
|
}
|
|
return utils.Decode(p[name], def)
|
|
}
|