]> git.arvados.org - arvados.git/blob - sdk/go/util/util.go
Changes to manifest that I forgot to add to previous checking.
[arvados.git] / sdk / go / util / util.go
1 /* Helper methods for dealing with responses from API Server. */
2
3 package util
4
5 import (
6         "errors"
7         "git.curoverse.com/arvados.git/sdk/go/arvadosclient"
8         "log"
9 )
10
11 type SdkListResponse interface {
12         NumItemsAvailable() (int, error)
13         NumItemsContained() (int, error)
14 }
15
16 type UnstructuredSdkListResponse map[string]interface{}
17
18 func (m UnstructuredSdkListResponse) NumItemsAvailable() (numAvailable int, err error) {
19         if itemsAvailable, ok := m["items_available"]; !ok {
20                 err = errors.New("Could not find \"items_available\" field in " +
21                         "UnstructuredSdkListResponse that NumItemsAvailable was called on.")
22         } else {
23                 // TODO(misha): Check whether this assertion will work before casting
24                 numAvailable = int(itemsAvailable.(float64))
25         }
26         return
27 }
28
29 func (m UnstructuredSdkListResponse) NumItemsContained() (numContained int, err error) {
30         if value, ok := m["items"]; ok {
31                 // TODO(misha): check whether this assertion will work before casting
32                 numContained = len(value.([]interface{}))
33         } else {
34                 err = errors.New(`Could not find "items" field in ` +
35                         "UnstructuredSdkListResponse that NumItemsContained was called on.")
36         }
37         return
38 }
39
40 func UserIsAdmin(arv arvadosclient.ArvadosClient) (is_admin bool, err error) {
41         type user struct {
42                 IsAdmin bool `json:"is_admin"`
43         }
44         var u user
45         err = arv.Call("GET", "users", "", "current", nil, &u)
46         return u.IsAdmin, err
47 }
48
49 // TODO(misha): Consider returning an error here instead of fatal'ing
50 func ContainsAllAvailableItems(response SdkListResponse) (containsAll bool, numContained int, numAvailable int) {
51         var err error
52         numContained, err = response.NumItemsContained()
53         if err != nil {
54                 log.Fatalf("Error retrieving number of items contained in SDK response: %v",
55                         err)
56         }
57         numAvailable, err = response.NumItemsAvailable()
58         if err != nil {
59                 log.Fatalf("Error retrieving number of items available from " +
60                         "SDK response: %v",
61                         err)
62         }
63         containsAll = numContained == numAvailable
64         return
65 }
66
67 func IterateSdkListItems(response map[string]interface{}) (c <-chan map[string]interface{}, err error) {
68         if value, ok := response["items"]; ok {
69                 ch := make(chan map[string]interface{})
70                 c = ch
71                 items := value.([]interface{})
72                 go func() {
73                         for _, item := range items {
74                                 ch <- item.(map[string]interface{})
75                         }
76                         close(ch)
77                 }()
78         } else {
79                 err = errors.New("Could not find \"items\" field in response " +
80                         "passed to IterateSdkListItems()")
81         }
82         return
83 }