generateFields method

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

Generate the fields for the model nested from keys.

Implementation

void generateFields(
  final StringBuffer buffer,
  final Map<String, Object?> assetsMap,
  final String name, {
  final Iterable<String> keys = const Iterable<String>.empty(),
}) {
  final Map<String, List<String>> uniqueKeys = <String, List<String>>{};
  final Map<String, Object?> map = keys.skip(1).isEmpty && name == baseName
      ? assetsMap
      : assetsMap.getNested(<String>[...keys.skip(1), name])!
          as Map<String, Object?>;
  for (final MapEntry<String, Object?> entry in map.entries) {
    if (entry.key.isNotEmpty && entry.value is String) {
      String key = basenameWithoutExtension(entry.key);
      key = convert ? key.toCamelCase() : key.normalize();
      final String $extension = extension(entry.key);
      while ((uniqueKeys[key] ?? const <String>[]).contains($extension)) {
        key = '\$$key';
      }
      uniqueKeys[key] = <String>[...?uniqueKeys[key], $extension];
    }
  }
  final Map<String, int> uniqueKeysLength = <String, int>{
    for (final MapEntry<String, List<String>> entry in uniqueKeys.entries)
      entry.key: entry.value.length
  };

  for (final MapEntry<String, Object?> entry in map.entries) {
    final Object? value = entry.value;
    if (entry.key.isEmpty) {
    } else if (value is Map<String, Object?>) {
      final String key =
          convert ? entry.key.toCamelCase() : entry.key.normalize();
      final String cls = className(entry.key, <String>[...keys, name]);
      final Map<String, Object?> nestedMap =
          map[entry.key]! as Map<String, Object?>;
      final String nestedMapPath = nestedMap['']! as String;
      final Iterable<String> dirParts =
          posix.split(posix.dirname(nestedMapPath));
      buffer
        ..writeDoc(
          'The path to the `${posix.basename(nestedMapPath)}` folder '
          'in `${dirParts.join('`/`')}`.',
        )
        ..writeln('$cls get $key => $cls._(this);');
    } else if (value is String) {
      String key = basenameWithoutExtension(entry.key);
      key = convert ? key.toCamelCase() : key.normalize();
      final String $extension = extension(entry.key);
      while (!uniqueKeys[key]!.contains($extension)) {
        key = '\$$key';
      }
      uniqueKeys[key]!.remove($extension);
      if (uniqueKeysLength[key]! > 1) {
        key = basename(entry.key);
        key =
            convert ? key.toCamelCase() : key.replaceAll('.', '').normalize();
      }
      final Iterable<String> dirParts = posix.split(posix.dirname(value));
      buffer
        ..writeDoc(
          'The path to the `${posix.basename(value)}` in '
          '`${dirParts.join('`/`')}`.',
        )
        ..writeFunction(
          'String get $key',
          bodyConstructor: value.contains(r'$') ? "r'" : "'",
          bodyFields: posix.split(value),
          separator: posix.separator,
        );
    }
  }
}