findIdFieldName method

String? findIdFieldName([
  1. O? o
])

Implementation

String? findIdFieldName([O? o]) {
  var reflection = reflectionWithObject(o);

  var possibleFields = reflection.fieldsWhere((f) {
    return f.type.isPrimitiveType;
  }).toList(growable: false);

  if (possibleFields.isEmpty) {
    throw StateError(
        "Class without candidate for ID field: ${fieldsNames()}");
  }

  if (possibleFields.length == 1) {
    return possibleFields.first.name;
  }

  possibleFields.sort((a, b) {
    var n1 = a.nullable;
    var n2 = b.nullable;
    return n1 == n2 ? 0 : (n1 ? -1 : 1);
  });

  var idField = possibleFields.firstWhereOrNull((f) {
    var name = f.name.toLowerCase();
    return name == 'id' || name == 'key' || name == 'primary';
  });

  if (idField != null) {
    return idField.name;
  }

  idField = possibleFields.firstWhereOrNull((f) => f.type.isNumericType);
  idField ??=
      possibleFields.firstWhereOrNull((f) => f.type.type.isDynamicNumberType);

  if (idField != null) {
    return idField.name;
  }

  idField = possibleFields.firstWhereOrNull((f) => f.nullable);

  if (idField != null) {
    return idField.name;
  }

  return null;
}