serializeProperties function

dynamic serializeProperties(
  1. dynamic originalData, {
  2. List<String>? shouldCastToNumbers,
  3. List<String>? shouldMapToBooleans,
})

Recursively normalizes response data by transforming keys to camelCase and optionally casting specified properties to numbers or booleans.

Implementation

dynamic serializeProperties(
  dynamic originalData, {
  List<String>? shouldCastToNumbers,
  List<String>? shouldMapToBooleans,
}) {
  if (originalData is List) {
    return originalData
        .map(
          (entity) => serializeProperties(
            entity,
            shouldCastToNumbers: shouldCastToNumbers,
            shouldMapToBooleans: shouldMapToBooleans,
          ),
        )
        .toList();
  }

  if (originalData is Map) {
    final cleanedObject = <String, dynamic>{};

    for (final entry in originalData.entries) {
      final originalKey = entry.key.toString();
      dynamic sanitizedValue = entry.value;

      if (shouldCastToNumbers != null &&
          shouldCastToNumbers.contains(originalKey)) {
        if (sanitizedValue != null) {
          if (sanitizedValue is num) {
            // Already numeric
          } else {
            final str = sanitizedValue.toString();
            sanitizedValue = num.tryParse(str) ?? sanitizedValue;
          }
        }
      }

      if (shouldMapToBooleans != null &&
          shouldMapToBooleans.contains(originalKey)) {
        if (sanitizedValue != null) {
          final str = sanitizedValue.toString().toLowerCase();
          sanitizedValue = (str == '1' || str == 'true');
        }
      }

      cleanedObject[naiveCamelCase(originalKey)] = serializeProperties(
        sanitizedValue,
        shouldCastToNumbers: shouldCastToNumbers,
        shouldMapToBooleans: shouldMapToBooleans,
      );
    }

    return cleanedObject;
  }

  return originalData;
}