diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b3286a..09fd03b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,20 @@ The format is based on [Keep a Changelog], and this project adheres to [keep a changelog]: https://keepachangelog.com/en/1.0.0/ [semantic versioning]: https://semver.org/spec/v2.0.0.html +## [Unreleased] + +### Added + +- Added `dnssd.AttributeCollection` type + +### Changed + +- **[BC]** Changed `dnssd.ServiceInstance.Attributes` type from `[]Attributes` to `AttributeCollection` + +### Removed + +- **[BC]** Removed `dnssd.AttributeCollectionsEqual()` function + ## [0.3.1] - 2023-08-15 ### Changed diff --git a/dnssd/attributes.go b/dnssd/attributes.go index 36c83d6..3f7b702 100644 --- a/dnssd/attributes.go +++ b/dnssd/attributes.go @@ -315,18 +315,22 @@ func normalizeAttributeKey(k string) (string, error) { return w.String(), nil } -// AttributeCollectionsEqual returns true if lhs and rhs contain the same sets -// of attributes, in any order. -func AttributeCollectionsEqual(lhs, rhs []Attributes) bool { - if len(lhs) != len(rhs) { +// AttributeCollection is a collection of [Attributes]. Each entry in the slice +// contains the attributes conveyed in a separate TXT record. +type AttributeCollection []Attributes + +// Equal returns true if c and x contain the same sets of attributes, in any +// order. +func (c AttributeCollection) Equal(x AttributeCollection) bool { + if len(c) != len(x) { return false } - visited := make([]bool, len(rhs)) + visited := make([]bool, len(x)) left: - for _, l := range lhs { - for i, r := range rhs { + for _, l := range c { + for i, r := range x { if visited[i] { continue } diff --git a/dnssd/instance.go b/dnssd/instance.go index 22aa6ba..91f26b9 100644 --- a/dnssd/instance.go +++ b/dnssd/instance.go @@ -52,7 +52,7 @@ type ServiceInstance struct { // // An empty slice is a valid representation of an instance with a single // empty TXT record. - Attributes []Attributes + Attributes AttributeCollection // TTL is the time-to-live of the instance's DNS records. TTL time.Duration @@ -65,6 +65,6 @@ func (i ServiceInstance) Equal(inst ServiceInstance) bool { i.TargetPort == inst.TargetPort && i.Priority == inst.Priority && i.Weight == inst.Weight && - AttributeCollectionsEqual(i.Attributes, inst.Attributes) && + i.Attributes.Equal(inst.Attributes) && i.TTL == inst.TTL } diff --git a/dnssd/instance_test.go b/dnssd/instance_test.go index 358b771..edd1150 100644 --- a/dnssd/instance_test.go +++ b/dnssd/instance_test.go @@ -32,7 +32,7 @@ var _ = Describe("type ServiceInstance", func() { TargetPort: 80, Priority: 10, Weight: 20, - Attributes: []Attributes{ + Attributes: AttributeCollection{ NewAttributes(). WithPair("txtvers", []byte{1}). WithFlag("default"), @@ -49,7 +49,7 @@ var _ = Describe("type ServiceInstance", func() { TargetPort: 80, Priority: 10, Weight: 20, - Attributes: []Attributes{ + Attributes: AttributeCollection{ NewAttributes(). WithPair("txtvers", []byte{1}). WithFlag("default"), @@ -60,7 +60,7 @@ var _ = Describe("type ServiceInstance", func() { Entry( "attributes in a different order", ServiceInstance{ - Attributes: []Attributes{ + Attributes: AttributeCollection{ NewAttributes(). WithPair("txtvers", []byte{1}). WithFlag("default"), @@ -69,7 +69,7 @@ var _ = Describe("type ServiceInstance", func() { }, }, ServiceInstance{ - Attributes: []Attributes{ + Attributes: AttributeCollection{ NewAttributes(). WithPair("txtvers", []byte{2}), NewAttributes(). @@ -81,7 +81,7 @@ var _ = Describe("type ServiceInstance", func() { Entry( "multiple copies of the same set of attributes", ServiceInstance{ - Attributes: []Attributes{ + Attributes: AttributeCollection{ NewAttributes(). WithPair("txtvers", []byte{1}), NewAttributes(). @@ -89,7 +89,7 @@ var _ = Describe("type ServiceInstance", func() { }, }, ServiceInstance{ - Attributes: []Attributes{ + Attributes: AttributeCollection{ NewAttributes(). WithPair("txtvers", []byte{1}), NewAttributes(). @@ -170,13 +170,13 @@ var _ = Describe("type ServiceInstance", func() { Entry( "different attributes", ServiceInstance{ - Attributes: []Attributes{ + Attributes: AttributeCollection{ NewAttributes(). WithPair("txtvers", []byte{1}), }, }, ServiceInstance{ - Attributes: []Attributes{ + Attributes: AttributeCollection{ NewAttributes(). WithPair("txtvers", []byte{2}), }, @@ -185,13 +185,13 @@ var _ = Describe("type ServiceInstance", func() { Entry( "different attributes - flag vs empty value", ServiceInstance{ - Attributes: []Attributes{ + Attributes: AttributeCollection{ NewAttributes(). WithPair("flag", nil), }, }, ServiceInstance{ - Attributes: []Attributes{ + Attributes: AttributeCollection{ NewAttributes(). WithFlag("flag"), }, @@ -200,13 +200,13 @@ var _ = Describe("type ServiceInstance", func() { Entry( "different attributes - subset", ServiceInstance{ - Attributes: []Attributes{ + Attributes: AttributeCollection{ NewAttributes(). WithPair("txtvers", []byte{1}), }, }, ServiceInstance{ - Attributes: []Attributes{ + Attributes: AttributeCollection{ NewAttributes(). WithPair("txtvers", []byte{1}), // <-- same NewAttributes(). @@ -217,7 +217,7 @@ var _ = Describe("type ServiceInstance", func() { Entry( "different attributes - multiple copies of the same set of attributes", ServiceInstance{ - Attributes: []Attributes{ + Attributes: AttributeCollection{ NewAttributes(). WithPair("txtvers", []byte{1}), // <-- same NewAttributes(). @@ -225,7 +225,7 @@ var _ = Describe("type ServiceInstance", func() { }, }, ServiceInstance{ - Attributes: []Attributes{ + Attributes: AttributeCollection{ NewAttributes(). WithPair("txtvers", []byte{1}), // <-- same NewAttributes(). diff --git a/dnssd/records_test.go b/dnssd/records_test.go index f95757a..f67fe0f 100644 --- a/dnssd/records_test.go +++ b/dnssd/records_test.go @@ -23,7 +23,7 @@ var _ = Context("DNS records", func() { TargetPort: 12345, Priority: 10, Weight: 20, - Attributes: []Attributes{ + Attributes: AttributeCollection{ NewAttributes(). WithPair("", []byte("")), }, @@ -220,7 +220,7 @@ var _ = Context("DNS records", func() { }) It("returns a single empty record if there are only empty attribute collections", func() { - instance.Attributes = []Attributes{{}, {}} + instance.Attributes = AttributeCollection{{}, {}} rec := NewTXTRecords(instance) Expect(rec).To(ConsistOf( diff --git a/dnssd/unicastresolver_test.go b/dnssd/unicastresolver_test.go index c783b53..890b18a 100644 --- a/dnssd/unicastresolver_test.go +++ b/dnssd/unicastresolver_test.go @@ -34,7 +34,7 @@ var _ = Context("UnicastResolver", func() { TargetPort: 12345, Priority: 10, Weight: 20, - Attributes: []Attributes{ + Attributes: AttributeCollection{ NewAttributes(). WithPair("", []byte("")), }, @@ -51,7 +51,7 @@ var _ = Context("UnicastResolver", func() { TargetPort: 12345, Priority: 10, Weight: 20, - Attributes: []Attributes{ + Attributes: AttributeCollection{ NewAttributes(). WithPair("", []byte("")), NewAttributes(). diff --git a/dnssd/unicastserver_test.go b/dnssd/unicastserver_test.go index 84b21cf..4251d5b 100644 --- a/dnssd/unicastserver_test.go +++ b/dnssd/unicastserver_test.go @@ -32,7 +32,7 @@ var _ = Context("UnicastServer", func() { TargetPort: 12345, Priority: 10, Weight: 20, - Attributes: []Attributes{ + Attributes: AttributeCollection{ NewAttributes(). WithPair("", []byte("")), }, @@ -48,7 +48,7 @@ var _ = Context("UnicastServer", func() { TargetPort: 12345, Priority: 10, Weight: 20, - Attributes: []Attributes{ + Attributes: AttributeCollection{ NewAttributes(). WithPair("", []byte("")), NewAttributes().