diff --git a/service.go b/service.go index 23b9eb8..8d9e941 100644 --- a/service.go +++ b/service.go @@ -32,6 +32,10 @@ type ResolveAddressResult struct { Addresses []string `json:"addresses"` } +type ResolveTXTResult struct { + TXT []string `json:"txt"` +} + type ReverseLookupResult struct { Names []string `json:"names"` } @@ -345,11 +349,24 @@ func (service *Service) Resolve(name string) (ResolveAllResult, bool) { } func (service *Service) ResolveTXT(name string) ([]string, bool) { - record, ok := service.findRecord(name) + result, ok := service.ResolveTXTRecords(name) if !ok { return nil, false } - return append([]string(nil), record.TXT...), true + return result.TXT, true +} + +// ResolveTXTRecords returns TXT records wrapped with the RFC field name for action payloads. +// +// service.ResolveTXTRecords("gateway.charon.lthn") +func (service *Service) ResolveTXTRecords(name string) (ResolveTXTResult, bool) { + record, ok := service.findRecord(name) + if !ok { + return ResolveTXTResult{}, false + } + return ResolveTXTResult{ + TXT: append([]string(nil), record.TXT...), + }, true } // DiscoverWithHSD refreshes DNS records for each alias by calling HSD. diff --git a/service_test.go b/service_test.go index 798e9b8..d895ef1 100644 --- a/service_test.go +++ b/service_test.go @@ -92,6 +92,24 @@ func TestServiceResolveTXTUsesWildcard(t *testing.T) { } } +func TestServiceResolveTXTRecordsReturnsNamedField(t *testing.T) { + service := NewService(ServiceOptions{ + Records: map[string]NameRecords{ + "gateway.charon.lthn": { + TXT: []string{"v=lthn1 type=gateway"}, + }, + }, + }) + + result, ok := service.ResolveTXTRecords("gateway.charon.lthn") + if !ok { + t.Fatal("expected named TXT result to resolve") + } + if len(result.TXT) != 1 || result.TXT[0] != "v=lthn1 type=gateway" { + t.Fatalf("unexpected ResolveTXTRecords output: %#v", result.TXT) + } +} + func TestServiceResolveAddressReturnsMergedRecords(t *testing.T) { service := NewService(ServiceOptions{ Records: map[string]NameRecords{