abstract class TableColumnDefinition { final String columnName; final bool isUnique; TableColumnDefinition({ required this.columnName, required this.isUnique, }); String get def => throw UnimplementedError("def getter not implemented"); } class SerialPrimaryColumnDefinition extends TableColumnDefinition { SerialPrimaryColumnDefinition({ required super.columnName, }) : super(isUnique: true); @override String get def => "$columnName:serial:primary"; } class TextColumnDefinition extends TableColumnDefinition { TextColumnDefinition({ required super.columnName, required super.isUnique, }); @override String get def => "$columnName:str${isUnique ? ":unique" : ""}"; } class BooleanColumnDefinition extends TableColumnDefinition { BooleanColumnDefinition({ required super.columnName, required super.isUnique, }); @override String get def => "$columnName:bool${isUnique ? ":unique" : ""}"; } class TimestampColumnDefinition extends TableColumnDefinition { TimestampColumnDefinition({ required super.columnName, required super.isUnique, }); @override String get def => "$columnName:datetime${isUnique ? ":unique" : ""}"; } class DoubleColumnDefinition extends TableColumnDefinition { DoubleColumnDefinition({ required super.columnName, required super.isUnique, }); @override String get def => "$columnName:float${isUnique ? ":unique" : ""}"; } class IntegerColumnDefinition extends TableColumnDefinition { IntegerColumnDefinition({ required super.columnName, required super.isUnique, }); @override String get def => "$columnName:int${isUnique ? ":unique" : ""}"; } class UserRefColumnDefinition extends TableColumnDefinition { UserRefColumnDefinition({ required super.columnName, }) : super(isUnique: false); @override String get def => "$columnName:int-user"; } class AssetRefColumnDefinition extends TableColumnDefinition { AssetRefColumnDefinition({ required super.columnName, }) : super(isUnique: false); @override String get def => "$columnName:int-asset"; }