From 0f2f2d195ff5bc05e375cba154ee7f2a218ba721 Mon Sep 17 00:00:00 2001 From: Virgil Date: Fri, 3 Apr 2026 21:30:08 +0000 Subject: [PATCH] Add service auto-registration helper --- action.go | 10 ++++++++++ service_test.go | 31 +++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/action.go b/action.go index f0c10fb..c9d246a 100644 --- a/action.go +++ b/action.go @@ -165,6 +165,16 @@ func (service *Service) RegisterActions(registrar ActionRegistrar) { } } +// NewServiceWithRegistrar builds a DNS service and registers its actions in one step. +// +// service := dns.NewServiceWithRegistrar(dns.ServiceOptions{}, registrar) +// // registrar now exposes dns.resolve, dns.resolve.txt, dns.resolve.all, dns.reverse, dns.serve, dns.health, dns.discover +func NewServiceWithRegistrar(options ServiceOptions, registrar ActionRegistrar) *Service { + service := NewService(options) + service.RegisterActions(registrar) + return service +} + // HandleAction executes a DNS action by name. // // payload, ok, err := service.HandleAction(ActionResolve, map[string]any{ diff --git a/service_test.go b/service_test.go index 7f719b6..e7c2b8a 100644 --- a/service_test.go +++ b/service_test.go @@ -1566,6 +1566,37 @@ func TestServiceRegisterActionsPublishesAllActionsInOrder(t *testing.T) { } } +func TestNewServiceWithRegistrarBuildsAndRegistersInOneStep(t *testing.T) { + registrar := &actionRecorder{} + service := NewServiceWithRegistrar(ServiceOptions{ + Records: map[string]NameRecords{ + "gateway.charon.lthn": { + A: []string{"10.10.10.10"}, + }, + }, + }, registrar) + + if service == nil { + t.Fatal("expected service to be built") + } + + if len(registrar.names) != len(service.ActionNames()) { + t.Fatalf("expected helper to register all actions, got %#v", registrar.names) + } + + payload, ok, err := registrar.handlers[ActionResolve](map[string]any{"name": "gateway.charon.lthn"}) + if err != nil { + t.Fatalf("unexpected registered handler error: %v", err) + } + if !ok { + t.Fatal("expected registered handler to resolve") + } + result, ok := payload.(ResolveAddressResult) + if !ok || len(result.Addresses) != 1 || result.Addresses[0] != "10.10.10.10" { + t.Fatalf("unexpected registered handler payload: %#v", payload) + } +} + func TestServiceActionDefinitionsHaveInvokers(t *testing.T) { service := NewService(ServiceOptions{ Records: map[string]NameRecords{