eloquentModelCaster function

  1. @visibleForTesting
String? eloquentModelCaster(
  1. Object? value
)

Pretty-printer for Model instances.

Returns a multi-line block:

User#42 {
  id: 42
  email: "jane@test.com"
  name: "Jane"
}

Returns null for non-Model values so the next caster in Tinker.casters gets a turn.

Implementation

@visibleForTesting
String? eloquentModelCaster(Object? value) {
  if (value is! Model) return null;

  // 1. Class name + primary key header.
  final String className = value.runtimeType.toString();
  final dynamic key = value.id;
  final String header = key == null ? className : '$className#$key';

  // 2. Pick fields — prefer fillable; fall back to live attributes map
  //    when fillable is empty (subclasses with `guarded = []`).
  final List<String> fields = value.fillable.isNotEmpty
      ? value.fillable
      : value.attributes.keys.toList(growable: false);

  if (fields.isEmpty) {
    return '$header {}';
  }

  // 3. Render each row, quoting strings, leaving other types unquoted.
  final StringBuffer buffer = StringBuffer()..writeln('$header {');
  for (final String field in fields) {
    final dynamic raw = value.getAttribute(field);
    buffer.writeln('  $field: ${_formatScalar(raw)}');
  }
  buffer.write('}');
  return buffer.toString();
}