From 3b7ed8434b1bdbf128a8e06775431041996454ed Mon Sep 17 00:00:00 2001 From: Vassiliy Yegorov Date: Fri, 3 Jul 2026 13:41:56 +0700 Subject: [PATCH] =?UTF-8?q?feat(registry):=20=D1=80=D0=B5=D0=B7=D0=BE?= =?UTF-8?q?=D0=BB=D0=B2=D0=B8=D0=BD=D0=B3=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=B9=D0=B4=D0=B5=D1=80=D0=B0=20=D0=BF=D0=BE=20=D0=B8=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/provider/registry/registry.go | 28 +++++++++++++++++ internal/provider/registry/registry_test.go | 35 +++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 internal/provider/registry/registry.go create mode 100644 internal/provider/registry/registry_test.go 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") + } +}