Created sdk util package and moved helpful methods there.
[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 func UserIsAdmin(arv arvadosclient.ArvadosClient) (is_admin bool, err error) {
12         type user struct {
13                 IsAdmin bool `json:"is_admin"`
14         }
15         var u user
16         err = arv.Call("GET", "users", "", "current", nil, &u)
17         return u.IsAdmin, err
18 }
19
20 func SdkListResponseContainsAllAvailableItems(response map[string]interface{}) (containsAll bool, numContained int, numAvailable int) {
21         if value, ok := response["items"]; ok {
22                 items := value.([]interface{})
23                 {
24                         var itemsAvailable interface{}
25                         if itemsAvailable, ok = response["items_available"]; !ok {
26                                 // TODO(misha): Consider returning an error here (and above if
27                                 // we can't find items) so that callers can recover.
28                                 log.Fatalf("API server did not return the number of items available")
29                         }
30                         numContained = len(items)
31                         numAvailable = int(itemsAvailable.(float64))
32                         // If we never entered this block, allAvailable would be false by
33                         // default, which is what we want
34                         containsAll = numContained == numAvailable
35                 }
36         }
37         return
38 }
39
40 func IterateSdkListItems(response map[string]interface{}) (c <-chan map[string]interface{}, err error) {
41         if value, ok := response["items"]; ok {
42                 ch := make(chan map[string]interface{})
43                 c = ch
44                 items := value.([]interface{})
45                 go func() {
46                         for _, item := range items {
47                                 ch <- item.(map[string]interface{})
48                         }
49                         close(ch)
50                 }()
51         } else {
52                 err = errors.New("Could not find \"items\" field in response " +
53                         "passed to IterateSdkListItems()")
54         }
55         return
56 }