From cc2d14cbab89620f5bbcaf104d2fd977aeb6cb18 Mon Sep 17 00:00:00 2001 From: Kailash Nadh Date: Wed, 24 Jan 2024 17:33:13 +0530 Subject: [PATCH] Add support for scanning to *ptr fields. --- fastglue_test.go | 11 +++++++++++ utils.go | 24 ++++++++++++++++++++---- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/fastglue_test.go b/fastglue_test.go index da4ef81..de3c22d 100644 --- a/fastglue_test.go +++ b/fastglue_test.go @@ -696,6 +696,9 @@ func TestScanArgs(t *testing.T) { Str1 string `url:"str1"` StrBlock string `url:"-"` StrNoTag *string + StrPtr1 *string `url:"strptr1"` + StrPtr2 *string `url:"strptr2"` + IntPtr *int `url:"intptr"` Strings []string `url:"str"` Bytes []byte `url:"bytes"` Int1 int `url:"int1"` @@ -732,13 +735,21 @@ func TestScanArgs(t *testing.T) { args.Add("bool", "t") args.Add("custom", "bar") args.Add("custom_pointer", "bar") + args.Add("strptr1", "strptrval") + args.Add("intptr", "12345") _, err := ScanArgs(args, &o, "url") if err != nil { t.Fatalf("Got unexpected error: %v", err) } + var ( + strPtr1 = "strptrval" + intPtr = 12345 + ) exp := test{ + StrPtr1: &strPtr1, + IntPtr: &intPtr, Str1: "string1", Strings: []string{"str1", "str2", "str3"}, Bytes: []byte("manybytes"), diff --git a/utils.go b/utils.go index a3f9e11..c17ef74 100644 --- a/utils.go +++ b/utils.go @@ -18,10 +18,11 @@ import ( // bool, number types and their slices. // // eg: -// type Order struct { -// Tradingsymbol string `url:"tradingsymbol"` -// Tags []string `url:"tag"` -// } +// +// type Order struct { +// Tradingsymbol string `url:"tradingsymbol"` +// Tags []string `url:"tag"` +// } func ScanArgs(args *fasthttp.Args, obj interface{}, fieldTag string) ([]string, error) { ob := reflect.ValueOf(obj) if ob.Kind() == reflect.Ptr { @@ -153,6 +154,21 @@ func setVal(f reflect.Value, val string) (bool, error) { f.Set(reflect.ValueOf(receiver)) return true, nil } + } else { + // Create a new value of the type that the pointer points to + typ := f.Type().Elem() + newEl := reflect.New(typ) + + ok, err := setVal(newEl.Elem(), val) + if err != nil { + return false, err + } + + // If the value was successfully set, point the original field to the new element + if ok { + f.Set(newEl) + } + return ok, nil } return false, nil