-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy patherror.go
96 lines (85 loc) · 2.4 KB
/
error.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package spyse
import (
"encoding/json"
"errors"
"fmt"
"io/ioutil"
"net/http"
"strings"
)
// Possible Spyse API error codes
const (
CodeBadRequest = "bad_request"
CodeValidationError = "validation_error"
CodeRequestsLimitReached = "requests_limit_reached"
CodeDownloadsLimitReached = "downloads_limit_reached"
CodeSearchParamsLimitReached = "search_params_limit_reached"
CodeTooManyRequests = "too_many_requests"
CodeUnauthorized = "unauthorized"
CodeForbidden = "forbidden"
CodeHTTPClientError = "http_client_error"
CodeInternalServerError = "internal_server_error"
)
var (
// ErrReadBody is returned when response's body cannot be read.
ErrReadBody = errors.New("could not read error response")
)
type ErrResponse struct {
Err *Error `json:"error,omitempty"`
}
func (e *ErrResponse) Error() string {
var err string
if e.Err != nil {
err = fmt.Sprintf("code:%s message:\"%s\"\n", e.Err.Code, e.Err.Message)
}
if e.Err.Errors != nil {
for _, v := range e.Err.Errors {
err += fmt.Sprintf("code:%s location:%s message:\"%s\"", v.Code, v.Location, v.Message)
}
}
return err
}
func (e *ErrResponse) Is(target error) bool {
var err *ErrResponse
return errors.As(target, &err)
}
type FieldError struct {
Code string `json:"code"`
Location string `json:"location"`
Message string `json:"message,omitempty"`
}
// Error message from Spyse
type Error struct {
Status int `json:"-"`
Code string `json:"code"`
Message string `json:"message"`
Errors []*FieldError `json:"errors,omitempty"`
}
func (e *Error) Error() string {
err := e.Code + ": " + e.Message
if e.Errors != nil {
for _, v := range e.Errors {
err += fmt.Sprintf("\ncode:%s, location:%s, message:%s", v.Code, v.Location, v.Message)
}
}
return err
}
// NewSpyseError creates a new spyse Error
func NewSpyseError(err error) error {
if errors.Is(&ErrResponse{}, err) {
return err
}
return &ErrResponse{Err: &Error{Code: CodeHTTPClientError, Message: err.Error()}}
}
func getErrorFromResponse(r *http.Response) error {
errorResponse := new(ErrResponse)
message, err := ioutil.ReadAll(r.Body)
if err == nil {
if err = json.Unmarshal(message, &errorResponse); err == nil {
errorResponse.Err.Status = r.StatusCode
return errorResponse
}
return errors.New(strings.TrimSpace(string(message)))
}
return ErrReadBody
}