helpers/vault/internal/registry/registry.go (73 lines of code) (raw):

package registry import ( "fmt" ) type FactoryAlreadyRegisteredError struct { factoryType string factoryName string } func NewFactoryAlreadyRegisteredError(factoryType string, factoryName string) *FactoryAlreadyRegisteredError { return &FactoryAlreadyRegisteredError{ factoryType: factoryType, factoryName: factoryName, } } func (e *FactoryAlreadyRegisteredError) Error() string { return fmt.Sprintf("factory for %s %q already registered", e.factoryType, e.factoryName) } func (e *FactoryAlreadyRegisteredError) Is(err error) bool { eerr, ok := err.(*FactoryAlreadyRegisteredError) if !ok { return false } return eerr.factoryName == e.factoryName } type FactoryNotRegisteredError struct { factoryType string factoryName string } func NewFactoryNotRegisteredError(factoryType string, factoryName string) *FactoryNotRegisteredError { return &FactoryNotRegisteredError{ factoryType: factoryType, factoryName: factoryName, } } func (e *FactoryNotRegisteredError) Error() string { return fmt.Sprintf("factory for %s %q is not registered", e.factoryType, e.factoryName) } func (e *FactoryNotRegisteredError) Is(err error) bool { eerr, ok := err.(*FactoryNotRegisteredError) if !ok { return false } return eerr.factoryName == e.factoryName } type Registry interface { Register(factoryName string, factory interface{}) error Get(factoryName string) (interface{}, error) } type factoryRegistry struct { factoryType string store map[string]interface{} } func (r factoryRegistry) Register(factoryName string, factory interface{}) error { _, ok := r.store[factoryName] if ok { return NewFactoryAlreadyRegisteredError(r.factoryType, factoryName) } r.store[factoryName] = factory return nil } func (r factoryRegistry) Get(factoryName string) (interface{}, error) { factory, ok := r.store[factoryName] if !ok { return nil, NewFactoryNotRegisteredError(r.factoryType, factoryName) } return factory, nil } func New(factoryType string) Registry { return &factoryRegistry{ factoryType: factoryType, store: make(map[string]interface{}), } }