genKeysFromCSV function
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;
}