diff --git a/internal/provider/registry/registry.go b/internal/provider/registry/registry.go new file mode 100644 index 0000000..05fa8a2 --- /dev/null +++ b/internal/provider/registry/registry.go @@ -0,0 +1,28 @@ +package registry + +import ( + "fmt" + + "github.com/vasyakrg/dns-autoresolver/internal/provider" +) + +// Registry resolves providers by name. +type Registry struct { + m map[string]provider.Provider +} + +func New() *Registry { + return &Registry{m: make(map[string]provider.Provider)} +} + +func (r *Registry) Register(p provider.Provider) { + r.m[p.Name()] = p +} + +func (r *Registry) ByName(name string) (provider.Provider, error) { + p, ok := r.m[name] + if !ok { + return nil, fmt.Errorf("registry: unknown provider %q", name) + } + return p, nil +} diff --git a/internal/provider/registry/registry_test.go b/internal/provider/registry/registry_test.go new file mode 100644 index 0000000..b720b3c --- /dev/null +++ b/internal/provider/registry/registry_test.go @@ -0,0 +1,35 @@ +package registry + +import ( + "context" + "testing" + + "github.com/vasyakrg/dns-autoresolver/internal/diff" + "github.com/vasyakrg/dns-autoresolver/internal/model" + "github.com/vasyakrg/dns-autoresolver/internal/provider" +) + +type fakeProvider struct{ name string } + +func (f fakeProvider) Name() string { return f.name } +func (fakeProvider) ListZones(context.Context, provider.Credentials) ([]provider.Zone, error) { + return nil, nil +} +func (fakeProvider) GetRecords(context.Context, provider.Credentials, string) ([]model.Record, error) { + return nil, nil +} +func (fakeProvider) ApplyChanges(context.Context, provider.Credentials, string, diff.Changeset) error { + return nil +} + +func TestRegistryByName(t *testing.T) { + r := New() + r.Register(fakeProvider{name: "selectel"}) + p, err := r.ByName("selectel") + if err != nil || p.Name() != "selectel" { + t.Fatalf("expected selectel, got %v err=%v", p, err) + } + if _, err := r.ByName("unknown"); err == nil { + t.Fatal("expected error for unknown provider") + } +}