package middlewares import ( "inp2025/tcp" "io" "net/http" "go.uber.org/zap" ) type Error struct { StatusCode int `json:"code"` Message string `json:"message"` OriginError error `json:"-"` } func (e Error) Error() string { return e.Message } func NewError(err error) Error { return Error{ StatusCode: http.StatusInternalServerError, Message: "Internal server error with unknown reason", OriginError: err, } } func ErrorHandler(next tcp.Handler) tcp.Handler { return func(w tcp.ResponseWriter, req *tcp.Request) error { originErr := next(w, req) var err Error switch originErr := originErr.(type) { case nil: return nil case Error: err = originErr default: err = NewError(originErr) } if err.OriginError == nil { zap.L().Warn(err.Message) } else { zap.L().Error(err.Message, zap.Error(err.OriginError)) } w.WriteHeader(err.StatusCode) io.WriteString(w, err.Message) return err } }