From d4efbb9b229bda0f923273b13de68b3d92711135 Mon Sep 17 00:00:00 2001 From: Vasiliy Tolstov Date: Tue, 3 May 2022 15:19:10 +0300 Subject: [PATCH] metadata: allow to Set/Del multiple items Signed-off-by: Vasiliy Tolstov --- metadata/metadata.go | 30 +++++++++++++++--------------- metadata/metadata_test.go | 15 +++++++++++++++ 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/metadata/metadata.go b/metadata/metadata.go index f3f1c2cf..5cb23b9b 100644 --- a/metadata/metadata.go +++ b/metadata/metadata.go @@ -76,16 +76,23 @@ func (md Metadata) Get(key string) (string, bool) { } // Set is used to store value in metadata -func (md Metadata) Set(key, val string) { - md[textproto.CanonicalMIMEHeaderKey(key)] = val +func (md Metadata) Set(kv ...string) { + if len(kv)%2 == 1 { + kv = kv[:len(kv)-1] + } + for idx := 0; idx < len(kv); idx += 2 { + md[textproto.CanonicalMIMEHeaderKey(kv[idx])] = kv[idx+1] + } } // Del is used to remove value from metadata -func (md Metadata) Del(key string) { - // fast path - delete(md, key) - // slow path - delete(md, textproto.CanonicalMIMEHeaderKey(key)) +func (md Metadata) Del(keys ...string) { + for _, key := range keys { + // fast path + delete(md, key) + // slow path + delete(md, textproto.CanonicalMIMEHeaderKey(key)) + } } // Copy makes a copy of the metadata @@ -129,13 +136,6 @@ func Pairs(kv ...string) (Metadata, bool) { return nil, false } md := New(len(kv) / 2) - var k string - for i, v := range kv { - if i%2 == 0 { - k = v - continue - } - md.Set(k, v) - } + md.Set(kv...) return md, true } diff --git a/metadata/metadata_test.go b/metadata/metadata_test.go index f566d520..eccea7a7 100644 --- a/metadata/metadata_test.go +++ b/metadata/metadata_test.go @@ -5,6 +5,21 @@ import ( "testing" ) +func TestMetadataSetMultiple(t *testing.T) { + md := New(4) + md.Set("key1", "val1", "key2", "val2", "key3") + + if v, ok := md.Get("key1"); !ok || v != "val1" { + t.Fatalf("invalid kv %#+v", md) + } + if v, ok := md.Get("key2"); !ok || v != "val2" { + t.Fatalf("invalid kv %#+v", md) + } + if _, ok := md.Get("key3"); ok { + t.Fatalf("invalid kv %#+v", md) + } +} + func TestAppend(t *testing.T) { ctx := context.Background() ctx = AppendIncomingContext(ctx, "key1", "val1", "key2", "val2")