/
json.go
109 lines (90 loc) · 1.98 KB
/
json.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package eskip
import (
"bytes"
"encoding/json"
)
func marshalJsonPredicates(r *Route) []*Predicate {
rjf := make([]*Predicate, 0, len(r.Predicates))
if r.Method != "" {
rjf = append(rjf, &Predicate{
Name: "Method",
Args: []interface{}{r.Method},
})
}
if r.Path != "" {
rjf = append(rjf, &Predicate{
Name: "Path",
Args: []interface{}{r.Path},
})
}
for _, h := range r.HostRegexps {
rjf = append(rjf, &Predicate{
Name: "HostRegexp",
Args: []interface{}{h},
})
}
for _, p := range r.PathRegexps {
rjf = append(rjf, &Predicate{
Name: "PathRegexp",
Args: []interface{}{p},
})
}
for k, v := range r.Headers {
rjf = append(rjf, &Predicate{
Name: "Header",
Args: []interface{}{k, v},
})
}
for k, list := range r.HeaderRegexps {
for _, v := range list {
rjf = append(rjf, &Predicate{
Name: "HeaderRegexp",
Args: []interface{}{k, v},
})
}
}
rjf = append(rjf, r.Predicates...)
return rjf
}
func marshalNameArgs(name string, args []interface{}) ([]byte, error) {
if args == nil {
args = []interface{}{}
}
return json.Marshal(&struct {
Name string `json:"name"`
Args []interface{} `json:"args"`
}{
Name: name,
Args: args,
})
}
func (f *Filter) MarshalJSON() ([]byte, error) {
return marshalNameArgs(f.Name, f.Args)
}
func (p *Predicate) MarshalJSON() ([]byte, error) {
return marshalNameArgs(p.Name, p.Args)
}
func (r *Route) MarshalJSON() ([]byte, error) {
backend := r.backendString()
filters := r.Filters
if filters == nil {
filters = []*Filter{}
}
var buf bytes.Buffer
e := json.NewEncoder(&buf)
e.SetEscapeHTML(false)
if err := e.Encode(&struct {
Id string `json:"id"`
Backend string `json:"backend"`
Predicates []*Predicate `json:"predicates"`
Filters []*Filter `json:"filters"`
}{
Id: r.Id,
Backend: backend,
Predicates: marshalJsonPredicates(r),
Filters: filters,
}); err != nil {
return nil, err
}
return buf.Bytes(), nil
}