package api import ( "encoding/json" "net/http" ) // errorBody is the JSON envelope for failures on /api/*. Kept separate from // the Subsonic envelope so native clients don't have to parse two shapes. type errorBody struct { Error errorPayload `json:"error"` } type errorPayload struct { Code string `json:"code"` Message string `json:"message"` } // writeErr is the canonical way to emit a failure. Code is a stable // short-string clients can switch on; message is human-readable. func writeErr(w http.ResponseWriter, status int, code, message string) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(status) _ = json.NewEncoder(w).Encode(errorBody{Error: errorPayload{Code: code, Message: message}}) } // writeJSON emits a 2xx response with the given body JSON-encoded. Mirrors // writeErr's shape so handlers have one shape for success and one for // failure. func writeJSON(w http.ResponseWriter, status int, body any) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(status) _ = json.NewEncoder(w).Encode(body) }