From 662556e27a4d7a53013bae7c4d2a65fc541d6fa2 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Thu, 16 Jun 2016 00:07:12 +0200 Subject: Add query encoder --- tracker/query.go | 37 +++++++++++++++++++++++++++++++++++++ tracker/query_test.go | 20 ++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 tracker/query.go create mode 100644 tracker/query_test.go (limited to 'tracker') diff --git a/tracker/query.go b/tracker/query.go new file mode 100644 index 0000000..bb741dd --- /dev/null +++ b/tracker/query.go @@ -0,0 +1,37 @@ +package tracker + +import ( + "errors" + "net/url" + "reflect" + "strconv" + "strings" +) + +func MarshalQuery(v interface{}) (string, error) { + val := reflect.ValueOf(v) + return marshalQuery(val) +} + +func marshalQuery(v reflect.Value) (string, error) { + if v.Kind() != reflect.Struct { + return "", errors.New("must be a struct") + } + q := url.Values{} + t := v.Type() + for i := 0; i < t.NumField(); i++ { + name := strings.ToLower(t.Field(i).Name) + f := v.Field(i) + switch f.Kind() { + case reflect.Int: + if x := int(f.Int()); x != 0 { + q.Add(name, strconv.Itoa(int(f.Int()))) + } + case reflect.String: + if s := f.String(); s != "" { + q.Add(name, f.String()) + } + } + } + return "?" + q.Encode(), nil +} diff --git a/tracker/query_test.go b/tracker/query_test.go new file mode 100644 index 0000000..3959255 --- /dev/null +++ b/tracker/query_test.go @@ -0,0 +1,20 @@ +package tracker + +import "testing" + +func TestMarshalQuery(t *testing.T) { + q := struct { + A string + B int + C string + }{ + A: "test", + B: 100, + } + v, err := MarshalQuery(q) + if err != nil { + t.Error(err) + } + t.Log(v) + +} -- cgit v1.2.3