static int jsonSerializer_writeAny()

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;
}