127 lines
3.4 KiB
Dart
127 lines
3.4 KiB
Dart
import 'package:uuid/uuid.dart';
|
|
|
|
typedef SerialTableField = TableField<int>;
|
|
typedef UUIDTableField = TableField<UuidValue>;
|
|
typedef StringTableField = TableField<String>;
|
|
typedef BigIntTableField = TableField<BigInt>;
|
|
typedef BoolTableField = TableField<bool>;
|
|
typedef DateTableField = TableField<DateTime>;
|
|
typedef DateTimeTableField = TableField<DateTime>;
|
|
typedef FloatTableField = TableField<double>;
|
|
typedef IntTableField = TableField<int>;
|
|
|
|
final possibleFieldTypes = {
|
|
"serial": SerialTableField,
|
|
"uuid": UUIDTableField,
|
|
"str": StringTableField,
|
|
"bigint": BigIntTableField,
|
|
"bool": BoolTableField,
|
|
"date": DateTableField,
|
|
"datetime": DateTimeTableField,
|
|
"float": FloatTableField,
|
|
"int": IntTableField,
|
|
};
|
|
|
|
class TableField<T> {
|
|
final String fieldName;
|
|
final String fieldType;
|
|
final bool isUnique;
|
|
final bool isPrimary;
|
|
final Type type = T;
|
|
|
|
TableField({
|
|
required this.fieldName,
|
|
required this.fieldType,
|
|
required this.isUnique,
|
|
required this.isPrimary,
|
|
});
|
|
|
|
bool canBePrimary() {
|
|
return fieldType == "serial" || fieldType == "uuid";
|
|
}
|
|
|
|
@override
|
|
String toString() {
|
|
return "TableField<$T>(fieldName: $fieldName, fieldType: $fieldType, isUnique: $isUnique, isPrimary: $isPrimary)";
|
|
}
|
|
|
|
String toColumnDefinition() {
|
|
return "$fieldName:$fieldType${isPrimary ? ":primary" : ""}${isUnique ? ":unique" : ""}";
|
|
}
|
|
|
|
static TableField parseTableField(String definition) {
|
|
final parts = definition.split(":");
|
|
final fieldName = parts[0];
|
|
final fieldType = parts[1];
|
|
final isUnique = parts.contains("unique");
|
|
final isPrimary = parts.contains("primary");
|
|
|
|
switch (fieldType) {
|
|
case "serial":
|
|
return SerialTableField(
|
|
fieldName: fieldName,
|
|
fieldType: fieldType,
|
|
isUnique: isUnique,
|
|
isPrimary: isPrimary,
|
|
);
|
|
case "uuid":
|
|
return UUIDTableField(
|
|
fieldName: fieldName,
|
|
fieldType: fieldType,
|
|
isUnique: isUnique,
|
|
isPrimary: isPrimary,
|
|
);
|
|
case "str":
|
|
return StringTableField(
|
|
fieldName: fieldName,
|
|
fieldType: fieldType,
|
|
isUnique: isUnique,
|
|
isPrimary: isPrimary,
|
|
);
|
|
case "bigint":
|
|
return BigIntTableField(
|
|
fieldName: fieldName,
|
|
fieldType: fieldType,
|
|
isUnique: isUnique,
|
|
isPrimary: isPrimary,
|
|
);
|
|
case "bool":
|
|
return BoolTableField(
|
|
fieldName: fieldName,
|
|
fieldType: fieldType,
|
|
isUnique: isUnique,
|
|
isPrimary: isPrimary,
|
|
);
|
|
case "date":
|
|
return DateTableField(
|
|
fieldName: fieldName,
|
|
fieldType: fieldType,
|
|
isUnique: isUnique,
|
|
isPrimary: isPrimary,
|
|
);
|
|
case "datetime":
|
|
return DateTimeTableField(
|
|
fieldName: fieldName,
|
|
fieldType: fieldType,
|
|
isUnique: isUnique,
|
|
isPrimary: isPrimary,
|
|
);
|
|
case "float":
|
|
return FloatTableField(
|
|
fieldName: fieldName,
|
|
fieldType: fieldType,
|
|
isUnique: isUnique,
|
|
isPrimary: isPrimary,
|
|
);
|
|
case "int":
|
|
return IntTableField(
|
|
fieldName: fieldName,
|
|
fieldType: fieldType,
|
|
isUnique: isUnique,
|
|
isPrimary: isPrimary,
|
|
);
|
|
default:
|
|
throw Exception("Unknown field type: $fieldType");
|
|
}
|
|
}
|
|
}
|