query.go

 1package apiquery
 2
 3import (
 4	"net/url"
 5	"reflect"
 6	"time"
 7)
 8
 9func MarshalWithSettings(value interface{}, settings QuerySettings) url.Values {
10	e := encoder{time.RFC3339, true, settings}
11	kv := url.Values{}
12	val := reflect.ValueOf(value)
13	if !val.IsValid() {
14		return nil
15	}
16	typ := val.Type()
17	for _, pair := range e.typeEncoder(typ)("", val) {
18		kv.Add(pair.key, pair.value)
19	}
20	return kv
21}
22
23func Marshal(value interface{}) url.Values {
24	return MarshalWithSettings(value, QuerySettings{})
25}
26
27type Queryer interface {
28	URLQuery() url.Values
29}
30
31type QuerySettings struct {
32	NestedFormat NestedQueryFormat
33	ArrayFormat  ArrayQueryFormat
34}
35
36type NestedQueryFormat int
37
38const (
39	NestedQueryFormatBrackets NestedQueryFormat = iota
40	NestedQueryFormatDots
41)
42
43type ArrayQueryFormat int
44
45const (
46	ArrayQueryFormatComma ArrayQueryFormat = iota
47	ArrayQueryFormatRepeat
48	ArrayQueryFormatIndices
49	ArrayQueryFormatBrackets
50)