| package client |
| |
| import ( |
| "encoding/json" |
| "net/url" |
| ) |
| |
| // Filters describes a predicate for an API request. |
| // |
| // Each entry in the map is a filter term. |
| // Each term is evaluated against the set of values. |
| // A filter term is satisfied if any one of the values in the set is a match. |
| // An item matches the filters when all terms are satisfied. |
| // |
| // Like all other map types in Go, the zero value is empty and read-only. |
| type Filters map[string]map[string]bool |
| |
| // Add appends values to the value-set of term. |
| // |
| // The receiver f is returned for chaining. |
| // |
| // f := make(Filters).Add("name", "foo", "bar").Add("status", "exited") |
| func (f Filters) Add(term string, values ...string) Filters { |
| if _, ok := f[term]; !ok { |
| f[term] = make(map[string]bool) |
| } |
| for _, v := range values { |
| f[term][v] = true |
| } |
| return f |
| } |
| |
| // Clone returns a deep copy of f. |
| func (f Filters) Clone() Filters { |
| out := make(Filters, len(f)) |
| for term, values := range f { |
| inner := make(map[string]bool, len(values)) |
| for v, ok := range values { |
| inner[v] = ok |
| } |
| out[term] = inner |
| } |
| return out |
| } |
| |
| // updateURLValues sets the "filters" key in values to the marshalled value of |
| // f, replacing any existing values. When f is empty, any existing "filters" key |
| // is removed. |
| func (f Filters) updateURLValues(values url.Values) { |
| if len(f) > 0 { |
| b, err := json.Marshal(f) |
| if err != nil { |
| panic(err) // Marshaling builtin types should never fail |
| } |
| values.Set("filters", string(b)) |
| } else { |
| values.Del("filters") |
| } |
| } |