Ensure channel closure in LightsStart, LightsStop, and GetLocation methods; improve error handling in executeServiceRequest
All checks were successful
Golan Testing / testing (1.24.x, ubuntu-latest) (push) Successful in 27s

This commit is contained in:
2025-07-05 13:50:31 -04:00
parent 3f426d206d
commit cff0624807

View File

@ -339,7 +339,7 @@ func (v *Vehicle) LightsStart() (chan string, error) {
}
ch := make(chan string)
go func() {
// defer close(ch)
defer close(ch)
v.executeServiceRequest(params, reqUrl, pollingUrl, ch, 1)
}()
return ch, nil
@ -364,7 +364,7 @@ func (v *Vehicle) LightsStop() (chan string, error) {
}
ch := make(chan string)
go func() {
// defer close(ch)
defer close(ch)
v.executeServiceRequest(params, reqUrl, pollingUrl, ch, 1)
}()
@ -475,7 +475,7 @@ func (v *Vehicle) GetLocation(force bool) (chan string, error) {
ch := make(chan string)
go func() {
// defer close(ch)
defer close(ch)
v.executeServiceRequest(params, reqUrl, pollingUrl, ch, 1)
}()
return ch, nil
@ -516,33 +516,31 @@ func (v *Vehicle) executeServiceRequest(params map[string]string, reqUrl, pollin
// dataName field has the list of the states [ remoteServiceStatus | errorResponse ]
if resp.DataName == "remoteServiceStatus" {
if sr, ok := v.parseServiceRequest([]byte(resp.Data)); ok {
ch <- sr.RemoteServiceState
switch sr.RemoteServiceState {
case "finished":
// Finished RemoteServiceState Service Request does not include Service Request ID
v.client.logger.Debug("Remote service request completed successfully")
ch <- sr.RemoteServiceState
case "started":
time.Sleep(5 * time.Second)
v.client.logger.Debug("Subaru API reports remote service request (started) is in progress", "id", sr.ServiceRequestID)
v.executeServiceRequest(map[string]string{"serviceRequestId": sr.ServiceRequestID}, reqUrl, pollingUrl, ch, attempt+1)
ch <- sr.RemoteServiceState
case "stopping":
time.Sleep(5 * time.Second)
v.client.logger.Debug("Subaru API reports remote service request (stopping) is in progress", "id", sr.ServiceRequestID)
v.executeServiceRequest(map[string]string{"serviceRequestId": sr.ServiceRequestID}, reqUrl, pollingUrl, ch, attempt+1)
ch <- sr.RemoteServiceState
default:
time.Sleep(5 * time.Second)
v.client.logger.Debug("Subaru API reports remote service request (default)")
v.executeServiceRequest(map[string]string{"serviceRequestId": sr.ServiceRequestID}, reqUrl, pollingUrl, ch, attempt+1)
ch <- sr.RemoteServiceState
}
return nil
}
v.client.logger.Error("error while parsing service request json", "request", reqUrl, "response", resp.Data)
return errors.New("error while parsing service request json")
}
return errors.New("response is not a service request")
}