static opentelemetry::proto::common::v1::AnyValue convertAnyValue()

in prod/native/libphpbridge/code/OtlpExporter/AttributesConverter.h [32:86]


    static opentelemetry::proto::common::v1::AnyValue convertAnyValue(AutoZval const &val) {
        using opentelemetry::proto::common::v1::AnyValue;
        using opentelemetry::proto::common::v1::ArrayValue;
        using opentelemetry::proto::common::v1::KeyValue;
        using opentelemetry::proto::common::v1::KeyValueList;

        AnyValue result;

        if (val.isArray()) {
            if (isSimpleArray(val)) {
                ArrayValue *arr = new ArrayValue();
                for (auto const &item : val) {
                    *arr->add_values() = convertAnyValue(item);
                }
                result.set_allocated_array_value(arr);
            } else {
                KeyValueList *kvlist = new KeyValueList();
                for (auto it = val.kvbegin(); it != val.kvend(); ++it) {
                    auto [key, v] = *it;
                    if (!std::holds_alternative<std::string_view>(key)) {
                        continue;
                    }
                    KeyValue *kv = kvlist->add_values();
                    kv->set_key(std::get<std::string_view>(key));
                    *kv->mutable_value() = convertAnyValue(v);
                }
                result.set_allocated_kvlist_value(kvlist);
            }
            return result;
        }

        switch (val.getType()) {
            case IS_LONG:
                result.set_int_value(val.getLong());
                break;
            case IS_DOUBLE:
                result.set_double_value(val.getDouble());
                break;
            case IS_TRUE:
            case IS_FALSE:
                result.set_bool_value(val.getBoolean());
                break;
            case IS_STRING:
                if (val.isStringValidUtf8() || elasticapm::utils::isUtf8(val.getStringView())) {
                    result.set_string_value(val.getStringView());
                } else {
                    result.set_bytes_value(val.getStringView());
                }
                break;
            default:
                break;
        }

        return result;
    }