From 5e717c43af9fb36a4fac4b3f6c2f654a40361b85 Mon Sep 17 00:00:00 2001 From: Eddy Babetto Date: Mon, 6 May 2024 15:30:05 +0200 Subject: [PATCH] Add exception for empty array when publishing data 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 --- cmd/appengine/device.go | 53 +++++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 21 deletions(-) diff --git a/cmd/appengine/device.go b/cmd/appengine/device.go index 9f8ae58..6e1d22d 100644 --- a/cmd/appengine/device.go +++ b/cmd/appengine/device.go @@ -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 { @@ -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