nidus-sync/stadia/error.go

81 lines
1.8 KiB
Go
Raw Permalink Normal View History

package stadia
import (
"encoding/json"
"fmt"
"io"
"resty.dev/v3"
)
// Unfortunately, Stadia Maps is inconsistent in how it handles errors.
// We therefore have to have a function that handles all the different JSON
// error variations.
func parseError(resp *resty.Response) error {
content, err := io.ReadAll(resp.Body)
if err != nil {
return fmt.Errorf("reading all body: %w", err)
}
var server_error serverError
err = json.Unmarshal(content, &server_error)
if err == nil {
return newAPIError(resp.StatusCode(), server_error.Error.Reason)
}
// At this point we've exhausted all of our options, so just pass the JSON through
return newAPIError(resp.StatusCode(), string(content))
}
type apiError struct {
Message string
Status int
}
func newAPIError(status int, msg string) apiError {
return apiError{
Message: msg,
Status: status,
}
}
func (e apiError) Error() string {
return e.Message
}
type Error struct {
ErrorMessage string `json:"error"`
Errors []string `json:"errors"`
}
func (e *Error) Error() string {
return e.ErrorMessage
}
/*
Got this when I managed to bork the server
{
"error": {
"reason": "Internal Server Error"
},
"status": 500
}
*/
type errorWithReason struct {
Reason string `json:"reason"`
}
type serverError struct {
Error errorWithReason `json:"error"`
Status int `json:"status"`
}
/*
if len(result.Geocode.Errors) > 0 {
joined := strings.Join(result.Geocode.Errors, ", ")
return nil, fmt.Errorf("structured geocoding failure: %d '%s'", resp.StatusCode(), joined)
} else if result.Geocode.Error != "" {
return nil, fmt.Errorf("structured geocoding failure: %d '%s'", resp.StatusCode(), result.Geocode.Error)
} else {
return nil, fmt.Errorf("structured geocoding failure: %d", resp.StatusCode())
}
*/