10472: Handle jobs with components/subjobs
[arvados.git] / sdk / go / arvados / error.go
1 package arvados
2
3 import (
4         "encoding/json"
5         "fmt"
6         "net/http"
7         "net/url"
8         "strings"
9 )
10
11 type TransactionError struct {
12         Method     string
13         URL        url.URL
14         StatusCode int
15         Status     string
16         errors     []string
17 }
18
19 func (e TransactionError) Error() (s string) {
20         s = fmt.Sprintf("request failed: %s", e.URL)
21         if e.Status != "" {
22                 s = s + ": " + e.Status
23         }
24         if len(e.errors) > 0 {
25                 s = s + ": " + strings.Join(e.errors, "; ")
26         }
27         return
28 }
29
30 func newTransactionError(req *http.Request, resp *http.Response, buf []byte) *TransactionError {
31         var e TransactionError
32         if json.Unmarshal(buf, &e) != nil {
33                 // No JSON-formatted error response
34                 e.errors = nil
35         }
36         e.Method = req.Method
37         e.URL = *req.URL
38         if resp != nil {
39                 e.Status = resp.Status
40                 e.StatusCode = resp.StatusCode
41         }
42         return &e
43 }