bool msgpack_rpc_to_stringarray(msgpack_object *obj, StringArray *arg) { if (obj->type != MSGPACK_OBJECT_ARRAY) { return false; } arg->size = obj->via.array.size; arg->items = xcalloc(obj->via.array.size, sizeof(String)); for (uint32_t i = 0; i < obj->via.array.size; i++) { if (!msgpack_rpc_to_string(obj->via.array.ptr + i, &arg->items[i])) { return false; } } return true; }
bool msgpack_rpc_to_object(msgpack_object *obj, Object *arg) { switch (obj->type) { case MSGPACK_OBJECT_NIL: arg->type = kObjectTypeNil; return true; case MSGPACK_OBJECT_BOOLEAN: arg->type = kObjectTypeBoolean; return msgpack_rpc_to_boolean(obj, &arg->data.boolean); case MSGPACK_OBJECT_POSITIVE_INTEGER: case MSGPACK_OBJECT_NEGATIVE_INTEGER: arg->type = kObjectTypeInteger; return msgpack_rpc_to_integer(obj, &arg->data.integer); case MSGPACK_OBJECT_DOUBLE: arg->type = kObjectTypeFloat; return msgpack_rpc_to_float(obj, &arg->data.floating); case MSGPACK_OBJECT_RAW: arg->type = kObjectTypeString; return msgpack_rpc_to_string(obj, &arg->data.string); case MSGPACK_OBJECT_ARRAY: arg->type = kObjectTypeArray; return msgpack_rpc_to_array(obj, &arg->data.array); case MSGPACK_OBJECT_MAP: arg->type = kObjectTypeDictionary; return msgpack_rpc_to_dictionary(obj, &arg->data.dictionary); default: return false; } }
bool msgpack_rpc_to_dictionary(msgpack_object *obj, Dictionary *arg) { if (obj->type != MSGPACK_OBJECT_MAP) { return false; } arg->size = obj->via.array.size; arg->items = xcalloc(obj->via.map.size, sizeof(KeyValuePair)); for (uint32_t i = 0; i < obj->via.map.size; i++) { if (!msgpack_rpc_to_string(&obj->via.map.ptr[i].key, &arg->items[i].key)) { return false; } if (!msgpack_rpc_to_object(&obj->via.map.ptr[i].val, &arg->items[i].value)) { return false; } } return true; }