toArray function

dynamic toArray(
  1. dynamic value,
  2. String type
)

Converts a Postgres Array into a native Dart array

@example toArray('{"[2021-01-01,2021-12-31)","(2021-01-01,2021-12-32]"}', 'daterange')
//=> ['[2021-01-01,2021-12-31)', '(2021-01-01,2021-12-32]']
@example toArray([1,2,3,4], 'int4')
//=> [1,2,3,4]

Implementation

dynamic toArray(dynamic value, String type) {
  if (value is! String) {
    return value;
  }

  // trim Postgres array curly brackets
  final lastIdx = value.length - 1;
  final closeBrace = value[lastIdx];
  final openBrace = value[0];

  // Confirm value is a Postgres array by checking curly brackets
  if (openBrace == '{' && closeBrace == '}') {
    final valTrim = value.substring(1, lastIdx);
    List arr;

    // TODO: find a better solution to separate Postgres array data
    try {
      arr = json.decode('[$valTrim]') as List;
    } catch (_) {
      // WARNING: splitting on comma does not cover all edge cases
      arr = valTrim != '' ? valTrim.split(',') : [];
    }

    return arr.map((val) => convertCell(type, val)).toList();
  }

  return value;
}