src/YAMLCommand.h
branchv_0
changeset 6 67dc7aaa5ed7
parent 5 399380ea9750
child 7 1b6deb1c8720
equal deleted inserted replaced
5:399380ea9750 6:67dc7aaa5ed7
   137 
   137 
   138 	void consumeEvent(const yaml_event_type_t expectedEventType, string_t expectedScalarValue = L"") {
   138 	void consumeEvent(const yaml_event_type_t expectedEventType, string_t expectedScalarValue = L"") {
   139 		YAMLEvent_p event = YAMLEvent_p(parser.next());
   139 		YAMLEvent_p event = YAMLEvent_p(parser.next());
   140 		if (!event) throw RelpipeWriterException(L"Invalid YAML structure: missing event: " + YAMLEvent::findTypeName(expectedEventType));
   140 		if (!event) throw RelpipeWriterException(L"Invalid YAML structure: missing event: " + YAMLEvent::findTypeName(expectedEventType));
   141 		if (event->getType() != expectedEventType) throw RelpipeWriterException(L"Invalid YAML structure: expected event: " + YAMLEvent::findTypeName(expectedEventType) + L", but got: " + event->getTypeName());
   141 		if (event->getType() != expectedEventType) throw RelpipeWriterException(L"Invalid YAML structure: expected event: " + YAMLEvent::findTypeName(expectedEventType) + L", but got: " + event->getTypeName());
   142 		if (expectedEventType == YAML_SCALAR_EVENT && expectedScalarValue.size() && expectedScalarValue != fetchScalarValue(event)) throw RelpipeWriterException(L"Invalid YAML structure: expected scalar value: " + expectedScalarValue + L", but got " + fetchScalarValue(event));
   142 		if (expectedEventType == YAML_SCALAR_EVENT && expectedScalarValue.size() && expectedScalarValue != fetchScalarValue(event)) throw RelpipeWriterException(L"Invalid YAML structure: expected scalar value: „" + expectedScalarValue + L"“, but got „" + fetchScalarValue(event) + L"“");
   143 	}
   143 	}
   144 
   144 
   145 	string_t consumeScalarEvent() {
   145 	string_t consumeScalarEvent() {
   146 		YAMLEvent_p event = YAMLEvent_p(parser.next());
   146 		YAMLEvent_p event = YAMLEvent_p(parser.next());
   147 		if (event && event->getType() == YAML_SCALAR_EVENT) return fetchScalarValue(event);
   147 		if (event && event->getType() == YAML_SCALAR_EVENT) return fetchScalarValue(event);
   171 			for (YAMLEvent_p event; until(YAML_MAPPING_END_EVENT, event);) {
   171 			for (YAMLEvent_p event; until(YAML_MAPPING_END_EVENT, event);) {
   172 				auto key = fetchScalarValue(event);
   172 				auto key = fetchScalarValue(event);
   173 				auto value = consumeScalarEvent();
   173 				auto value = consumeScalarEvent();
   174 				if (key == L"name") name = value;
   174 				if (key == L"name") name = value;
   175 				else if (key == L"type") type = value;
   175 				else if (key == L"type") type = value;
   176 				else; // unsupported metadata, later there might be something useful
   176 				else throw RelpipeWriterException(L"Invalid YAML structure: expected „name“ or „type“ but got: " + key);
   177 			}
   177 			}
   178 			attributesMetadata.push_back({name, writer->toTypeId(type)});
   178 			attributesMetadata.push_back({name, writer->toTypeId(type)});
   179 		}
   179 		}
   180 
   180 
   181 		writer->startRelation(relationName, attributesMetadata, true);
   181 		writer->startRelation(relationName, attributesMetadata, true);
   186 			processRecords();
   186 			processRecords();
   187 			consumeEvent(YAML_MAPPING_END_EVENT);
   187 			consumeEvent(YAML_MAPPING_END_EVENT);
   188 		} else if (event->getType() == YAML_MAPPING_END_EVENT) {
   188 		} else if (event->getType() == YAML_MAPPING_END_EVENT) {
   189 			// empty relation, no records
   189 			// empty relation, no records
   190 		} else {
   190 		} else {
   191 			RelpipeWriterException(L"Invalid YAML structure: expected 'record' or MAPPING_END, but got: " + event->getTypeName());
   191 			RelpipeWriterException(L"Invalid YAML structure: expected „record“ or MAPPING_END, but got: " + event->getTypeName());
   192 		}
   192 		}
   193 	}
   193 	}
   194 
   194 
   195 	void processRelationWithoutMetadata() {
   195 	void processRelationWithoutMetadata() {
   196 		// First record:
   196 		// First record: