metadata: allow to Set/Del multiple items
Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
This commit is contained in:
		| @@ -76,16 +76,23 @@ func (md Metadata) Get(key string) (string, bool) { | |||||||
| } | } | ||||||
|  |  | ||||||
| // Set is used to store value in metadata | // Set is used to store value in metadata | ||||||
| func (md Metadata) Set(key, val string) { | func (md Metadata) Set(kv ...string) { | ||||||
| 	md[textproto.CanonicalMIMEHeaderKey(key)] = val | 	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 | // Del is used to remove value from metadata | ||||||
| func (md Metadata) Del(key string) { | func (md Metadata) Del(keys ...string) { | ||||||
| 	// fast path | 	for _, key := range keys { | ||||||
| 	delete(md, key) | 		// fast path | ||||||
| 	// slow path | 		delete(md, key) | ||||||
| 	delete(md, textproto.CanonicalMIMEHeaderKey(key)) | 		// slow path | ||||||
|  | 		delete(md, textproto.CanonicalMIMEHeaderKey(key)) | ||||||
|  | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| // Copy makes a copy of the metadata | // Copy makes a copy of the metadata | ||||||
| @@ -129,13 +136,6 @@ func Pairs(kv ...string) (Metadata, bool) { | |||||||
| 		return nil, false | 		return nil, false | ||||||
| 	} | 	} | ||||||
| 	md := New(len(kv) / 2) | 	md := New(len(kv) / 2) | ||||||
| 	var k string | 	md.Set(kv...) | ||||||
| 	for i, v := range kv { |  | ||||||
| 		if i%2 == 0 { |  | ||||||
| 			k = v |  | ||||||
| 			continue |  | ||||||
| 		} |  | ||||||
| 		md.Set(k, v) |  | ||||||
| 	} |  | ||||||
| 	return md, true | 	return md, true | ||||||
| } | } | ||||||
|   | |||||||
| @@ -5,6 +5,21 @@ import ( | |||||||
| 	"testing" | 	"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) { | func TestAppend(t *testing.T) { | ||||||
| 	ctx := context.Background() | 	ctx := context.Background() | ||||||
| 	ctx = AppendIncomingContext(ctx, "key1", "val1", "key2", "val2") | 	ctx = AppendIncomingContext(ctx, "key1", "val1", "key2", "val2") | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user