issue_296 #300
@ -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")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user