package setup import ( "context" "forge.cadoles.com/cadoles/bouncer/internal/config" "forge.cadoles.com/cadoles/bouncer/internal/proxy/director" "forge.cadoles.com/cadoles/bouncer/internal/store" "github.com/pkg/errors" ) type Registry struct { layers map[store.LayerType]LayerSetupFunc } type LayerSetupFunc func(context.Context, *config.Config) (director.Layer, error) func (r *Registry) RegisterLayer(layerType store.LayerType, layerSetup LayerSetupFunc) { r.layers[layerType] = layerSetup } func (r *Registry) CreateLayers(ctx context.Context, conf *config.Config) ([]director.Layer, error) { layers := make([]director.Layer, 0, len(r.layers)) for layerType, layerSetup := range r.layers { layer, err := layerSetup(ctx, conf) if err != nil { return nil, errors.Wrapf(err, "could not create layer '%s'", layerType) } layers = append(layers, layer) } return layers, nil } func (r *Registry) LayerTypeExists(layerType store.LayerType) bool { _, exists := r.layers[layerType] return exists } func (r *Registry) GetLayerTypes() []store.LayerType { layerTypes := make([]store.LayerType, 0, len(r.layers)) for layerType := range r.layers { layerTypes = append(layerTypes, layerType) } return layerTypes } func NewRegistry() *Registry { return &Registry{ layers: make(map[store.LayerType]LayerSetupFunc), } }