diff --git a/client/create.go b/client/create.go index 43322c0..79b1cb0 100755 --- a/client/create.go +++ b/client/create.go @@ -30,8 +30,7 @@ func (client *Client) SendEmail(request *EmailRequest) (*EmailCreateResponse, er return nil, err } - response := Response[EmailCreateResponse]{} - err = json.NewDecoder(resp.Body).Decode(&response) + response, err := readResponseBody[Response[EmailCreateResponse]](resp) if err != nil { return nil, err } diff --git a/client/get.go b/client/get.go index fccb05b..b28e954 100755 --- a/client/get.go +++ b/client/get.go @@ -1,14 +1,12 @@ package client import ( - "encoding/json" "fmt" "net/http" "strconv" ) func (client *Client) GetEmails(page uint16, limit uint16) (*EmailResponse, error) { - response := Response[EmailResponse]{} httpClient := &http.Client{} req, _ := http.NewRequest( @@ -27,13 +25,8 @@ func (client *Client) GetEmails(page uint16, limit uint16) (*EmailResponse, erro return nil, fmt.Errorf("") } - body := make([]byte, get.ContentLength) - _, err = get.Body.Read(body) - if err != nil { - return nil, err - } + response, err := readResponseBody[Response[EmailResponse]](get) - err = json.Unmarshal(body, &response) if err != nil { return nil, err } @@ -50,18 +43,17 @@ func (client *Client) GetEmail(uuid string) (*Email, error) { ) req.Header.Set("Authorization", client.token.TokenType+" "+client.token.AccessToken) get, err := httpClient.Do(req) - defer get.Body.Close() if err != nil { return nil, err } if get.StatusCode >= 400 { - return nil, fmt.Errorf("") + return nil, fmt.Errorf("bad response status: %s", get.Status) } - response := Response[Email]{} - err = json.NewDecoder(get.Body).Decode(&response) + response, err := readResponseBody[Response[Email]](get) + if err != nil { return nil, err } diff --git a/client/response.go b/client/response.go new file mode 100644 index 0000000..374037d --- /dev/null +++ b/client/response.go @@ -0,0 +1,26 @@ +package client + +import ( + "encoding/json" + "io" + "net/http" +) + +func readResponseBody[T any](res *http.Response) (*T, error) { + defer func(Body io.ReadCloser) { + _ = Body.Close() + }(res.Body) + + responseBody, err := io.ReadAll(res.Body) + if err != nil { + return nil, err + } + + var target T + err = json.Unmarshal(responseBody, target) + if err != nil { + return nil, err + } + + return &target, nil +} diff --git a/client/token.go b/client/token.go index 2bf650e..465e850 100755 --- a/client/token.go +++ b/client/token.go @@ -5,7 +5,6 @@ import ( "encoding/json" "errors" "gitea.siteworxpro.com/golang-packages/email-api-client/redis" - "io" "net/http" "time" ) @@ -53,16 +52,7 @@ func getToken(configuration *Configuration) (*Token, error) { return nil, errors.New("Failed to retrieve access token: " + resp.Status) } - defer func(Body io.ReadCloser) { - _ = Body.Close() - }(resp.Body) - - responseBody, err := io.ReadAll(resp.Body) - if err != nil { - return nil, err - } - - err = json.Unmarshal(responseBody, token) + token, err = readResponseBody[Token](resp) if err != nil { return nil, err }