61 lines
1.0 KiB
Go
61 lines
1.0 KiB
Go
package main
|
|
|
|
import (
|
|
"log"
|
|
"net/http"
|
|
)
|
|
|
|
type netError interface {
|
|
Error() string
|
|
Unwrap() error
|
|
Respond(w http.ResponseWriter)
|
|
}
|
|
|
|
type userFacingError struct {
|
|
code int
|
|
e error
|
|
}
|
|
|
|
func (ufe userFacingError) Error() string {
|
|
return ufe.e.Error()
|
|
}
|
|
|
|
func (ufe userFacingError) Unwrap() error {
|
|
return ufe.e
|
|
}
|
|
|
|
func (ufe userFacingError) Respond(w http.ResponseWriter) {
|
|
w.Header().Set(`Content-Type`, `text/plain;charset=UTF-8`)
|
|
if ufe.code != 0 {
|
|
w.WriteHeader(ufe.code)
|
|
} else {
|
|
w.WriteHeader(400) // default
|
|
}
|
|
|
|
w.Write([]byte(ufe.e.Error()))
|
|
}
|
|
|
|
var _ netError = userFacingError{} // interface assertion
|
|
|
|
type systemError struct {
|
|
e error
|
|
}
|
|
|
|
func (se systemError) Error() string {
|
|
return se.e.Error()
|
|
}
|
|
|
|
func (se systemError) Unwrap() error {
|
|
return se.e
|
|
}
|
|
|
|
func (se systemError) Respond(w http.ResponseWriter) {
|
|
log.Printf(`[internal error] %s`, se.e.Error())
|
|
|
|
w.Header().Set(`Content-Type`, `text/plain;charset=UTF-8`)
|
|
w.WriteHeader(500)
|
|
w.Write([]byte(`An internal error occurred.`))
|
|
}
|
|
|
|
var _ netError = systemError{} // interface assertion
|