Merge pull request 'issue_296' (#300) from devstigneev/micro:issue_296 into master
Some checks failed
/ autoupdate (push) Failing after 1m21s

Reviewed-on: #300
This commit is contained in:
Василий Толстов 2024-02-28 23:52:30 +03:00
commit 3be0566550
2 changed files with 81 additions and 2 deletions

View File

@ -151,9 +151,19 @@ func ContentType(ct string) Option {
} }
// Metadata pass additional metadata // Metadata pass additional metadata
func Metadata(md metadata.Metadata) Option { func Metadata(md any) Option {
result := metadata.Metadata{}
switch vt := md.(type) {
case metadata.Metadata:
result = metadata.Copy(vt)
case map[string]string:
result = metadata.Copy(vt)
case []string:
result.Set(vt...)
}
return func(src interface{}) error { return func(src interface{}) error {
return Set(src, metadata.Copy(md), ".Metadata") return Set(src, result, ".Metadata")
} }
} }

View File

@ -1,10 +1,13 @@
package options_test package options_test
import ( import (
"fmt"
"testing" "testing"
"go.unistack.org/micro/v4/codec" "go.unistack.org/micro/v4/codec"
"go.unistack.org/micro/v4/metadata"
"go.unistack.org/micro/v4/options" "go.unistack.org/micro/v4/options"
"go.unistack.org/micro/v4/util/reflect"
) )
func TestAddress(t *testing.T) { func TestAddress(t *testing.T) {
@ -84,3 +87,69 @@ func TestLabels(t *testing.T) {
t.Fatal("failed to set labels") t.Fatal("failed to set labels")
} }
} }
func TestMetadataAny(t *testing.T) {
type s struct {
Metadata metadata.Metadata
}
testCases := []struct {
Name string
Data any
Expected metadata.Metadata
}{
{
"strings_even",
[]string{"key1", "val1", "key2", "val2"},
metadata.Metadata{
"Key1": "val1",
"Key2": "val2",
},
},
{
"strings_odd",
[]string{"key1", "val1", "key2"},
metadata.Metadata{
"Key1": "val1",
},
},
{
"map",
map[string]string{
"key1": "val1",
"key2": "val2",
},
metadata.Metadata{
"Key1": "val1",
"Key2": "val2",
},
},
{
"metadata.Metadata",
metadata.Metadata{
"key1": "val1",
"key2": "val2",
},
metadata.Metadata{
"Key1": "val1",
"Key2": "val2",
},
},
}
for _, tt := range testCases {
t.Run(tt.Name, func(t *testing.T) {
src := &s{}
var opts []options.Option
opts = append(opts, options.Metadata(tt.Data))
for _, o := range opts {
if err := o(src); err != nil {
t.Fatal(err)
}
if !reflect.Equal(tt.Expected, src.Metadata) {
t.Fatal(fmt.Sprintf("expected: %v, actual: %v", tt.Expected, src.Metadata))
}
}
})
}
}