Created sdk util package and moved helpful methods there.
[arvados.git] / sdk / go / util / util.go
diff --git a/sdk/go/util/util.go b/sdk/go/util/util.go
new file mode 100644 (file)
index 0000000..f163a82
--- /dev/null
@@ -0,0 +1,56 @@
+/* Helper methods for dealing with responses from API Server. */
+
+package util
+
+import (
+       "errors"
+       "git.curoverse.com/arvados.git/sdk/go/arvadosclient"
+       "log"
+)
+
+func UserIsAdmin(arv arvadosclient.ArvadosClient) (is_admin bool, err error) {
+       type user struct {
+               IsAdmin bool `json:"is_admin"`
+       }
+       var u user
+       err = arv.Call("GET", "users", "", "current", nil, &u)
+       return u.IsAdmin, err
+}
+
+func SdkListResponseContainsAllAvailableItems(response map[string]interface{}) (containsAll bool, numContained int, numAvailable int) {
+       if value, ok := response["items"]; ok {
+               items := value.([]interface{})
+               {
+                       var itemsAvailable interface{}
+                       if itemsAvailable, ok = response["items_available"]; !ok {
+                               // TODO(misha): Consider returning an error here (and above if
+                               // we can't find items) so that callers can recover.
+                               log.Fatalf("API server did not return the number of items available")
+                       }
+                       numContained = len(items)
+                       numAvailable = int(itemsAvailable.(float64))
+                       // If we never entered this block, allAvailable would be false by
+                       // default, which is what we want
+                       containsAll = numContained == numAvailable
+               }
+       }
+       return
+}
+
+func IterateSdkListItems(response map[string]interface{}) (c <-chan map[string]interface{}, err error) {
+       if value, ok := response["items"]; ok {
+               ch := make(chan map[string]interface{})
+               c = ch
+               items := value.([]interface{})
+               go func() {
+                       for _, item := range items {
+                               ch <- item.(map[string]interface{})
+                       }
+                       close(ch)
+               }()
+       } else {
+               err = errors.New("Could not find \"items\" field in response " +
+                       "passed to IterateSdkListItems()")
+       }
+       return
+}