import 'package:uuid/uuid.dart'; typedef SerialTableField = TableField; typedef UUIDTableField = TableField; typedef StringTableField = TableField; typedef BigIntTableField = TableField; typedef BoolTableField = TableField; typedef DateTableField = TableField; typedef DateTimeTableField = TableField; typedef FloatTableField = TableField; typedef IntTableField = TableField; final possibleFieldTypes = { "serial": SerialTableField, "uuid": UUIDTableField, "str": StringTableField, "bigint": BigIntTableField, "bool": BoolTableField, "date": DateTableField, "datetime": DateTimeTableField, "float": FloatTableField, "int": IntTableField, }; class TableField { 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"); } } }