Literal<T> constructor

Literal<T>(
  1. T value
)

Implementation

factory Literal(T value) {
  // TODO: Consider asking Lasse how to actually switch over T, because null is not a type!
  // TODO: We need to switch over T or use an extension method! If someone does
  //       select(toExpr(null as bool?)).union(select(toExpr(true)))
  //       We'll have a expression that can't actually decode bools!
  switch (value) {
    case true:
      return true$ as Literal<T>;

    case false:
      return false$ as Literal<T>;

    case null:
      return null$ as Literal<T>;

    case String _:
      return Literal._(value, ColumnType.text as _ExprType<T>);
    case int _:
      return Literal._(value, ColumnType.integer as _ExprType<T>);
    case double _:
      return Literal._(value, ColumnType.real as _ExprType<T>);
    case Uint8List _:
      return Literal._(value, ColumnType.blob as _ExprType<T>);
    case DateTime _:
      return Literal._(value, ColumnType.dateTime as _ExprType<T>);

    case CustomDataType _:
      throw ArgumentError.value(
        value,
        'value',
        'Use Literal.custom for CustomDataType!',
      );

    default:
      throw ArgumentError.value(
        value,
        'value',
        'Only String, int, double, bool, null, and DateTime '
            'literals are allowed',
      );
  }
}