From 7727cf2f9d64027e05cbd25466a0af6e25f628e0 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Thu, 14 Jul 2016 19:04:20 +0200 Subject: Split query --- query/query.go | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++ query/query_test.go | 24 ++++++++++++++++++++ tracker/query.go | 61 --------------------------------------------------- tracker/query_test.go | 24 -------------------- 4 files changed, 85 insertions(+), 85 deletions(-) create mode 100644 query/query.go create mode 100644 query/query_test.go delete mode 100644 tracker/query.go delete mode 100644 tracker/query_test.go diff --git a/query/query.go b/query/query.go new file mode 100644 index 0000000..83214b8 --- /dev/null +++ b/query/query.go @@ -0,0 +1,61 @@ +package query + +import ( + "errors" + "net/url" + "reflect" + "strconv" + "strings" +) + +func Marshal(v interface{}) (string, error) { + val := reflect.ValueOf(v) + return marshalQuery(val) +} + +func parseTag(tag string) (string, string) { + if i := strings.Index(tag, ","); i != -1 { + return tag[:i], tag[i+1:] + } + return tag, "" +} + +func isZero(v reflect.Value) bool { + switch v.Kind() { + case reflect.String: + return v.String() == "" + case reflect.Int: + return v.Int() == 0 + } + return false +} + +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) + tag, param := parseTag(t.Field(i).Tag.Get("query")) + if tag != "" { + name = tag + } + f := v.Field(i) + if param == "optional" && isZero(f) { + continue + } + switch f.Kind() { + case reflect.Int: + q.Add(name, strconv.Itoa(int(f.Int()))) + case reflect.String: + q.Add(name, f.String()) + case reflect.Slice: + if f.Type().Elem().Kind() == reflect.Uint8 { + q.Add(name, string(f.Bytes())) + } + } + } + return "?" + q.Encode(), nil +} diff --git a/query/query_test.go b/query/query_test.go new file mode 100644 index 0000000..97cde6e --- /dev/null +++ b/query/query_test.go @@ -0,0 +1,24 @@ +package query + +import "testing" + +func TestMarshal(t *testing.T) { + q := struct { + A string `query:"x"` + B int + C string `query:",optional"` + D []byte + }{ + A: "test", + B: 100, + D: []byte{1, 2, 3}, + } + v, err := Marshal(q) + if err != nil { + t.Error(err) + } + if v != "?b=100&d=%01%02%03&x=test" { + t.Error("wrong result", v) + } + +} diff --git a/tracker/query.go b/tracker/query.go deleted file mode 100644 index 0ab56fc..0000000 --- a/tracker/query.go +++ /dev/null @@ -1,61 +0,0 @@ -package tracker - -import ( - "errors" - "net/url" - "reflect" - "strconv" - "strings" -) - -func MarshalQuery(v interface{}) (string, error) { - val := reflect.ValueOf(v) - return marshalQuery(val) -} - -func parseTag(tag string) (string, string) { - if i := strings.Index(tag, ","); i != -1 { - return tag[:i], tag[i+1:] - } - return tag, "" -} - -func isZero(v reflect.Value) bool { - switch v.Kind() { - case reflect.String: - return v.String() == "" - case reflect.Int: - return v.Int() == 0 - } - return false -} - -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) - tag, param := parseTag(t.Field(i).Tag.Get("query")) - if tag != "" { - name = tag - } - f := v.Field(i) - if param == "optional" && isZero(f) { - continue - } - switch f.Kind() { - case reflect.Int: - q.Add(name, strconv.Itoa(int(f.Int()))) - case reflect.String: - q.Add(name, f.String()) - case reflect.Slice: - if f.Type().Elem().Kind() == reflect.Uint8 { - q.Add(name, string(f.Bytes())) - } - } - } - return "?" + q.Encode(), nil -} diff --git a/tracker/query_test.go b/tracker/query_test.go deleted file mode 100644 index bd9a174..0000000 --- a/tracker/query_test.go +++ /dev/null @@ -1,24 +0,0 @@ -package tracker - -import "testing" - -func TestMarshalQuery(t *testing.T) { - q := struct { - A string `query:"x"` - B int - C string `query:",optional"` - D []byte - }{ - A: "test", - B: 100, - D: []byte{1, 2, 3}, - } - v, err := MarshalQuery(q) - if err != nil { - t.Error(err) - } - if v != "?b=100&d=%01%02%03&x=test" { - t.Error("wrong result", v) - } - -} -- cgit v1.2.3