From 9dd64b1d81a5b9dd6ad0c3ca62946460766825b4 Mon Sep 17 00:00:00 2001 From: Evstigneev Denis Date: Thu, 29 Feb 2024 00:19:31 +0300 Subject: [PATCH 1/2] add variadic --- options/options.go | 30 ++++++++++++++++++++++-------- options/options_test.go | 18 ++++++++++++------ 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/options/options.go b/options/options.go index 226fd5e4..2e611b75 100644 --- a/options/options.go +++ b/options/options.go @@ -151,15 +151,29 @@ func ContentType(ct string) Option { } // Metadata pass additional metadata -func Metadata(md any) 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...) + + if len(md) > 1 { + var tmp []string + for _, val := range md { + switch vt := val.(type) { + case string: + tmp = append(tmp, vt) + default: + return func(src interface{}) error { + return Set(src, result, ".Metadata") + } + } + } + result.Set(tmp...) + } else if len(md) == 1 { + switch vt := md[0].(type) { + case metadata.Metadata: + result = metadata.Copy(vt) + case map[string]string: + result = metadata.Copy(vt) + } } return func(src interface{}) error { diff --git a/options/options_test.go b/options/options_test.go index 1bb0ce23..a2f26e8a 100644 --- a/options/options_test.go +++ b/options/options_test.go @@ -100,7 +100,7 @@ func TestMetadataAny(t *testing.T) { }{ { "strings_even", - []string{"key1", "val1", "key2", "val2"}, + []any{"key1", "val1", "key2", "val2"}, metadata.Metadata{ "Key1": "val1", "Key2": "val2", @@ -108,18 +108,18 @@ func TestMetadataAny(t *testing.T) { }, { "strings_odd", - []string{"key1", "val1", "key2"}, + []any{"key1", "val1", "key2"}, metadata.Metadata{ "Key1": "val1", }, }, { - "map", - map[string]string{ + Name: "map", + Data: map[string]string{ "key1": "val1", "key2": "val2", }, - metadata.Metadata{ + Expected: metadata.Metadata{ "Key1": "val1", "Key2": "val2", }, @@ -141,7 +141,13 @@ func TestMetadataAny(t *testing.T) { t.Run(tt.Name, func(t *testing.T) { src := &s{} var opts []options.Option - opts = append(opts, options.Metadata(tt.Data)) + switch valData := tt.Data.(type) { + case []any: + opts = append(opts, options.Metadata(valData...)) + case map[string]string, metadata.Metadata: + opts = append(opts, options.Metadata(valData)) + } + for _, o := range opts { if err := o(src); err != nil { t.Fatal(err) -- 2.45.2 From 4fa0b2c82cb5aa4d6ead11398c75978ddb949389 Mon Sep 17 00:00:00 2001 From: Vasiliy Tolstov Date: Thu, 29 Feb 2024 01:26:09 +0300 Subject: [PATCH 2/2] fixup Signed-off-by: Vasiliy Tolstov --- options/options.go | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/options/options.go b/options/options.go index 2e611b75..cbcf15fd 100644 --- a/options/options.go +++ b/options/options.go @@ -152,27 +152,24 @@ func ContentType(ct string) Option { // Metadata pass additional metadata func Metadata(md ...any) Option { - result := metadata.Metadata{} - - if len(md) > 1 { - var tmp []string - for _, val := range md { - switch vt := val.(type) { - case string: - tmp = append(tmp, vt) - default: - return func(src interface{}) error { - return Set(src, result, ".Metadata") - } - } - } - result.Set(tmp...) - } else if len(md) == 1 { + var result metadata.Metadata + if len(md) == 1 { switch vt := md[0].(type) { case metadata.Metadata: result = metadata.Copy(vt) case map[string]string: result = metadata.Copy(vt) + default: + result = metadata.New(0) + } + } else { + result = metadata.New(len(md) / 2) + for idx := 0; idx < len(md)/2; idx += 2 { + k, kok := md[idx].(string) + v, vok := md[idx+1].(string) + if kok && vok { + result.Set(k, v) + } } } -- 2.45.2