fix: preserve partial batch property results
This commit is contained in:
@@ -747,6 +747,7 @@ func (device *Device) GetMany(ctx context.Context, names []string) ([]DeviceProp
|
||||
return nil, err
|
||||
}
|
||||
byIdentity := make(map[propertyIdentity]PropertyResult, len(chunkResults))
|
||||
duplicateIdentities := make(map[propertyIdentity]struct{})
|
||||
requested := make(map[propertyIdentity]struct{}, end-start)
|
||||
for _, request := range requests[start:end] {
|
||||
requested[propertyIdentity{did: request.DID, siid: request.SIID, piid: request.PIID}] = struct{}{}
|
||||
@@ -757,17 +758,30 @@ func (device *Device) GetMany(ctx context.Context, names []string) ([]DeviceProp
|
||||
return nil, fmt.Errorf("get properties protocol error: unexpected identity (%s,%d,%d)", result.DID, result.SIID, result.PIID)
|
||||
}
|
||||
if _, duplicate := byIdentity[identity]; duplicate {
|
||||
return nil, fmt.Errorf("get properties protocol error: duplicate identity (%s,%d,%d)", result.DID, result.SIID, result.PIID)
|
||||
duplicateIdentities[identity] = struct{}{}
|
||||
continue
|
||||
}
|
||||
byIdentity[identity] = result
|
||||
}
|
||||
for index, request := range requests[start:end] {
|
||||
identity := propertyIdentity{did: request.DID, siid: request.SIID, piid: request.PIID}
|
||||
name := names[start+index]
|
||||
if _, duplicate := duplicateIdentities[identity]; duplicate {
|
||||
results[start+index] = DevicePropertyResult{
|
||||
Name: name,
|
||||
Err: fmt.Errorf("get properties protocol error: duplicate identity (%s,%d,%d)", request.DID, request.SIID, request.PIID),
|
||||
}
|
||||
continue
|
||||
}
|
||||
result, ok := byIdentity[identity]
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("get properties protocol error: missing identity (%s,%d,%d)", request.DID, request.SIID, request.PIID)
|
||||
results[start+index] = DevicePropertyResult{
|
||||
Name: name,
|
||||
Err: fmt.Errorf("get properties protocol error: missing identity (%s,%d,%d)", request.DID, request.SIID, request.PIID),
|
||||
}
|
||||
continue
|
||||
}
|
||||
results[start+index] = DevicePropertyResult{Name: names[start+index], Value: result.Value, Code: result.Code}
|
||||
results[start+index] = DevicePropertyResult{Name: name, Value: result.Value, Code: result.Code}
|
||||
}
|
||||
}
|
||||
if err := device.wait(ctx); err != nil {
|
||||
|
||||
Reference in New Issue
Block a user