registry.go 1.3 KB
Newer Older
Y
Yaron Schneider 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
package bindings

import (
	"fmt"
	"sync"
)

type BindingsRegistry interface {
	CreateInputBinding(name string) (InputBinding, error)
	CreateOutputBinding(name string) (OutputBinding, error)
}

type bindingsRegistry struct {
	inputBindings  map[string]InputBinding
	outputBindings map[string]OutputBinding
}

var instance *bindingsRegistry
var once sync.Once

func NewBindingsRegistry() BindingsRegistry {
	once.Do(func() {
		instance = &bindingsRegistry{
			inputBindings:  map[string]InputBinding{},
			outputBindings: map[string]OutputBinding{},
		}
	})
	return instance
}

func RegisterInputBinding(name string, binding InputBinding) {
	instance.inputBindings[fmt.Sprintf("bindings.%s", name)] = binding
}

func RegisterOutputBinding(name string, binding OutputBinding) {
	instance.outputBindings[fmt.Sprintf("bindings.%s", name)] = binding
}

func (b *bindingsRegistry) CreateInputBinding(name string) (InputBinding, error) {
	for key, binding := range b.inputBindings {
		if key == name {
			return binding, nil
		}
	}

	return nil, fmt.Errorf("couldn't find input binding %s", name)
}

func (b *bindingsRegistry) CreateOutputBinding(name string) (OutputBinding, error) {
	for key, binding := range b.outputBindings {
		if key == name {
			return binding, nil
		}
	}

	return nil, fmt.Errorf("couldn't find output binding %s", name)
}