eloquentModelCaster function
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();
}