internal/apiquery/query.go (45 lines of code) (raw):
package apiquery
import (
"net/url"
"reflect"
"time"
)
func MarshalWithSettings(value interface{}, settings QuerySettings) (url.Values, error) {
e := encoder{time.RFC3339, true, settings}
kv := url.Values{}
val := reflect.ValueOf(value)
if !val.IsValid() {
return nil, nil
}
typ := val.Type()
pairs, err := e.typeEncoder(typ)("", val)
if err != nil {
return nil, err
}
for _, pair := range pairs {
kv.Add(pair.key, pair.value)
}
return kv, nil
}
func Marshal(value interface{}) (url.Values, error) {
return MarshalWithSettings(value, QuerySettings{})
}
type Queryer interface {
URLQuery() (url.Values, error)
}
type QuerySettings struct {
NestedFormat NestedQueryFormat
ArrayFormat ArrayQueryFormat
}
type NestedQueryFormat int
const (
NestedQueryFormatBrackets NestedQueryFormat = iota
NestedQueryFormatDots
)
type ArrayQueryFormat int
const (
ArrayQueryFormatComma ArrayQueryFormat = iota
ArrayQueryFormatRepeat
ArrayQueryFormatIndices
ArrayQueryFormatBrackets
)