genKeysFromCSV function

Future<Map<String, Map<String, String>>> genKeysFromCSV(
  1. File csvFile
)

Implementation

Future<Map<String, Map<String, String>>> genKeysFromCSV(File csvFile) async {
  final csvInput = csvFile.openRead();
  final csv = await csvInput
      .transform(utf8.decoder)
      .transform(const CsvToListConverter(
        shouldParseNumbers: false,
        csvSettingsDetector: FirstOccurrenceSettingsDetector(
          eols: ['\r\n', '\n'],
        ),
      ))
      .toList();

  final headers = csv[0]
      .cast<String>()
      .map(_uniformizeKey)
      .takeWhile((x) => x.isNotEmpty)
      .toList();
  final data =
      csv.sublist(1).cast<List>().takeWhile((x) => x.isNotEmpty).toList();

  if (headers[0] != 'key') {
    throw ParseError(
      'Generator cannot parse',
    );
  }
  final locales = headers.sublist(1);

  final Map<String, Map<String, String>> keys = {};

  for (final r in data) {
    final row = r.cast<String>().map(_uniformizeKey).toList();
    final key = row[0];
    if (row.length < headers.length) {
      throw ParseError(
        'Generator cannot parse row `$key`.',
      );
    }
    for (var i = 0; i < locales.length; i++) {
      final locale = locales[i];
      final value = row[i + 1];
      if (keys[locale] == null) {
        keys[locale] = {
          key: value,
        };
      } else {
        if (keys[locale]![key] != null) {
          throw DuplicateError('Generator found duplicate key `$key`.', key);
        }
        keys[locale]![key] = value;
      }
    }
  }
  return keys;
}