dartTypeFor function
Maps a column to a Dart type: casts win, then the database type. Booleans, dates and JSON without a cast stay raw (with a hint), because SQLite returns them as integers/strings.
Implementation
({String type, String? hint}) dartTypeFor(ColumnInfo column, String? cast) {
switch (cast) {
case 'dateTime' || 'date' || 'immutableDateTime' || 'dateTimeFormat':
return (type: 'DateTime', hint: null);
case 'boolean' || 'bool':
return (type: 'bool', hint: null);
case 'integer' || 'int':
return (type: 'int', hint: null);
case 'double' || 'float':
return (type: 'double', hint: null);
case 'json' || 'array' || 'map':
return (type: 'Object', hint: null);
case 'string':
return (type: 'String', hint: null);
}
final t = column.type.toLowerCase();
if (t.contains('bool')) {
return (type: 'Object', hint: 'add Cast.boolean for a bool accessor');
}
if (t.contains('int') || t == 'serial' || t == 'bigserial') {
return (type: 'int', hint: null);
}
if (t.contains('real') || t.contains('floa') || t.contains('doub')) {
return (type: 'double', hint: null);
}
if (t.contains('date') || t.contains('time')) {
return (type: 'String', hint: 'add Cast.dateTime for a DateTime accessor');
}
if (t.contains('json')) {
return (type: 'Object', hint: 'add Cast.json for decoded access');
}
if (t.contains('blob') || t.contains('bytea') || t.contains('binary')) {
return (type: 'List<int>', hint: null);
}
return (type: 'String', hint: null);
}