package plugin import ( "fmt" "sync" "go.uber.org/zap" ) var ( registry []Plugin mu sync.RWMutex ) // Register adds a plugin to the global registry. // Typically called in init() or during application bootstrap. func Register(p Plugin) { mu.Lock() defer mu.Unlock() registry = append(registry, p) } // All returns a copy of all registered plugins. func All() []Plugin { mu.RLock() defer mu.RUnlock() out := make([]Plugin, len(registry)) copy(out, registry) return out } // InitAll initializes all registered plugins in order. func InitAll(log *zap.Logger) error { for _, p := range All() { meta := p.Metadata() log.Info("initializing plugin", zap.String("name", meta.Name), zap.String("version", meta.Version), ) if err := p.Init(); err != nil { return fmt.Errorf("plugin %s init failed: %w", meta.Name, err) } } return nil } // Reset clears the registry. Used in tests only. func Reset() { mu.Lock() defer mu.Unlock() registry = nil }