github.com/aiven/aiven-go-client@v1.36.0/api.go (about) 1 package aiven 2 3 import ( 4 "bytes" 5 "encoding/json" 6 "fmt" 7 "net/url" 8 "strings" 9 ) 10 11 // APIResponse represents a response returned by the Aiven API. 12 type APIResponse struct { 13 Errors []Error `json:"errors,omitempty"` 14 Message string `json:"message,omitempty"` 15 } 16 17 // Response represents Aiven API response interface 18 type Response interface { 19 GetError() error 20 } 21 22 // GetError returns the first error from API Response, if any 23 func (r APIResponse) GetError() error { 24 if len(r.Errors) != 0 { 25 for _, err := range r.Errors { 26 return err 27 } 28 } 29 30 return nil 31 } 32 33 func checkAPIResponse(bts []byte, r Response) error { 34 if len(bts) == 0 { 35 return nil 36 } 37 38 if r == nil { 39 r = new(APIResponse) 40 } 41 42 buffer := bytes.NewBuffer(bts) 43 dec := json.NewDecoder(buffer) 44 dec.UseNumber() 45 if err := dec.Decode(&r); err != nil { 46 return fmt.Errorf("cannot unmarshal JSON `%s`, error: %w", bts, err) 47 } 48 49 if r == nil { 50 return ErrNoResponseData 51 } 52 53 return r.GetError() 54 } 55 56 func buildPath(parts ...string) string { 57 finalParts := make([]string, len(parts)) 58 for idx, part := range parts { 59 finalParts[idx] = url.PathEscape(part) 60 } 61 return "/" + strings.Join(finalParts, "/") 62 }