// Package handler holds HTTP handlers. Handlers parse the request, call into // service, and translate the result (or error) into an HTTP response. package handler import ( "encoding/json" "net/http" "github.com/dbiz/cdp/data-layer/api/internal/apperr" ) type errorResponse struct { Error string `json:"error"` Field string `json:"field,omitempty"` } func writeJSON(w http.ResponseWriter, status int, body any) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(status) _ = json.NewEncoder(w).Encode(body) } func writeError(w http.ResponseWriter, err error) { if ae, ok := apperr.As(err); ok { if ae.RetryAfter > 0 { w.Header().Set("Retry-After", itoa(ae.RetryAfter)) } writeJSON(w, ae.Code, errorResponse{Error: ae.Message, Field: ae.Field}) return } writeJSON(w, http.StatusInternalServerError, errorResponse{Error: "internal server error"}) } func itoa(i int) string { const digits = "0123456789" if i == 0 { return "0" } var buf [20]byte pos := len(buf) for i > 0 { pos-- buf[pos] = digits[i%10] i /= 10 } return string(buf[pos:]) }