-
Notifications
You must be signed in to change notification settings - Fork 0
/
porkbun.go
111 lines (93 loc) · 3.15 KB
/
porkbun.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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package porkbun
import (
"encoding/json"
"fmt"
"net/http"
"reflect"
"strconv"
)
const (
Version = "1.0.0"
defaultBaseURL = "https://api.porkbun.com/api/json/v3"
ipv4OnlyBaseURL = "https://api-ipv4.porkbun.com/api/json/v3"
defaultUserAgent = "porkbun-go/" + Version
)
// ApiKeyAcceptor defines an interface for setting API credentials.
type ApiKeyAcceptor interface {
SetCredentials(apiKey string, secretApiKey string)
}
// BaseRequest represents the base structure for all API requests, including credentials.
type BaseRequest struct {
SecretApiKey string `json:"secretapikey"` // The secret API key provided by Porkbun.
Apikey string `json:"apikey"` // The public API key provided by Porkbun.
}
// SetCredentials sets the API and secret keys for the request.
func (br *BaseRequest) SetCredentials(apiKey string, secretApiKey string) {
br.Apikey = apiKey
br.SecretApiKey = secretApiKey
}
// BaseResponse represents the base structure for all API responses.
type BaseResponse struct {
HTTPResponse *http.Response // The underlying HTTP Response.
Status string `json:"status"` // Status indicating whether the command was successfully processed.
}
// ErrorResponse represents an error response from the API.
type ErrorResponse struct {
BaseResponse
Message string `json:"message,omitempty"` // The error message provided by the API.
}
// Error implements the error interface for ErrorResponse.
func (r *ErrorResponse) Error() string {
if r.HTTPResponse == nil || r.HTTPResponse.Request == nil {
return fmt.Sprintf("Error: %v", r.Message)
}
return fmt.Sprintf("%v %v: %v %v",
r.HTTPResponse.Request.Method, r.HTTPResponse.Request.URL,
r.HTTPResponse.StatusCode, r.Message)
}
// String is a helper function that allocates a new string value and returns a pointer to it.
func String(v string) *string { return &v }
// BoolString is a custom type for handling boolean values represented as "1"/"0" strings in JSON.
type BoolString bool
// UnmarshalJSON implements custom unmarshalling logic for BoolString.
func (b *BoolString) UnmarshalJSON(data []byte) error {
var str string
if err := json.Unmarshal(data, &str); err != nil {
return err
}
parsedBool, err := strconv.ParseBool(str)
if err != nil {
return err
}
*b = BoolString(parsedBool)
return nil
}
// BoolNumber is a custom type for handling boolean values represented as 1/0 numbers in JSON.
type BoolNumber bool
// UnmarshalJSON implements custom unmarshalling logic for BoolNumber.
func (b *BoolNumber) UnmarshalJSON(data []byte) error {
var num int
if err := json.Unmarshal(data, &num); err != nil {
return err
}
*b = BoolNumber(num == 1)
return nil
}
// buildPathSegments appends valid segments to the base path string.
// It handles both pointer and non-pointer types and skips nil values.
func buildPathSegments(base *string, segments ...any) {
for _, v := range segments {
if v == nil {
continue // Skip nil values
}
val := reflect.ValueOf(v)
if val.Kind() == reflect.Ptr {
if val.IsNil() {
continue // Skip nil pointers
}
// Dereference the pointer and use the value
v = val.Elem().Interface()
}
*base += fmt.Sprintf("/%v", v)
}
}