From 4b9b54a901742c8b15c36621f55fc1378509118e Mon Sep 17 00:00:00 2001 From: Evgenii Stratonikov Date: Fri, 4 Apr 2025 17:24:59 +0300 Subject: [PATCH] [#345] netmap: Implement an iterator over node attributes Signed-off-by: Evgenii Stratonikov --- netmap/node_info.go | 13 +++++++++++++ netmap/node_info_test.go | 41 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/netmap/node_info.go b/netmap/node_info.go index a596b2b..acbfaee 100644 --- a/netmap/node_info.go +++ b/netmap/node_info.go @@ -408,8 +408,21 @@ func (x NodeInfo) NumberOfAttributes() int { return len(x.m.GetAttributes()) } +// Attributes returns an iterator over node attributes. +func (x NodeInfo) Attributes() iter.Seq2[string, string] { + return func(yield func(string, string) bool) { + a := x.m.GetAttributes() + for i := range a { + if !yield(a[i].GetKey(), a[i].GetValue()) { + break + } + } + } +} + // IterateAttributes iterates over all node attributes and passes the into f. // Handler MUST NOT be nil. +// Deprecated: use [NodeInfo.Attributes] instead. func (x NodeInfo) IterateAttributes(f func(key, value string)) { a := x.m.GetAttributes() for i := range a { diff --git a/netmap/node_info_test.go b/netmap/node_info_test.go index 8ef9516..990cc26 100644 --- a/netmap/node_info_test.go +++ b/netmap/node_info_test.go @@ -46,6 +46,47 @@ func TestNodeInfo_NetworkEndpoints(t *testing.T) { require.Equal(t, []string{"1", "2", "3"}, res) } +func TestNodeInfo_Attributes(t *testing.T) { + t.Run("empty", func(t *testing.T) { + var n NodeInfo + for range n.Attributes() { + t.Fatalf("handler is called, but it shouldn't") + } + }) + + var n NodeInfo + n.SetAttribute("key1", "value1") + n.SetAttribute("key2", "value2") + n.SetAttribute("key3", "value3") + + t.Run("break", func(t *testing.T) { + var res [][2]string + for k, v := range n.Attributes() { + if k == "key2" { + break + } + res = append(res, [2]string{k, v}) + } + require.Equal(t, [][2]string{{"key1", "value1"}}, res) + }) + t.Run("continue", func(t *testing.T) { + var res [][2]string + for k, v := range n.Attributes() { + if k == "key2" { + continue + } + res = append(res, [2]string{k, v}) + } + require.Equal(t, [][2]string{{"key1", "value1"}, {"key3", "value3"}}, res) + }) + + var res [][2]string + for k, v := range n.Attributes() { + res = append(res, [2]string{k, v}) + } + require.Equal(t, [][2]string{{"key1", "value1"}, {"key2", "value2"}, {"key3", "value3"}}, res) +} + func TestNodeInfo_SetAttribute(t *testing.T) { var n NodeInfo