freeleaps-ops/operators/freeleaps-gitops-initializer/internal/repo/plugin.go
zhenyus f34f9838a5 chore(git): code staging
Signed-off-by: zhenyus <zhenyus@mathmast.com>
2025-02-17 18:14:40 +08:00

64 lines
1.1 KiB
Go

package repo
import (
"fmt"
"sync"
)
var (
pluginsMu sync.RWMutex
plugins = make(map[string]PluginCreateFunc)
)
type PluginCreateFunc func() RepoManager
type PluginConfig interface {
Get(key string) (any, error)
Set(key string, value any)
}
type pluginConfig struct {
config map[string]any
}
func (c *pluginConfig) Get(key string) (any, error) {
val, exists := c.config[key]
if !exists {
return "", fmt.Errorf("key %s not found", key)
}
return val, nil
}
func (c *pluginConfig) Set(key string, value any) {
c.config[key] = value
}
func NewPluginConfig() PluginConfig {
return &pluginConfig{
config: make(map[string]any),
}
}
func RegisterPlugin(name string, fun PluginCreateFunc) {
pluginsMu.Lock()
defer pluginsMu.Unlock()
if fun == nil {
panic("plugin create func cannot be nil")
}
if old, exists := plugins[name]; exists {
fmt.Printf("WARNING: plugin '%s' already registered (%T), overwriting\n", name, old)
}
plugins[name] = fun
}
func GetPlugin(name string) (RepoManager, bool) {
pluginsMu.RLock()
defer pluginsMu.RUnlock()
fun, exists := plugins[name]
return fun(), exists
}