-// List the instances of a resource
-//
-// resource - the arvados resource on which to list
-// parameters - method parameters
-// output - a map or annotated struct which is a legal target for encoding/json/Decoder
-// return
-// err - error accessing the resource, or nil if no error
-func (this ArvadosClient) List(resource string, parameters Dict, output interface{}) (err error) {
- return this.Call("GET", resource, "", "", parameters, output)
+// Get a resource. See Call for argument descriptions.
+func (c ArvadosClient) Get(resourceType string, uuid string, parameters Dict, output interface{}) (err error) {
+ if !UUIDMatch(uuid) && !(resourceType == "collections" && PDHMatch(uuid)) {
+ // No object has uuid == "": there is no need to make
+ // an API call. Furthermore, the HTTP request for such
+ // an API call would be "GET /arvados/v1/type/", which
+ // is liable to be misinterpreted as the List API.
+ return ErrInvalidArgument
+ }
+ return c.Call("GET", resourceType, uuid, "", parameters, output)
+}
+
+// List resources of a given type. See Call for argument descriptions.
+func (c ArvadosClient) List(resource string, parameters Dict, output interface{}) (err error) {
+ return c.Call("GET", resource, "", "", parameters, output)
+}
+
+const API_DISCOVERY_RESOURCE = "discovery/v1/apis/arvados/v1/rest"
+
+// Discovery returns the value of the given parameter in the discovery
+// document. Returns a non-nil error if the discovery document cannot
+// be retrieved/decoded. Returns ErrInvalidArgument if the requested
+// parameter is not found in the discovery document.
+func (c *ArvadosClient) Discovery(parameter string) (value interface{}, err error) {
+ if len(c.DiscoveryDoc) == 0 {
+ c.DiscoveryDoc = make(Dict)
+ err = c.Call("GET", API_DISCOVERY_RESOURCE, "", "", nil, &c.DiscoveryDoc)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ var found bool
+ value, found = c.DiscoveryDoc[parameter]
+ if found {
+ return value, nil
+ } else {
+ return value, ErrInvalidArgument
+ }