in libs/dfi/src/json_serializer.c [327:415]
static int jsonSerializer_writeAny(const dyn_type* type, const void* input, json_t** out) {
int status = OK;
int descriptor = dynType_descriptorType(type);
json_auto_t* val = NULL;
const dyn_type* subType = NULL;
switch (descriptor) {
case 'Z' :
val = json_boolean(*(const bool*)input);
break;
case 'B' :
val = json_integer((json_int_t)*(const char*)input);
break;
case 'S' :
val = json_integer((json_int_t)*(const int16_t*)input);
break;
case 'I' :
val = json_integer((json_int_t)*(const int32_t*)input);
break;
case 'J' :
val = json_integer((json_int_t)*(const int64_t*)input);
break;
case 'b' :
val = json_integer((json_int_t)*(const uint8_t*)input);
break;
case 's' :
val = json_integer((json_int_t)*(const uint16_t*)input);
break;
case 'i' :
val = json_integer((json_int_t)*(const uint32_t *)input);
break;
case 'j' :
val = json_integer((json_int_t)*(const uint64_t*)input);
break;
case 'N' :
val = json_integer((json_int_t)*(const int*)input);
break;
case 'F' :
val = json_real((double) *(const float*)input);
break;
case 'D' :
val = json_real(*(const double*)input);
break;
case 't' : {
const char *strValue = *(const char **) input;
val = (strValue != NULL) ? json_string(strValue) : json_null();
break;
}
case 'E':
status = jsonSerializer_writeEnum(type, *(const int32_t*)input, &val);
break;
case 'p' :
status = jsonSerializer_writeProperties(type, input, &val);
break;
case 'a' :
status = jsonSerializer_writeArrayList(type, input, &val);
break;
case '*' :
subType = dynType_typedPointer_getTypedType(type);
if (dynType_ffiType(subType) != &ffi_type_pointer) {
const void* inputValue = *(const void**)input;
if (inputValue) {
status = jsonSerializer_writeAny(subType, inputValue, &val);
} else {
val = json_null();
}
} else {
status = ERROR;
celix_err_pushf("Error cannot serialize pointer to pointer");
}
break;
case '{' :
status = jsonSerializer_writeComplex(type, input, &val);
break;
case '[' :
status = jsonSerializer_writeSequence(type, input, &val);
break;
default :
celix_err_pushf("Unsupported descriptor '%c'", descriptor);
status = ERROR;
break;
}
if (status != OK) {
return status;
}
*out = celix_steal_ptr(val);
return *out != NULL ? OK : ERROR;
}