package repo import ( "fmt" "sync" ) var ( pluginsMu sync.RWMutex plugins = make(map[string]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, plugin RepoManager) { pluginsMu.Lock() defer pluginsMu.Unlock() if plugin == nil { panic("plugin cannot be nil") } if old, exists := plugins[name]; exists { fmt.Printf("WARNING: plugin '%s' already registered (%T), overwriting\n", name, old) } plugins[name] = plugin } func GetPlugin(name string) (RepoManager, bool) { pluginsMu.RLock() defer pluginsMu.RUnlock() plugin, exists := plugins[name] return plugin, exists }