From 4e3dbd84c5916e641929f348a5ba6ed37d0a02f6 Mon Sep 17 00:00:00 2001 From: Tomas Lingotti Date: Mon, 3 Jul 2023 19:04:49 -0300 Subject: [PATCH] add enc/dec json --- server.go | 5 ++--- web.go | 33 +++++++++++++++++++++++++++++---- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/server.go b/server.go index 3ac0958..f31ed74 100644 --- a/server.go +++ b/server.go @@ -64,14 +64,13 @@ func Unwrap(h WebHandler) http.HandlerFunc { if err != nil { requestID := middleware.GetReqID(r.Context()) - evt := log.Error().Caller(2).Err(err) + evt := log.Error().Err(err) if requestID != "" { evt = evt.Str("RequestID", requestID) } evt.Msg("cannot process request") - - wrapErrorResponse(w, err) + wrapErrorResponse(w, requestID, err) } } } diff --git a/web.go b/web.go index 6e22f48..61aac81 100644 --- a/web.go +++ b/web.go @@ -3,13 +3,16 @@ package webh import ( "encoding/json" "errors" + "github.com/rs/zerolog/log" + "io" "net/http" ) type HttpResponse struct { - Message string `json:"message"` - Data interface{} `json:"data,omitempty"` - Success bool `json:"success"` + Message string `json:"message"` + Data interface{} `json:"data,omitempty"` + Success bool `json:"success"` + RequestID string `json:"request_id,omitempty"` } type ErrHTTP struct { @@ -21,7 +24,7 @@ func (e ErrHTTP) Error() string { return e.Message } -func wrapErrorResponse(w http.ResponseWriter, err error) { +func wrapErrorResponse(w http.ResponseWriter, requestID string, err error) { _err := transform(err) w.Header().Set("Content-Type", "application/json") w.WriteHeader(_err.Code) @@ -29,6 +32,8 @@ func wrapErrorResponse(w http.ResponseWriter, err error) { r, _ := json.Marshal(HttpResponse{ Message: _err.Message, Success: false, + + RequestID: requestID, }) _, _ = w.Write(r) } @@ -45,3 +50,23 @@ func transform(e error) *ErrHTTP { Code: http.StatusInternalServerError, } } + +// EJson is the shorthand to encode JSON. +func EJson(w io.Writer, v any) error { + return json.NewEncoder(w).Encode(v) +} + +// Djson is a generic way to unmarshal your JSON. +func Djson[t any](b io.ReadCloser, target *t) (*t, error) { + defer func() { + log.Info().Msg("closing") + _ = b.Close() + }() + + err := json.NewDecoder(b).Decode(target) + + if err != nil { + return nil, err + } + return target, nil +}