diff options
Diffstat (limited to 'internal/image/registry.go')
| -rw-r--r-- | internal/image/registry.go | 41 |
1 files changed, 28 insertions, 13 deletions
diff --git a/internal/image/registry.go b/internal/image/registry.go index 4ddb40b..0338115 100644 --- a/internal/image/registry.go +++ b/internal/image/registry.go @@ -2,11 +2,12 @@ package image import ( "fmt" + "reflect" "sync" ) // Factory builds a provider instance. -type Factory func() (ImageProvider, error) +type Factory[C any] func(C) (ImageProvider, error) // Config exposes the configured image provider name. type Config interface { @@ -14,18 +15,18 @@ type Config interface { } // Registry resolves provider names to factories. -type Registry struct { +type Registry[C Config] struct { mu sync.RWMutex - factories map[string]Factory + factories map[string]Factory[C] } // NewRegistry creates an empty provider registry. -func NewRegistry() *Registry { - return &Registry{factories: make(map[string]Factory)} +func NewRegistry[C Config]() *Registry[C] { + return &Registry[C]{factories: make(map[string]Factory[C])} } // Register associates name with a factory. Later registrations replace earlier ones. -func (r *Registry) Register(name string, factory Factory) { +func (r *Registry[C]) Register(name string, factory Factory[C]) { if r == nil || factory == nil { return } @@ -38,13 +39,13 @@ func (r *Registry) Register(name string, factory Factory) { r.mu.Lock() defer r.mu.Unlock() if r.factories == nil { - r.factories = make(map[string]Factory) + r.factories = make(map[string]Factory[C]) } r.factories[normalized] = factory } // Resolve returns the factory registered for name. -func (r *Registry) Resolve(name string) (Factory, bool) { +func (r *Registry[C]) Resolve(name string) (Factory[C], bool) { if r == nil { return nil, false } @@ -56,19 +57,33 @@ func (r *Registry) Resolve(name string) (Factory, bool) { } // New constructs a provider for name. -func (r *Registry) New(name string) (ImageProvider, error) { +func (r *Registry[C]) New(name string, cfg C) (ImageProvider, error) { var zero ImageProvider factory, ok := r.Resolve(name) if !ok { return zero, fmt.Errorf("%w: %s", ErrUnknownProvider, name) } - return factory() + return factory(cfg) } // NewFromConfig resolves the provider name from cfg and constructs it. -func (r *Registry) NewFromConfig(cfg Config) (ImageProvider, error) { - if cfg == nil { +func (r *Registry[C]) NewFromConfig(cfg C) (ImageProvider, error) { + if isNilValue(cfg) { return nil, fmt.Errorf("image config is required") } - return r.New(cfg.ImageProviderName()) + return r.New(cfg.ImageProviderName(), cfg) +} + +func isNilValue[T any](value T) bool { + v := reflect.ValueOf(value) + if !v.IsValid() { + return true + } + + switch v.Kind() { + case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Pointer, reflect.Slice: + return v.IsNil() + default: + return false + } } |
