99 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
| package requests
 | |
| 
 | |
| import (
 | |
| 	"encoding/json"
 | |
| 	"fmt"
 | |
| 	"net/http"
 | |
| 
 | |
| 	"github.com/bitly/go-simplejson"
 | |
| )
 | |
| 
 | |
| // Result is the result of a request created by a Builder
 | |
| type Result interface {
 | |
| 	Error() error
 | |
| 	StatusCode() int
 | |
| 	Headers() http.Header
 | |
| 	Body() []byte
 | |
| 	UnmarshalInto(interface{}) error
 | |
| 	UnmarshalJSON() (*simplejson.Json, error)
 | |
| }
 | |
| 
 | |
| type result struct {
 | |
| 	err      error
 | |
| 	response *http.Response
 | |
| 	body     []byte
 | |
| }
 | |
| 
 | |
| // Error returns an error from the result if present
 | |
| func (r *result) Error() error {
 | |
| 	return r.err
 | |
| }
 | |
| 
 | |
| // StatusCode returns the response's status code
 | |
| func (r *result) StatusCode() int {
 | |
| 	if r.response != nil {
 | |
| 		return r.response.StatusCode
 | |
| 	}
 | |
| 	return 0
 | |
| }
 | |
| 
 | |
| // Headers returns the response's headers
 | |
| func (r *result) Headers() http.Header {
 | |
| 	if r.response != nil {
 | |
| 		return r.response.Header
 | |
| 	}
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| // Body returns the response's body
 | |
| func (r *result) Body() []byte {
 | |
| 	return r.body
 | |
| }
 | |
| 
 | |
| // UnmarshalInto attempts to unmarshal the response into the given interface.
 | |
| // The response body is assumed to be JSON.
 | |
| // The response must have a 200 status otherwise an error will be returned.
 | |
| func (r *result) UnmarshalInto(into interface{}) error {
 | |
| 	body, err := r.getBodyForUnmarshal()
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 
 | |
| 	if err := json.Unmarshal(body, into); err != nil {
 | |
| 		return fmt.Errorf("error unmarshalling body: %v", err)
 | |
| 	}
 | |
| 
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| // UnmarshalJSON performs the request and attempts to unmarshal the response into a
 | |
| // simplejson.Json. The response body is assume to be JSON.
 | |
| // The response must have a 200 status otherwise an error will be returned.
 | |
| func (r *result) UnmarshalJSON() (*simplejson.Json, error) {
 | |
| 	body, err := r.getBodyForUnmarshal()
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	data, err := simplejson.NewJson(body)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("error reading json: %v", err)
 | |
| 	}
 | |
| 	return data, nil
 | |
| }
 | |
| 
 | |
| // getBodyForUnmarshal returns the body if there wasn't an error and the status
 | |
| // code was 200.
 | |
| func (r *result) getBodyForUnmarshal() ([]byte, error) {
 | |
| 	if r.Error() != nil {
 | |
| 		return nil, r.Error()
 | |
| 	}
 | |
| 
 | |
| 	// Only unmarshal body if the response was successful
 | |
| 	if r.StatusCode() != http.StatusOK {
 | |
| 		return nil, fmt.Errorf("unexpected status \"%d\": %s", r.StatusCode(), r.Body())
 | |
| 	}
 | |
| 
 | |
| 	return r.Body(), nil
 | |
| }
 |