generateModel method
void
generateModel(})
Generate a
model nested from keys.
Implementation
void generateModel(
final StringBuffer buffer,
final Map<String, Object?> assetsMap,
final String name, {
final Iterable<String> keys = const Iterable<String>.empty(),
}) {
final String cls = className(name, keys);
if (keys.isEmpty) {
String className = cls.decapitalize();
className = className == cls ? '\$$className' : className;
final Iterable<String> dirParts = posix.split(assetsMap['']! as String);
buffer
..writeDoc(
'This is a generated file structure of the '
'`${dirParts.join('`/`')}` folder.',
)
..writeDoc('')
..writeDoc(
'See: https://pub.dev/packages/generators_lite#icon-fonts-generator',
)
..writeln('const $cls $className = $cls._();')
..writeln();
}
final Map<String, Object?> map = keys.skip(1).isEmpty && name == baseName
? assetsMap
: assetsMap.getNested(<String>[...keys.skip(1), name])!
as Map<String, Object?>;
final String parentName = keys.isNotEmpty
? className(keys.last, keys.toList()..removeLast())
: '';
final Iterable<String> dirParts = posix.split(map['']! as String);
buffer
..writeDoc(
'The file structure of the `${dirParts.join('`/`')}` folder.',
)
..writeln('@sealed')
..writeln('@immutable')
..writeln('class $cls {')
/// `Constructor`
..writeFunction(
'const ${className(name, keys)}._',
fields: <String>[if (parentName.isNotEmpty) 'final $parentName _'],
);
/// `Fields`
generateFields(buffer, assetsMap, name, keys: keys);
buffer
/// `== operator`
..writeln()
..writeln('@override')
..writeFunction(
'bool operator ==',
fields: <String>['final Object? other'],
bodyFields: <String>[
'identical(this, other) || other is ${className(name, keys)}',
...<String>[
for (final MapEntry<String, Object?> entry in map.entries)
if (entry.key.isNotEmpty) basenameWithoutExtension(entry.key),
]
.map((final _) => convert ? _.toCamelCase() : _.normalize())
.map((final String key) => 'other.$key == $key')
],
separator: ' && ',
)
/// `hashCode`
..writeln()
..writeln('@override')
..writeFunction(
'int get hashCode',
bodyFields: <String>[
for (final MapEntry<String, Object?> entry in map.entries)
if (entry.key.isNotEmpty) basenameWithoutExtension(entry.key)
]
.map((final _) => convert ? _.toCamelCase() : _.normalize())
.map((final String key) => '$key.hashCode'),
separator: ' ^ ',
)
..writeln('}');
for (final MapEntry<String, Object?> entry in map.entries) {
if (entry.key.isNotEmpty && entry.value is Map<String, Object?>) {
generateModel(
buffer,
assetsMap,
entry.key,
keys: <String>[...keys, name],
);
}
}
}