diff --git a/charger/ocpp/helper.go b/charger/ocpp/helper.go index da86760f9..b2224800a 100644 --- a/charger/ocpp/helper.go +++ b/charger/ocpp/helper.go @@ -20,8 +20,7 @@ func wait(err error, rc chan error) error { close(rc) } - oe := new(ocpp.Error) - if errors.As(err, &oe) && oe.Code == ocppj.GenericError { + if oe := new(ocpp.Error); errors.As(err, &oe) && oe.Code == ocppj.GenericError { err = api.ErrTimeout } } diff --git a/cmd/error.go b/cmd/error.go index ef926411a..22459b0cc 100644 --- a/cmd/error.go +++ b/cmd/error.go @@ -81,8 +81,7 @@ func (e ClassError) MarshalJSON() ([]byte, error) { Error: e.err.Error(), } - var de *DeviceError - if errors.As(e.err, &de) { + if de := new(DeviceError); errors.As(e.err, &de) { res.Device = de.Name } diff --git a/cmd/setup.go b/cmd/setup.go index 054097ad0..08f626605 100644 --- a/cmd/setup.go +++ b/cmd/setup.go @@ -345,8 +345,7 @@ func vehicleInstance(cc config.Named) (api.Vehicle, error) { instance, err := vehicle.NewFromConfig(ctx, cc.Type, cc.Other) if err != nil { - var ce *util.ConfigError - if errors.As(err, &ce) { + if ce := new(util.ConfigError); errors.As(err, &ce) { return nil, err } @@ -742,8 +741,7 @@ func tariffInstance(name string, conf config.Typed) (api.Tariff, error) { instance, err := tariff.NewFromConfig(ctx, conf.Type, conf.Other) if err != nil { - var ce *util.ConfigError - if errors.As(err, &ce) { + if ce := new(util.ConfigError); errors.As(err, &ce) { return nil, err } diff --git a/meter/lgpcs/lgpcs.go b/meter/lgpcs/lgpcs.go index 56ff7915d..b3d00e0c1 100644 --- a/meter/lgpcs/lgpcs.go +++ b/meter/lgpcs/lgpcs.go @@ -150,8 +150,7 @@ func (m *Com) update(meterData any) error { if err := m.DoJSON(req, meterData); err != nil { // re-login if request returns 405-error - var se request.StatusError - if errors.As(err, &se) && se.StatusCode() == http.StatusMethodNotAllowed { + if se := new(request.StatusError); errors.As(err, &se) && se.StatusCode() == http.StatusMethodNotAllowed { if err := m.Login(); err != nil { return err } diff --git a/server/modbus/handler.go b/server/modbus/handler.go index f0b4f8e34..c8cbe9d3c 100644 --- a/server/modbus/handler.go +++ b/server/modbus/handler.go @@ -44,9 +44,8 @@ func (h *handler) logResult(op string, b []byte, err error) { func (h *handler) exceptionToUint16AndError(op string, b []byte, err error) ([]uint16, error) { h.logResult(op, b, err) - var modbusError *gridx.Error - if errors.As(err, &modbusError) { - err = mbserver.MapExceptionCodeToError(modbusError.ExceptionCode) + if me := new(gridx.Error); errors.As(err, &me) { + err = mbserver.MapExceptionCodeToError(me.ExceptionCode) } return bytesAsUint16(b), err @@ -75,9 +74,8 @@ func coilsToBytes(b []bool) []byte { func (h *handler) bytesToBoolResult(op string, qty uint16, b []byte, err error) ([]bool, error) { h.logResult(op, b, err) - var modbusError *gridx.Error - if errors.As(err, &modbusError) { - err = mbserver.MapExceptionCodeToError(modbusError.ExceptionCode) + if me := new(gridx.Error); errors.As(err, &me) { + err = mbserver.MapExceptionCodeToError(me.ExceptionCode) } var res []bool diff --git a/tariff/helper.go b/tariff/helper.go index 56fa26468..40d14b72d 100644 --- a/tariff/helper.go +++ b/tariff/helper.go @@ -20,8 +20,7 @@ func bo() backoff.BackOff { // backoffPermanentError returns a permanent error in case of HTTP 400 func backoffPermanentError(err error) error { - var se request.StatusError - if errors.As(err, &se) { + if se := new(request.StatusError); errors.As(err, &se) { if code := se.StatusCode(); code >= 400 && code <= 599 { return backoff.Permanent(se) } diff --git a/util/request/functions.go b/util/request/functions.go index 411d47f2d..9a542ad6a 100644 --- a/util/request/functions.go +++ b/util/request/functions.go @@ -43,22 +43,22 @@ type StatusError struct { resp *http.Response } -func (e StatusError) Error() string { +func (e *StatusError) Error() string { return fmt.Sprintf("unexpected status: %d (%s)", e.resp.StatusCode, http.StatusText(e.resp.StatusCode)) } // Response returns the response with the unexpected error -func (e StatusError) Response() *http.Response { +func (e *StatusError) Response() *http.Response { return e.resp } // StatusCode returns the response's status code -func (e StatusError) StatusCode() int { +func (e *StatusError) StatusCode() int { return e.resp.StatusCode } // HasStatus returns true if the response's status code matches any of the given codes -func (e StatusError) HasStatus(codes ...int) bool { +func (e *StatusError) HasStatus(codes ...int) bool { for _, code := range codes { if e.resp.StatusCode == code { return true @@ -70,7 +70,7 @@ func (e StatusError) HasStatus(codes ...int) bool { // ResponseError turns an HTTP status code into an error func ResponseError(resp *http.Response) error { if resp.StatusCode < 200 || resp.StatusCode >= 300 { - return StatusError{resp: resp} + return &StatusError{resp: resp} } return nil } @@ -85,7 +85,7 @@ func ReadBody(resp *http.Response) ([]byte, error) { } if resp.StatusCode < 200 || resp.StatusCode >= 300 { - return b, StatusError{resp: resp} + return b, &StatusError{resp: resp} } return b, nil diff --git a/vehicle/fiat/provider.go b/vehicle/fiat/provider.go index c7982002d..e6ad7e8a5 100644 --- a/vehicle/fiat/provider.go +++ b/vehicle/fiat/provider.go @@ -52,8 +52,7 @@ func (v *Provider) deepRefresh() error { if err == nil && res.ResponseStatus != "pending" { err = fmt.Errorf("invalid response status: %s", res.ResponseStatus) } else { - var se request.StatusError - if errors.As(err, &se) && se.StatusCode() == http.StatusForbidden { + if se := new(request.StatusError); errors.As(err, &se) && se.StatusCode() == http.StatusForbidden { err = nil } } diff --git a/vehicle/renault/provider.go b/vehicle/renault/provider.go index 659a66e5f..e8b72d366 100644 --- a/vehicle/renault/provider.go +++ b/vehicle/renault/provider.go @@ -1,6 +1,7 @@ package renault import ( + "errors" "net/http" "slices" "strings" @@ -140,7 +141,7 @@ func (v *Provider) Climater() (bool, error) { res, err := v.hvacG() // Zoe Ph2, Megane e-tech - if err, ok := err.(request.StatusError); ok && err.HasStatus(http.StatusForbidden, http.StatusNotFound, http.StatusBadGateway) { + if se := new(request.StatusError); errors.As(err, &se) && se.HasStatus(http.StatusForbidden, http.StatusNotFound, http.StatusBadGateway) { return false, api.ErrNotAvailable } diff --git a/vehicle/tronity.go b/vehicle/tronity.go index 52b141892..a4a712683 100644 --- a/vehicle/tronity.go +++ b/vehicle/tronity.go @@ -224,8 +224,7 @@ func (v *Tronity) post(uri string) error { } // ignore HTTP 405 - var se request.StatusError - if errors.As(err, &se) && se.StatusCode() == http.StatusMethodNotAllowed { + if se := new(request.StatusError); errors.As(err, &se) && se.StatusCode() == http.StatusMethodNotAllowed { err = nil } diff --git a/vehicle/vw/api.go b/vehicle/vw/api.go index 86b5c4c08..692eccc1b 100644 --- a/vehicle/vw/api.go +++ b/vehicle/vw/api.go @@ -1,6 +1,7 @@ package vw import ( + "errors" "fmt" "net/http" "strings" @@ -99,7 +100,7 @@ func (v *API) Status(vin string) (StatusResponse, error) { err = v.DoJSON(req, &res) } - if _, ok := err.(request.StatusError); ok { + if se := new(request.StatusError); errors.As(err, &se) { var rr RolesRights rr, err = v.RolesRights(vin)