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  }