Merge branch '18024-no-docker-snap' into main
[arvados.git] / sdk / go / arvados / resource_list.go
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: Apache-2.0
4
5 package arvados
6
7 import (
8         "encoding/json"
9         "fmt"
10 )
11
12 // ResourceListParams expresses which results are requested in a
13 // list/index API.
14 type ResourceListParams struct {
15         Select             []string `json:"select,omitempty"`
16         Filters            []Filter `json:"filters,omitempty"`
17         IncludeTrash       bool     `json:"include_trash,omitempty"`
18         IncludeOldVersions bool     `json:"include_old_versions,omitempty"`
19         Limit              *int     `json:"limit,omitempty"`
20         Offset             int      `json:"offset,omitempty"`
21         Order              string   `json:"order,omitempty"`
22         Distinct           bool     `json:"distinct,omitempty"`
23         Count              string   `json:"count,omitempty"`
24 }
25
26 // A Filter restricts the set of records returned by a list/index API.
27 type Filter struct {
28         Attr     string
29         Operator string
30         Operand  interface{}
31 }
32
33 // MarshalJSON encodes a Filter to a JSON array.
34 func (f *Filter) MarshalJSON() ([]byte, error) {
35         return json.Marshal([]interface{}{f.Attr, f.Operator, f.Operand})
36 }
37
38 // UnmarshalJSON decodes a JSON array to a Filter.
39 func (f *Filter) UnmarshalJSON(data []byte) error {
40         var elements []interface{}
41         err := json.Unmarshal(data, &elements)
42         if err != nil {
43                 return err
44         }
45         if len(elements) != 3 {
46                 return fmt.Errorf("invalid filter %q: must have 3 elements", data)
47         }
48         attr, ok := elements[0].(string)
49         if !ok {
50                 return fmt.Errorf("invalid filter attr %q", elements[0])
51         }
52         op, ok := elements[1].(string)
53         if !ok {
54                 return fmt.Errorf("invalid filter operator %q", elements[1])
55         }
56         operand := elements[2]
57         switch operand.(type) {
58         case string, float64, []interface{}, nil, bool:
59         default:
60                 return fmt.Errorf("invalid filter operand %q", elements[2])
61         }
62         *f = Filter{attr, op, operand}
63         return nil
64 }