59 lines
1.3 KiB
Go
59 lines
1.3 KiB
Go
package httpapi
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"net/http"
|
|
|
|
"ai-workflow-skill/packages/coord-core/store"
|
|
)
|
|
|
|
type errorEnvelope struct {
|
|
Error errorPayload `json:"error"`
|
|
}
|
|
|
|
type errorPayload struct {
|
|
Code string `json:"code"`
|
|
Message string `json:"message"`
|
|
}
|
|
|
|
func writeJSON(w http.ResponseWriter, status int, payload any) {
|
|
w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
|
w.WriteHeader(status)
|
|
|
|
enc := json.NewEncoder(w)
|
|
enc.SetIndent("", " ")
|
|
_ = enc.Encode(payload)
|
|
}
|
|
|
|
func writeError(w http.ResponseWriter, err error) {
|
|
status, code := classifyError(err)
|
|
writeJSON(w, status, errorEnvelope{
|
|
Error: errorPayload{
|
|
Code: code,
|
|
Message: errorMessage(err),
|
|
},
|
|
})
|
|
}
|
|
|
|
func classifyError(err error) (int, string) {
|
|
switch {
|
|
case errors.Is(err, store.ErrInvalidInput):
|
|
return http.StatusBadRequest, "invalid_input"
|
|
case errors.Is(err, store.ErrRunNotFound), errors.Is(err, store.ErrTaskNotFound), errors.Is(err, store.ErrThreadNotFound):
|
|
return http.StatusNotFound, "not_found"
|
|
case errors.Is(err, store.ErrInvalidState):
|
|
return http.StatusConflict, "invalid_state"
|
|
default:
|
|
return http.StatusInternalServerError, "internal_error"
|
|
}
|
|
}
|
|
|
|
func errorMessage(err error) string {
|
|
if err == nil {
|
|
return "unknown error"
|
|
}
|
|
return fmt.Sprintf("%v", err)
|
|
}
|