Some checks are pending
Docs Deploy / build_and_deploy (push) Waiting to run
Generate Docs / cli (push) Waiting to run
Generate Config Doc / cli (push) Waiting to run
Go formatting / go-formatting (push) Waiting to run
Check links / markdown-link-check (push) Waiting to run
Integration / pre-test (push) Waiting to run
Integration / test on (push) Blocked by required conditions
Integration / status (push) Blocked by required conditions
Lint / Lint Go code (push) Waiting to run
Test / test (ubuntu-latest) (push) Waiting to run
48 lines
1.1 KiB
Go
48 lines
1.1 KiB
Go
package xhttp
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
|
|
"github.com/ignite/cli/v29/ignite/pkg/errors"
|
|
)
|
|
|
|
// ResponseJSON writes a JSON response to w by using status as http status and data
|
|
// as payload.
|
|
func ResponseJSON(w http.ResponseWriter, status int, data interface{}) error {
|
|
var errMarhsal error
|
|
bz, err := json.Marshal(data)
|
|
if err != nil {
|
|
status = http.StatusInternalServerError
|
|
bz, errMarhsal = json.Marshal(NewErrorResponse(errors.New(http.StatusText(status))))
|
|
|
|
// wrap error
|
|
if errMarhsal != nil {
|
|
err = errors.Errorf("%w: %s", err, errMarhsal.Error())
|
|
}
|
|
}
|
|
w.Header().Set("Content-Type", "application/json")
|
|
w.WriteHeader(status)
|
|
_, _ = w.Write(bz)
|
|
return err
|
|
}
|
|
|
|
// ErrorResponseBody is the skeleton for error messages that should be sent to
|
|
// client.
|
|
type ErrorResponseBody struct {
|
|
Error ErrorResponse `json:"error"`
|
|
}
|
|
|
|
// ErrorResponse holds the error message.
|
|
type ErrorResponse struct {
|
|
Message string `json:"message"`
|
|
}
|
|
|
|
// NewErrorResponse creates a new http error response from err.
|
|
func NewErrorResponse(err error) ErrorResponseBody {
|
|
return ErrorResponseBody{
|
|
Error: ErrorResponse{
|
|
Message: err.Error(),
|
|
},
|
|
}
|
|
}
|