From 147c2d756e609f7aee60e52f75b4ac0950b94380 Mon Sep 17 00:00:00 2001 From: Vasiliy Tolstov Date: Thu, 10 Mar 2022 12:27:37 +0300 Subject: [PATCH] add additional wrappers support Signed-off-by: Vasiliy Tolstov --- util.go | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/util.go b/util.go index 0673d1f..2fc37d4 100644 --- a/util.go +++ b/util.go @@ -147,11 +147,11 @@ func newPathRequest(path string, method string, body string, msg interface{}, ta switch val.Type().Kind() { case reflect.Slice: for idx := 0; idx < val.Len(); idx++ { - values.Add(t.name, fmt.Sprintf("%v", val.Index(idx).Interface())) + values.Add(t.name, getParam(val.Index(idx))) } fieldsmapskip[t.name] = struct{}{} default: - fieldsmap[t.name] = fmt.Sprintf("%v", val.Interface()) + fieldsmap[t.name] = getParam(val) } } else if (body == "*" || body == t.name) && method != http.MethodGet { if tnmsg.Field(i).CanSet() { @@ -160,10 +160,10 @@ func newPathRequest(path string, method string, body string, msg interface{}, ta } else { if val.Type().Kind() == reflect.Slice { for idx := 0; idx < val.Len(); idx++ { - values.Add(t.name, fmt.Sprintf("%v", val.Index(idx).Interface())) + values.Add(t.name, getParam(val.Index(idx))) } } else { - values.Add(t.name, fmt.Sprintf("%v", val.Interface())) + values.Add(t.name, getParam(val)) } } } @@ -216,12 +216,6 @@ func newPathRequest(path string, method string, body string, msg interface{}, ta _, _ = b.WriteString(values.Encode()) } - /* - if err = rutil.ZeroFieldByPath(nmsg, k); err != nil { - return nil, errors.BadRequest("go.micro.client", err.Error()) - } - */ - if rutil.IsZero(nmsg) { return b.String(), nil, nil } @@ -324,3 +318,26 @@ type tag struct { key string name string } + +func getParam(val reflect.Value) string { + var v string + switch val.Kind() { + case reflect.Ptr: + switch reflect.Indirect(val).Type().String() { + case + "wrapperspb.BoolValue", + "wrapperspb.BytesValue", + "wrapperspb.DoubleValue", + "wrapperspb.FloatValue", + "wrapperspb.Int32Value", "wrapperspb.Int64Value", + "wrapperspb.StringValue", + "wrapperspb.UInt32Value", "wrapperspb.UInt64Value": + if eva := reflect.Indirect(val).FieldByName("Value"); eva.IsValid() { + v = getParam(eva) + } + } + default: + v = fmt.Sprintf("%v", val.Interface()) + } + return v +}