private <D> Object convert(Schema schema, LogicalType logicalType,
Conversion<D> conversion, Object datum) {
if (conversion == null) {
return datum;
}
Class<D> fromClass = conversion.getConvertedType();
switch (schema.getType()) {
case RECORD: return conversion.toRecord(fromClass.cast(datum), schema, logicalType);
case ENUM: return conversion.toEnumSymbol(fromClass.cast(datum), schema, logicalType);
case ARRAY: return conversion.toArray(fromClass.cast(datum), schema, logicalType);
case MAP: return conversion.toMap(fromClass.cast(datum), schema, logicalType);
case FIXED: return conversion.toFixed(fromClass.cast(datum), schema, logicalType);
case STRING: return conversion.toCharSequence(fromClass.cast(datum), schema, logicalType);
case BYTES: return conversion.toBytes(fromClass.cast(datum), schema, logicalType);
case INT: return conversion.toInt(fromClass.cast(datum), schema, logicalType);
case LONG: return conversion.toLong(fromClass.cast(datum), schema, logicalType);
case FLOAT: return conversion.toFloat(fromClass.cast(datum), schema, logicalType);
case DOUBLE: return conversion.toDouble(fromClass.cast(datum), schema, logicalType);
case BOOLEAN: return conversion.toBoolean(fromClass.cast(datum), schema, logicalType);
}
return datum;
}