--- a/src/YAMLCommand.h Sat Dec 05 19:17:21 2020 +0100
+++ b/src/YAMLCommand.h Sat Dec 05 19:32:05 2020 +0100
@@ -115,7 +115,7 @@
};
using YAMLEvent_p = std::shared_ptr<YAMLEvent>;
-
+
YAMLParser parser;
std::shared_ptr<relpipe::writer::RelationalWriter> writer;
@@ -145,6 +145,11 @@
else throw relpipe::writer::RelpipeWriterException(L"Invalid YAML structure: expected SCALAR, but got: " + event->getTypeName());
}
+ bool until(const yaml_event_type_t until, YAMLEvent_p& event) {
+ event = YAMLEvent_p(parser.next());
+ return event && event->getType() != until;
+ }
+
void processRelation() {
YAMLEvent_p event = YAMLEvent_p(parser.next());
if (event->getType() == YAML_MAPPING_START_EVENT) processRelationWithMetadata();
@@ -156,11 +161,11 @@
consumeEvent(YAML_SCALAR_EVENT, L"attribute-metadata");
consumeEvent(YAML_SEQUENCE_START_EVENT);
- for (YAMLEvent_p event = YAMLEvent_p(parser.next()); event && event->getType() != YAML_SEQUENCE_END_EVENT; event = YAMLEvent_p(parser.next())) {
+ for (YAMLEvent_p event; until(YAML_SEQUENCE_END_EVENT, event);) {
if (event->getType() != YAML_MAPPING_START_EVENT) throw relpipe::writer::RelpipeWriterException(L"Invalid YAML structure: expected MAPPING (attribute-metadata), but got: " + event->getTypeName());
relpipe::writer::string_t name;
relpipe::writer::string_t type = L"string";
- for (YAMLEvent_p event = YAMLEvent_p(parser.next()); event && event->getType() != YAML_MAPPING_END_EVENT; event = YAMLEvent_p(parser.next())) {
+ for (YAMLEvent_p event; until(YAML_MAPPING_END_EVENT, event);) {
auto key = fetchScalarValue(event);
auto value = consumeScalarEvent();
if (key == L"name") name = value;
@@ -188,7 +193,7 @@
// First record:
consumeEvent(YAML_MAPPING_START_EVENT);
record.clear();
- for (YAMLEvent_p event = YAMLEvent_p(parser.next()); event && event->getType() != YAML_MAPPING_END_EVENT; event = YAMLEvent_p(parser.next())) {
+ for (YAMLEvent_p event; until(YAML_MAPPING_END_EVENT, event);) {
auto name = fetchScalarValue(event);
auto value = consumeScalarEvent();
attributesMetadata.push_back({name, relpipe::writer::TypeId::STRING});
@@ -202,11 +207,11 @@
}
void processRecords() {
- for (YAMLEvent_p event = YAMLEvent_p(parser.next()); event && event->getType() != YAML_SEQUENCE_END_EVENT; event = YAMLEvent_p(parser.next())) {
+ for (YAMLEvent_p event; until(YAML_SEQUENCE_END_EVENT, event);) {
if (event->getType() != YAML_MAPPING_START_EVENT) throw relpipe::writer::RelpipeWriterException(L"Invalid YAML structure: expected MAPPING (record), but got: " + event->getTypeName());
record.clear();
record.resize(attributesMetadata.size());
- for (YAMLEvent_p event = YAMLEvent_p(parser.next()); event && event->getType() != YAML_MAPPING_END_EVENT; event = YAMLEvent_p(parser.next())) {
+ for (YAMLEvent_p event; until(YAML_MAPPING_END_EVENT, event);) {
auto name = fetchScalarValue(event);
auto value = consumeScalarEvent();
for (int i = 0; i < attributesMetadata.size(); i++) {
@@ -237,7 +242,7 @@
consumeEvent(YAML_DOCUMENT_START_EVENT);
consumeEvent(YAML_MAPPING_START_EVENT);
- for (YAMLEvent_p event = YAMLEvent_p(parser.next()); event && event->getType() != YAML_MAPPING_END_EVENT; event = YAMLEvent_p(parser.next())) {
+ for (YAMLEvent_p event; until(YAML_MAPPING_END_EVENT, event);) {
relationName = fetchScalarValue(event);
attributesMetadata.clear();
processRelation();