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