diff --git a/metadata/context.go b/metadata/context.go index 858566d1..9e7cf4de 100644 --- a/metadata/context.go +++ b/metadata/context.go @@ -108,7 +108,11 @@ func NewOutgoingContext(ctx context.Context, md Metadata) context.Context { } // AppendOutgoingContext apends new md to context -func AppendOutgoingContext(ctx context.Context, md Metadata) context.Context { +func AppendOutgoingContext(ctx context.Context, kv ...string) context.Context { + md, ok := Pairs(kv...) + if !ok { + return ctx + } omd, ok := FromOutgoingContext(ctx) if !ok { return NewOutgoingContext(ctx, md) @@ -120,7 +124,11 @@ func AppendOutgoingContext(ctx context.Context, md Metadata) context.Context { } // AppendIncomingContext apends new md to context -func AppendIncomingContext(ctx context.Context, md Metadata) context.Context { +func AppendIncomingContext(ctx context.Context, kv ...string) context.Context { + md, ok := Pairs(kv...) + if !ok { + return ctx + } omd, ok := FromIncomingContext(ctx) if !ok { return NewIncomingContext(ctx, md) diff --git a/metadata/metadata.go b/metadata/metadata.go index 9428fe27..1f581554 100644 --- a/metadata/metadata.go +++ b/metadata/metadata.go @@ -111,3 +111,19 @@ func Merge(omd Metadata, mmd Metadata, overwrite bool) Metadata { } return nmd } + +func Pairs(kv ...string) (Metadata, bool) { + if len(kv)%2 == 1 { + 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) + } + return md, true +} diff --git a/metadata/metadata_test.go b/metadata/metadata_test.go index f580f5aa..f8215150 100644 --- a/metadata/metadata_test.go +++ b/metadata/metadata_test.go @@ -5,6 +5,28 @@ import ( "testing" ) +func TestAppend(t *testing.T) { + ctx := context.Background() + ctx = AppendIncomingContext(ctx, "key1", "val1", "key2", "val2") + md, ok := FromIncomingContext(ctx) + if !ok { + t.Fatal("metadata empty") + } + if _, ok := md.Get("key1"); !ok { + t.Fatal("key1 not found") + } +} + +func TestPairs(t *testing.T) { + md, ok := Pairs("key1", "val1", "key2", "val2") + if !ok { + t.Fatal("odd number of kv") + } + if _, ok = md.Get("key1"); !ok { + t.Fatal("key1 not found") + } +} + func testCtx(ctx context.Context) { md := New(2) md.Set("Key1", "Val1_new")