Bundle.fromTsv constructor

Bundle.fromTsv(
  1. String tsv
)

Implementation

factory Bundle.fromTsv(String tsv) {
  final rows = tsv.split('\n').map((row) => row.trimRight());
  final global = rows.takeWhile((row) => row.isNotEmpty);
  final messages = rows.skipWhile((row) => row.isNotEmpty).skip(1);

  var author = '';
  var context = '';
  var locale = '';
  var lastModified = DateTime.now();

  for (final pair in global) {
    final key = pair.split('\t').first;
    final value = pair.split('\t').elementAtOrElse(1, (index) => '');

    switch (key) {
      case 'author':
        author = value;
        break;
      case 'context':
        context = value;
        break;
      case 'locale':
        locale = value;
        break;
      case 'last_modified':
        lastModified = DateTime.parse(value);
        break;
    }
  }

  final items = <BundleItem>{};
  final columns = messages.first.split('\t');
  final translates = messages.skip(1);
  final nameIndex = columns.indexOf('name');
  final valueIndex = columns.indexOf('value');
  final descriptionIndex = columns.indexOf('description');
  final placeholdersIndex = columns.indexOf('placeholders');
  final typeIndex = columns.indexOf('type');

  for (final translate in translates) {
    final values = translate.split('\t');
    final placeholders = values[placeholdersIndex]
        .replaceAll(RegExp(r'\(|\)|\ '), '')
        .split(',');
    final map = <String, dynamic>{};

    if (placeholders.length > 1) {
      map.addAll({for (var element in placeholders) element: {}});
    }

    items.add(BundleItem(
      name: values[nameIndex],
      value: values[valueIndex],
      description: values[descriptionIndex],
      placeholders: map,
      type: values[typeIndex],
    ));
  }

  return Bundle(
    author: author,
    context: context,
    locale: locale,
    lastModified: lastModified,
    items: items,
  );
}