toXml method

String toXml({
  1. KeyValueBuilderDef? keyBuilder,
  2. KeyValueBuilderDef? listItemBuilder,
  3. int indent = 0,
  4. bool includeMetaData = true,
  5. String metaDataKey = TSDefaults.metaDataKey,
})

Implementation

String toXml({
  KeyValueBuilderDef? keyBuilder,
  KeyValueBuilderDef? listItemBuilder,
  int indent = 0,
  bool includeMetaData = true,
  String metaDataKey = TSDefaults.metaDataKey,
}) {
  if (!includeMetaData) {
    remove(metaDataKey);
  }
  keyBuilder ??= (key, value) => key.toPascalCase();
  final buffer = StringBuffer();
  final prefix = '  ' * indent;
  for (final entry in entries) {
    final rawKey = entry.key.toString();
    final key = keyBuilder(rawKey, entry.value);
    final value = entry.value;
    if (value is Map) {
      buffer.writeln('$prefix<$key>');
      buffer.write(
        value.toXml(
          keyBuilder: keyBuilder,
          listItemBuilder: listItemBuilder,
          indent: indent + 1,
          includeMetaData: includeMetaData,
          metaDataKey: metaDataKey,
        ),
      );
      buffer.writeln('$prefix</$key>');
    } else if (value is List) {
      buffer.writeln('$prefix<$key>');
      for (final item in value) {
        if (item is Map) {
          buffer.write(
            item.toXml(
              keyBuilder: keyBuilder,
              listItemBuilder: listItemBuilder,
              indent: indent + 2,
              includeMetaData: includeMetaData,
              metaDataKey: metaDataKey,
            ),
          );
        } else {
          buffer.writeln(
            '$prefix  ${listItemBuilder?.call(rawKey, item) ?? '- $item'}',
          );
        }
      }
      buffer.writeln('$prefix</$key>');
    } else if (value == null) {
      buffer.writeln('$prefix<$key/>');
    } else {
      buffer.writeln('$prefix<$key>$value</$key>');
    }
  }
  return buffer.toString();
}