in lang/c++/impl/Compiler.cc [189:278]
static GenericDatum makeGenericDatum(NodePtr n,
const Entity &e, const SymbolTable &st) {
Type t = n->type();
EntityType dt = e.type();
if (t == AVRO_SYMBOLIC) {
n = st.find(n->name())->second;
t = n->type();
}
switch (t) {
case AVRO_STRING:
assertType(e, json::EntityType::String);
return GenericDatum(e.stringValue());
case AVRO_BYTES:
assertType(e, json::EntityType::String);
return GenericDatum(toBin(e.bytesValue()));
case AVRO_INT:
assertType(e, json::EntityType::Long);
return GenericDatum(static_cast<int32_t>(e.longValue()));
case AVRO_LONG:
assertType(e, json::EntityType::Long);
return GenericDatum(e.longValue());
case AVRO_FLOAT:
if (dt == json::EntityType::Long) {
return GenericDatum(static_cast<float>(e.longValue()));
}
assertType(e, json::EntityType::Double);
return GenericDatum(static_cast<float>(e.doubleValue()));
case AVRO_DOUBLE:
if (dt == json::EntityType::Long) {
return GenericDatum(static_cast<double>(e.longValue()));
}
assertType(e, json::EntityType::Double);
return GenericDatum(e.doubleValue());
case AVRO_BOOL:
assertType(e, json::EntityType::Bool);
return GenericDatum(e.boolValue());
case AVRO_NULL:
assertType(e, json::EntityType::Null);
return GenericDatum();
case AVRO_RECORD: {
assertType(e, json::EntityType::Obj);
GenericRecord result(n);
const map<string, Entity> &v = e.objectValue();
for (size_t i = 0; i < n->leaves(); ++i) {
auto it = v.find(n->nameAt(i));
if (it == v.end()) {
throw Exception(
"No value found in default for {}",
n->nameAt(i));
}
result.setFieldAt(i,
makeGenericDatum(n->leafAt(i), it->second, st));
}
return GenericDatum(n, result);
}
case AVRO_ENUM:
assertType(e, json::EntityType::String);
return GenericDatum(n, GenericEnum(n, e.stringValue()));
case AVRO_ARRAY: {
assertType(e, json::EntityType::Arr);
GenericArray result(n);
const vector<Entity> &elements = e.arrayValue();
for (const auto &element : elements) {
result.value().push_back(makeGenericDatum(n->leafAt(0), element, st));
}
return GenericDatum(n, result);
}
case AVRO_MAP: {
assertType(e, json::EntityType::Obj);
GenericMap result(n);
const map<string, Entity> &v = e.objectValue();
for (const auto &it : v) {
result.value().push_back(make_pair(it.first,
makeGenericDatum(n->leafAt(1), it.second, st)));
}
return GenericDatum(n, result);
}
case AVRO_UNION: {
GenericUnion result(n);
result.selectBranch(0);
result.datum() = makeGenericDatum(n->leafAt(0), e, st);
return GenericDatum(n, result);
}
case AVRO_FIXED:
assertType(e, json::EntityType::String);
return GenericDatum(n, GenericFixed(n, toBin(e.bytesValue())));
default: throw Exception("Unknown type: {}", t);
}
}