generateModel method

void generateModel(
  1. StringBuffer buffer,
  2. Map<String, Object?> assetsMap,
  3. String name, {
  4. Iterable<String> keys = const Iterable<String>.empty(),
})

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],
      );
    }
  }
}