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