MdYamlCodec: Load maps properly

Our MdYamlCodec runs inside an isolate, and send the result back. The
YamlMap data structure doesn't seem to be serializable over an isolate
and gives us an error. Therefore, we should make sure it is a normal
map.
This commit is contained in:
Vishesh Handa
2020-09-03 14:03:49 +02:00
parent d3d04e6df9
commit ddf7345b0d
2 changed files with 34 additions and 3 deletions

View File

@ -91,9 +91,7 @@ class MarkdownYAMLCodec {
if (yamlMap is! Map) {
return map;
}
yamlMap.forEach((key, value) {
map[key] = value;
});
map = _convertMap(yamlMap);
} catch (err) {
Log.d('MarkdownYAMLSerializer::decode("$yamlText") -> ${err.toString()}');
}
@ -125,3 +123,16 @@ class MarkdownYAMLCodec {
return "---\n" + yaml + "---\n";
}
}
LinkedHashMap<String, dynamic> _convertMap(YamlMap yamlMap) {
LinkedHashMap<String, dynamic> map = LinkedHashMap<String, dynamic>();
yamlMap.forEach((key, value) {
if (value is YamlMap) {
value = _convertMap(value);
}
map[key] = value;
});
return map;
}

View File

@ -1,6 +1,7 @@
import 'dart:collection';
import 'package:test/test.dart';
import 'package:yaml/yaml.dart';
import 'package:gitjournal/core/md_yaml_doc.dart';
import 'package:gitjournal/core/md_yaml_doc_codec.dart';
@ -208,5 +209,24 @@ foo: bar
// FIXME: Add another test for yaml header at the bottom without a newline
// FIXME: Add another test for yaml header at the bottom with lots of new lines after
// FIXME: Add another test for yaml header at the bottom with lots of new lines with spaces after
test('Should not have any YamlMaps', () {
// YamlMaps cannot be sent over an isolate
var str = """---
thumbnail: {
name: "adrian_sommeling.jpg",
alt: "Padre e hijo se cubren con un paraguas de una tormenta que hace volar al niño",
style: top
}
tags: ["opinión", "autores"]
---
""";
var serializer = MarkdownYAMLCodec();
var doc = serializer.decode(str);
expect(doc.props['thumbnail'].runtimeType, isNot(YamlMap));
});
});
}