1package desec 2 3import ( 4 "encoding/json" 5 "fmt" 6 "io" 7 "net/http" 8) 9 10// NotFoundError Not found error. 11type NotFoundError struct { 12 Detail string `json:"detail"` 13} 14 15func (n NotFoundError) Error() string { 16 return n.Detail 17} 18 19// APIError error from API. 20type APIError struct { 21 StatusCode int 22 err error 23} 24 25func (e APIError) Error() string { 26 return fmt.Sprintf("%d: %v", e.StatusCode, e.err) 27} 28 29// Unwrap unwraps error. 30func (e APIError) Unwrap() error { 31 return e.err 32} 33 34func readError(resp *http.Response, er error) error { 35 body, err := io.ReadAll(resp.Body) 36 if err != nil { 37 return &APIError{ 38 StatusCode: resp.StatusCode, 39 err: fmt.Errorf("failed to read response body: %w", err), 40 } 41 } 42 43 err = json.Unmarshal(body, er) 44 if err != nil { 45 return &APIError{ 46 StatusCode: resp.StatusCode, 47 err: fmt.Errorf("failed to unmarshall response body: %w: %s", err, string(body)), 48 } 49 } 50 51 return &APIError{ 52 StatusCode: resp.StatusCode, 53 err: er, 54 } 55} 56 57func readRawError(resp *http.Response) error { 58 body, err := io.ReadAll(resp.Body) 59 if err != nil { 60 return &APIError{ 61 StatusCode: resp.StatusCode, 62 err: fmt.Errorf("failed to read response body: %w", err), 63 } 64 } 65 66 return &APIError{StatusCode: resp.StatusCode, err: fmt.Errorf("body: %s", string(body))} 67} 68