Skip to content

Commit

Permalink
Add exception for empty array when publishing data
Browse files Browse the repository at this point in the history
Add exception for enabling empty array sending (that differs from arrays with one null element)
An empty array with corrrect type is now sent to astarte

Signed-off-by: Eddy Babetto <eddy.babetto@secomind.com>
  • Loading branch information
eddbbt committed May 6, 2024
1 parent d02f658 commit 5e717c4
Showing 1 changed file with 32 additions and 21 deletions.
53 changes: 32 additions & 21 deletions cmd/appengine/device.go
Original file line number Diff line number Diff line change
Expand Up @@ -1603,6 +1603,7 @@ func parseSendDataPayload(payload string, mappingType interfaces.AstarteMappingT
// Default to string, as it will be ok for most cases
var ret interface{} = payload
var err error

switch mappingType {
case interfaces.Double:
if ret, err = strconv.ParseFloat(payload, 64); err != nil {
Expand Down Expand Up @@ -1634,32 +1635,42 @@ func parseSendDataPayload(payload string, mappingType interfaces.AstarteMappingT
case interfaces.BinaryBlobArray, interfaces.BooleanArray, interfaces.DateTimeArray, interfaces.DoubleArray,
interfaces.IntegerArray, interfaces.LongIntegerArray, interfaces.StringArray:

//wait it's all string?
payload = strings.Replace(payload, "[", "", -1)
payload = strings.Replace(payload, "]", "", -1)
payload_parsed := strings.Split(payload, ",")
//always has been
//check if payload is an empty array, bypass conversions and just return an empty array of correct type
// if it is not, proceed as usual
if payload == "[]" {
ret = make([]interface{}, 0)

jsonOut := make([]interface{}, len(payload_parsed))
for i, v := range payload_parsed {
jsonOut[i] = v
}
} else {

retArray := []interface{}{}
// Do a smarter conversion here.
for _, v := range jsonOut {
switch val := v.(type) {
case string:
p, err := parseSendDataPayload(strings.TrimSpace(val), interfaces.AstarteMappingType(strings.TrimSuffix(string(mappingType), "array")))
if err != nil {
return nil, err
//wait it's all string?
payload = strings.Replace(payload, "[", "", -1)
payload = strings.Replace(payload, "]", "", -1)
payload_parsed := strings.Split(payload, ",")
//always has been

jsonOut := make([]interface{}, len(payload_parsed))
for i, v := range payload_parsed {
jsonOut[i] = v
}

retArray := []interface{}{}

// Do a smarter conversion here.
for _, v := range jsonOut {
switch val := v.(type) {
case string:
p, err := parseSendDataPayload(strings.TrimSpace(val), interfaces.AstarteMappingType(strings.TrimSuffix(string(mappingType), "array")))
if err != nil {
return nil, err
}
retArray = append(retArray, p)
default:
retArray = append(retArray, val)
}
retArray = append(retArray, p)
default:
retArray = append(retArray, val)
}
ret = retArray
}
ret = retArray

}

return ret, nil
Expand Down

0 comments on commit 5e717c4

Please sign in to comment.