encodeToJson function
Implementation
String encodeToJson(
Column columnDetails,
bool jsonbToDynamic,
) {
final columnName = columnDetails.camelColName;
String format = columnDetails.postgresFormat;
bool isArray = format.contains("[]");
if (jsonbToDynamic && (format == 'jsonb' || format == 'jsonb[]')) {
return columnName;
}
String jsonEncodableType = '';
switch (format) {
case 'smallint':
case 'integer':
case 'smallint[]':
case 'integer[]':
jsonEncodableType = columnName;
break;
case 'bigint':
jsonEncodableType = "$columnName.toString()";
break;
case 'bigint[]':
jsonEncodableType = "$columnName.map((e) => e.toString()).toList()";
break;
case 'real':
case 'real[]':
jsonEncodableType = columnName;
case 'double precision':
case 'numeric':
jsonEncodableType = '$columnName.toString()';
break;
case 'double precision[]':
case 'numeric[]':
jsonEncodableType = "$columnName.map((e) => e.toString()).toList()";
break;
case 'json':
case 'jsonb':
jsonEncodableType = columnName;
break;
case 'json[]':
case 'jsonb[]':
jsonEncodableType = '$columnName.map((e) => jsonEncode(e)).toList()';
break;
case 'text':
case 'character varying':
case 'character':
case 'uuid':
jsonEncodableType = columnName;
break;
case 'text[]':
case 'character varying[]':
case 'character[]':
case 'uuid[]':
jsonEncodableType = "$columnName.map((e) => e).toList()";
break;
case 'date':
jsonEncodableType = "$columnName.toIso8601String()";
break;
case 'date[]':
jsonEncodableType =
"$columnName.map((e) => e.toIso8601String()).toList()";
break;
case 'time without time zone':
jsonEncodableType = "DateFormat('HH:mm:ss.SSS').format($columnName)";
break;
case 'time without time zone[]':
jsonEncodableType =
"$columnName.map((e) => DateFormat('HH:mm:ss.SSS').format(e)).toList()";
break;
case 'time with time zone':
jsonEncodableType =
"DateFormat('HH:mm:ssZ').format($columnName.toLocal())";
break;
case 'time with time zone[]':
jsonEncodableType =
"$columnName.map((e) => DateFormat('HH:mm:ssZ').format(e.toLocal())).toList()";
break;
case 'timestamp without time zone':
jsonEncodableType = "$columnName.toIso8601String()";
break;
case 'timestamp without time zone[]':
jsonEncodableType =
"$columnName.map((e) => e.toIso8601String()).toList()";
break;
case 'timestamp with time zone':
jsonEncodableType = "$columnName.toUtc().toIso8601String()";
break;
case 'timestamp with time zone[]':
jsonEncodableType =
"$columnName.map((e) => e.toUtc().toIso8601String()).toList()";
break;
case 'boolean':
jsonEncodableType = columnName;
break;
case 'boolean[]':
jsonEncodableType = "$columnName.map((e) => e).toList()";
break;
case 'interval':
jsonEncodableType = '$columnName.toString()';
break;
case 'interval[]':
jsonEncodableType = "$columnName.map((e) => e.toString()).toList()";
break;
// These types will be prefixed with the schema PostGIS is installed in
// (eg. extensions.geometry), and may optionally end with a specific
// geometry type if specified for the column (eg. extensions.geometry(POINT),
// extensions.geometry(LINESTRING)), so check that they contain name
// anywhere in the string.
case final String s when s.contains('geometry') && s.endsWith('[]'):
case final String s when s.contains('geography') && s.endsWith('[]'):
jsonEncodableType =
'$columnName.map((e) => e.toBytesHex(format: WKB.geometryExtended)).toList()';
break;
case final String s when s.contains('geometry'):
case final String s when s.contains('geography'):
jsonEncodableType =
'$columnName.toBytesHex(format: WKB.geometryExtended)';
break;
// NOT YET SUPPORTED TYPES ARE ENCODED TO STRINGS BY DEFAULT
// NEED CONTRIBUTIONS TO SUPPORT THESE TYPES
case 'bytea':
case 'inet':
case 'cidr':
case 'macaddr':
case 'macaddr8':
case 'point':
case 'line':
case 'lseg':
case 'box':
case 'path':
case 'polygon':
case 'circle':
case 'bit':
case 'bit varying':
case 'money':
case 'tsquery':
case 'tsvector':
case 'xml':
case 'pg_lsn':
case 'pg_snapshot':
case 'txid_snapshot':
jsonEncodableType = '$columnName.toString()';
break;
case 'bytea[]':
case 'inet[]':
case 'cidr[]':
case 'macaddr[]':
case 'macaddr8[]':
case 'point[]':
case 'line[]':
case 'lseg[]':
case 'box[]':
case 'path[]':
case 'polygon[]':
case 'circle[]':
case 'bit[]':
case 'bit varying[]':
case 'money[]':
case 'tsquery[]':
case 'tsvector[]':
case 'xml[]':
case 'pg_lsn[]':
case 'pg_snapshot[]':
case 'txid_snapshot[]':
jsonEncodableType = "$columnName.map((e) => e.toString()).toList()";
break;
default:
if (format.contains("vector") || format.contains("VECTOR")) {
jsonEncodableType = '$columnName.toString()';
break;
}
// print(columnName);
// print(columnDetails.enumValues);
if (columnDetails.enumValues.isNotEmpty) {
jsonEncodableType = isArray
? "$columnName.map((e) => e.toString().split('.').last).toList()"
: "$columnName.toString().split('.').last";
break;
} else {
print(
"No enum values found for $columnName, if you have enum values, please add them to the yaml file");
}
}
return jsonEncodableType;
}