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 f03db4a
Showing 1 changed file with 48 additions and 21 deletions.
69 changes: 48 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,58 @@ 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 == "[]" {

switch interfaces.AstarteMappingType(strings.TrimSuffix(string(mappingType), "array")) {
case interfaces.Double:
ret = make([]float64, 0)
case interfaces.Integer:
ret = make([]int32, 0)
case interfaces.LongInteger:
ret = make([]int64, 0)
case interfaces.Boolean:
ret = make([]bool, 0)
case interfaces.BinaryBlob:
ret = make([][]byte, 0)
case interfaces.DateTime:
ret = make([]interface{}, 0)
case interfaces.String:
ret = make([]string, 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 f03db4a

Please sign in to comment.