passes method

  1. @override
FutureOr<bool> passes(
  1. ValidationContext context
)
override

Validates the value using the given context.

Returns true if valid, otherwise false.

Implementation

@override
FutureOr<bool> passes(ValidationContext context) async {
  final value = context.value;
  final args = context.parameters;
  final field = context.attribute;

  if (value == null || value.toString().trim().isEmpty) {
    return true;
  }

  var tableName = _table;
  var columnName = _column;
  final extraClauses = <Map<String, dynamic>>[];

  if (args.isNotEmpty) {
    tableName = args[0];
    if (args.length > 1 && args[1].toUpperCase() != 'NULL') {
      columnName = args[1];
    }

    // Extra where clauses: key,value pairs starting from index 2
    for (int i = 2; i < args.length; i += 2) {
      if (i + 1 < args.length) {
        extraClauses.add({
          'column': args[i],
          'value': args[i + 1],
        });
      }
    }
  }

  if (tableName == null) {
    throw Exception("ExistsRule requires a table name.");
  }

  final db = DB.table(tableName);
  final dbColumn = columnName ?? field;

  db.where(dbColumn, '=', value);

  // Apply extra clauses
  for (final clause in extraClauses) {
    final col = clause['column'];
    final val = clause['value'];
    if (val == 'NULL') {
      db.whereNull(col);
    } else if (val == 'NOT_NULL') {
      db.whereNotNull(col);
    } else {
      db.where(col, '=', val);
    }
  }

  // If record exists -> pass.
  return await db.exists();
}