mirror of https://github.com/qt/qtgrpc.git
Remove the redundant template arguments from QAbstractGrpcClient
Now we may get the property ordering information from QProtobufMessage without the need of knowing the exact type of inherited message. This allows us to remove template arguments from QAbstractGrpcClient::call and QAbstractGrpcClient::startStream methods. Task-number: QTBUG-120931 Change-Id: I497b80f53f5680790211b71a53a9ddc75d113424 Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io> Reviewed-by: Tatiana Borisova <tatiana.borisova@qt.io>
This commit is contained in:
parent
d737f7a5fc
commit
280a255534
|
|
@ -44,7 +44,7 @@ static QString threadSafetyWarning(QLatin1StringView methodName)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\fn template <typename ParamType, typename StreamType> std::shared_ptr<StreamType> QAbstractGrpcClient::startStream(QLatin1StringView method, const QProtobufMessage &arg, const QGrpcCallOptions &options)
|
\fn template <typename StreamType> std::shared_ptr<StreamType> QAbstractGrpcClient::startStream(QLatin1StringView method, const QProtobufMessage &arg, const QGrpcCallOptions &options)
|
||||||
|
|
||||||
Starts the stream \a method of the \e StreamType type with the message
|
Starts the stream \a method of the \e StreamType type with the message
|
||||||
argument \a arg to the attached channel.
|
argument \a arg to the attached channel.
|
||||||
|
|
@ -193,6 +193,16 @@ void QAbstractGrpcClient::attachChannel(const std::shared_ptr<QAbstractGrpcChann
|
||||||
emit channelChanged();
|
emit channelChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<QGrpcCallReply> QAbstractGrpcClient::call(QLatin1StringView method,
|
||||||
|
const QProtobufMessage &arg,
|
||||||
|
const QGrpcCallOptions &options)
|
||||||
|
{
|
||||||
|
std::optional<QByteArray> argData = trySerialize(arg);
|
||||||
|
if (!argData)
|
||||||
|
return {};
|
||||||
|
return call(method, *argData, options);
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\since 6.7
|
\since 6.7
|
||||||
Returns the channel attached to this client.
|
Returns the channel attached to this client.
|
||||||
|
|
@ -281,6 +291,18 @@ QAbstractGrpcClient::startBidirStream(QLatin1StringView method, QByteArrayView a
|
||||||
return grpcStream;
|
return grpcStream;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::optional<QByteArray> QAbstractGrpcClient::trySerialize(const QProtobufMessage &arg)
|
||||||
|
{
|
||||||
|
using namespace Qt::StringLiterals;
|
||||||
|
auto _serializer = serializer();
|
||||||
|
if (_serializer == nullptr) {
|
||||||
|
Q_EMIT errorOccurred({ QGrpcStatus::Unknown,
|
||||||
|
"Serializing failed. Serializer is not ready."_L1 });
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
|
return _serializer->serialize(&arg);
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Serializer provides assigned to client serializer.
|
Serializer provides assigned to client serializer.
|
||||||
Returns pointer to serializerowned by QProtobufSerializerRegistry.
|
Returns pointer to serializerowned by QProtobufSerializerRegistry.
|
||||||
|
|
|
||||||
|
|
@ -41,29 +41,22 @@ protected:
|
||||||
explicit QAbstractGrpcClient(QLatin1StringView service, QObject *parent = nullptr);
|
explicit QAbstractGrpcClient(QLatin1StringView service, QObject *parent = nullptr);
|
||||||
~QAbstractGrpcClient() override;
|
~QAbstractGrpcClient() override;
|
||||||
|
|
||||||
template <typename ParamType>
|
|
||||||
std::shared_ptr<QGrpcCallReply> call(QLatin1StringView method, const QProtobufMessage &arg,
|
std::shared_ptr<QGrpcCallReply> call(QLatin1StringView method, const QProtobufMessage &arg,
|
||||||
const QGrpcCallOptions &options)
|
const QGrpcCallOptions &options);
|
||||||
{
|
|
||||||
std::optional<QByteArray> argData = trySerialize<ParamType>(arg);
|
|
||||||
if (!argData)
|
|
||||||
return {};
|
|
||||||
return call(method, *argData, options);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef Q_QDOC
|
#ifdef Q_QDOC
|
||||||
template <typename ParamType, typename StreamType>
|
template <typename StreamType>
|
||||||
#else
|
#else
|
||||||
template <typename ParamType, typename StreamType,
|
template <typename StreamType,
|
||||||
std::enable_if_t<std::is_same_v<StreamType, QGrpcServerStream>
|
std::enable_if_t<std::is_same_v<StreamType, QGrpcServerStream>
|
||||||
|| std::is_same_v<StreamType, QGrpcClientStream>
|
|| std::is_same_v<StreamType, QGrpcClientStream>
|
||||||
|| std::is_same_v<StreamType, QGrpcBidirStream>,
|
|| std::is_same_v<StreamType, QGrpcBidirStream>,
|
||||||
bool> = true>
|
bool> = true>
|
||||||
#endif
|
#endif
|
||||||
std::shared_ptr<StreamType> startStream(QLatin1StringView method, const QProtobufMessage &arg,
|
std::shared_ptr<StreamType> startStream(QLatin1StringView method, const QProtobufMessage &arg,
|
||||||
const QGrpcCallOptions &options)
|
const QGrpcCallOptions &options)
|
||||||
{
|
{
|
||||||
std::optional<QByteArray> argData = trySerialize<ParamType>(arg);
|
std::optional<QByteArray> argData = trySerialize(arg);
|
||||||
if (!argData)
|
if (!argData)
|
||||||
return {};
|
return {};
|
||||||
if constexpr (std::is_same_v<StreamType, QGrpcServerStream>) {
|
if constexpr (std::is_same_v<StreamType, QGrpcServerStream>) {
|
||||||
|
|
@ -89,19 +82,7 @@ private:
|
||||||
std::shared_ptr<QGrpcBidirStream> startBidirStream(QLatin1StringView method, QByteArrayView arg,
|
std::shared_ptr<QGrpcBidirStream> startBidirStream(QLatin1StringView method, QByteArrayView arg,
|
||||||
const QGrpcCallOptions &options);
|
const QGrpcCallOptions &options);
|
||||||
|
|
||||||
template <typename ParamType>
|
std::optional<QByteArray> trySerialize(const QProtobufMessage &arg);
|
||||||
std::optional<QByteArray> trySerialize(const QProtobufMessage &arg)
|
|
||||||
{
|
|
||||||
using namespace Qt::StringLiterals;
|
|
||||||
auto _serializer = serializer();
|
|
||||||
if (_serializer == nullptr) {
|
|
||||||
Q_EMIT errorOccurred({ QGrpcStatus::Unknown,
|
|
||||||
"Serializing failed. Serializer is not ready."_L1 });
|
|
||||||
return std::nullopt;
|
|
||||||
}
|
|
||||||
return _serializer->serialize(&arg);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::shared_ptr<QAbstractProtobufSerializer> serializer() const;
|
std::shared_ptr<QAbstractProtobufSerializer> serializer() const;
|
||||||
|
|
||||||
Q_DISABLE_COPY_MOVE(QAbstractGrpcClient)
|
Q_DISABLE_COPY_MOVE(QAbstractGrpcClient)
|
||||||
|
|
|
||||||
|
|
@ -66,7 +66,7 @@ const char *GrpcTemplates::ClientMethodDefinitionAsyncTemplate()
|
||||||
return "\nstd::shared_ptr<QGrpcCallReply> $classname$::$method_name$(const $param_type$ "
|
return "\nstd::shared_ptr<QGrpcCallReply> $classname$::$method_name$(const $param_type$ "
|
||||||
"&$param_name$, const QGrpcCallOptions &options)\n"
|
"&$param_name$, const QGrpcCallOptions &options)\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" return call<$param_type$>(\"$method_name$\"_L1, $param_name$, options);\n"
|
" return call(\"$method_name$\"_L1, $param_name$, options);\n"
|
||||||
"}\n";
|
"}\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -76,7 +76,7 @@ const char *GrpcTemplates::ClientMethodDefinitionAsync2Template()
|
||||||
"*context, const std::function<void(std::shared_ptr<QGrpcCallReply>)> &callback, const "
|
"*context, const std::function<void(std::shared_ptr<QGrpcCallReply>)> &callback, const "
|
||||||
"QGrpcCallOptions &options)\n"
|
"QGrpcCallOptions &options)\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" std::shared_ptr<QGrpcCallReply> reply = call<$param_type$>(\"$method_name$\"_L1, "
|
" std::shared_ptr<QGrpcCallReply> reply = call(\"$method_name$\"_L1, "
|
||||||
"$param_name$, options);\n"
|
"$param_name$, options);\n"
|
||||||
" QObject::connect(reply.get(), &QGrpcCallReply::finished, context, [reply, "
|
" QObject::connect(reply.get(), &QGrpcCallReply::finished, context, [reply, "
|
||||||
"callback]() "
|
"callback]() "
|
||||||
|
|
@ -104,7 +104,7 @@ const char *GrpcTemplates::ClientMethodDefinitionQmlTemplate()
|
||||||
"from JS engine context\";\n"
|
"from JS engine context\";\n"
|
||||||
" return;\n"
|
" return;\n"
|
||||||
" }\n\n"
|
" }\n\n"
|
||||||
" std::shared_ptr<QGrpcCallReply> reply = call<$param_type$>(\"$method_name$\"_L1, "
|
" std::shared_ptr<QGrpcCallReply> reply = call(\"$method_name$\"_L1, "
|
||||||
"$param_name$, options);\n"
|
"$param_name$, options);\n"
|
||||||
" reply->subscribe(jsEngine, [reply, callback, jsEngine]() {\n"
|
" reply->subscribe(jsEngine, [reply, callback, jsEngine]() {\n"
|
||||||
" auto result = $return_type$(reply->read<$return_type$>());\n"
|
" auto result = $return_type$(reply->read<$return_type$>());\n"
|
||||||
|
|
@ -126,7 +126,7 @@ const char *GrpcTemplates::ClientMethodStreamDefinitionTemplate()
|
||||||
return "std::shared_ptr<$stream_type$> $classname$::stream$method_name_upper$("
|
return "std::shared_ptr<$stream_type$> $classname$::stream$method_name_upper$("
|
||||||
"const $param_type$ &$param_name$, const QGrpcCallOptions &options)\n"
|
"const $param_type$ &$param_name$, const QGrpcCallOptions &options)\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" return startStream<$param_type$, $stream_type$>(\"$method_name$\"_L1, "
|
" return startStream<$stream_type$>(\"$method_name$\"_L1, "
|
||||||
"$param_name$, options);\n"
|
"$param_name$, options);\n"
|
||||||
"}\n\n";
|
"}\n\n";
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,12 +14,12 @@ Client::Client(QObject *parent)
|
||||||
|
|
||||||
std::shared_ptr<QGrpcCallReply> Client::testMethod(const qtgrpc::tests::SimpleStringMessage &arg, const QGrpcCallOptions &options)
|
std::shared_ptr<QGrpcCallReply> Client::testMethod(const qtgrpc::tests::SimpleStringMessage &arg, const QGrpcCallOptions &options)
|
||||||
{
|
{
|
||||||
return call<qtgrpc::tests::SimpleStringMessage>("testMethod"_L1, arg, options);
|
return call("testMethod"_L1, arg, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Client::testMethod(const qtgrpc::tests::SimpleStringMessage &arg, const QObject *context, const std::function<void(std::shared_ptr<QGrpcCallReply>)> &callback, const QGrpcCallOptions &options)
|
void Client::testMethod(const qtgrpc::tests::SimpleStringMessage &arg, const QObject *context, const std::function<void(std::shared_ptr<QGrpcCallReply>)> &callback, const QGrpcCallOptions &options)
|
||||||
{
|
{
|
||||||
std::shared_ptr<QGrpcCallReply> reply = call<qtgrpc::tests::SimpleStringMessage>("testMethod"_L1, arg, options);
|
std::shared_ptr<QGrpcCallReply> reply = call("testMethod"_L1, arg, options);
|
||||||
QObject::connect(reply.get(), &QGrpcCallReply::finished, context, [reply, callback]() {
|
QObject::connect(reply.get(), &QGrpcCallReply::finished, context, [reply, callback]() {
|
||||||
callback(reply);
|
callback(reply);
|
||||||
}, Qt::SingleShotConnection);
|
}, Qt::SingleShotConnection);
|
||||||
|
|
@ -27,17 +27,17 @@ void Client::testMethod(const qtgrpc::tests::SimpleStringMessage &arg, const QOb
|
||||||
|
|
||||||
std::shared_ptr<QGrpcServerStream> Client::streamTestMethodServerStream(const qtgrpc::tests::SimpleStringMessage &arg, const QGrpcCallOptions &options)
|
std::shared_ptr<QGrpcServerStream> Client::streamTestMethodServerStream(const qtgrpc::tests::SimpleStringMessage &arg, const QGrpcCallOptions &options)
|
||||||
{
|
{
|
||||||
return startStream<qtgrpc::tests::SimpleStringMessage, QGrpcServerStream>("testMethodServerStream"_L1, arg, options);
|
return startStream<QGrpcServerStream>("testMethodServerStream"_L1, arg, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<QGrpcClientStream> Client::streamTestMethodClientStream(const qtgrpc::tests::SimpleStringMessage &arg, const QGrpcCallOptions &options)
|
std::shared_ptr<QGrpcClientStream> Client::streamTestMethodClientStream(const qtgrpc::tests::SimpleStringMessage &arg, const QGrpcCallOptions &options)
|
||||||
{
|
{
|
||||||
return startStream<qtgrpc::tests::SimpleStringMessage, QGrpcClientStream>("testMethodClientStream"_L1, arg, options);
|
return startStream<QGrpcClientStream>("testMethodClientStream"_L1, arg, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<QGrpcBidirStream> Client::streamTestMethodBiStream(const qtgrpc::tests::SimpleStringMessage &arg, const QGrpcCallOptions &options)
|
std::shared_ptr<QGrpcBidirStream> Client::streamTestMethodBiStream(const qtgrpc::tests::SimpleStringMessage &arg, const QGrpcCallOptions &options)
|
||||||
{
|
{
|
||||||
return startStream<qtgrpc::tests::SimpleStringMessage, QGrpcBidirStream>("testMethodBiStream"_L1, arg, options);
|
return startStream<QGrpcBidirStream>("testMethodBiStream"_L1, arg, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace TestService
|
} // namespace TestService
|
||||||
|
|
|
||||||
|
|
@ -14,12 +14,12 @@ Client::Client(QObject *parent)
|
||||||
|
|
||||||
std::shared_ptr<QGrpcCallReply> Client::testMethod(const qtgrpc::tests::SimpleStringMessage &arg, const QGrpcCallOptions &options)
|
std::shared_ptr<QGrpcCallReply> Client::testMethod(const qtgrpc::tests::SimpleStringMessage &arg, const QGrpcCallOptions &options)
|
||||||
{
|
{
|
||||||
return call<qtgrpc::tests::SimpleStringMessage>("testMethod"_L1, arg, options);
|
return call("testMethod"_L1, arg, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Client::testMethod(const qtgrpc::tests::SimpleStringMessage &arg, const QObject *context, const std::function<void(std::shared_ptr<QGrpcCallReply>)> &callback, const QGrpcCallOptions &options)
|
void Client::testMethod(const qtgrpc::tests::SimpleStringMessage &arg, const QObject *context, const std::function<void(std::shared_ptr<QGrpcCallReply>)> &callback, const QGrpcCallOptions &options)
|
||||||
{
|
{
|
||||||
std::shared_ptr<QGrpcCallReply> reply = call<qtgrpc::tests::SimpleStringMessage>("testMethod"_L1, arg, options);
|
std::shared_ptr<QGrpcCallReply> reply = call("testMethod"_L1, arg, options);
|
||||||
QObject::connect(reply.get(), &QGrpcCallReply::finished, context, [reply, callback]() {
|
QObject::connect(reply.get(), &QGrpcCallReply::finished, context, [reply, callback]() {
|
||||||
callback(reply);
|
callback(reply);
|
||||||
}, Qt::SingleShotConnection);
|
}, Qt::SingleShotConnection);
|
||||||
|
|
@ -27,17 +27,17 @@ void Client::testMethod(const qtgrpc::tests::SimpleStringMessage &arg, const QOb
|
||||||
|
|
||||||
std::shared_ptr<QGrpcServerStream> Client::streamTestMethodServerStream(const qtgrpc::tests::SimpleStringMessage &arg, const QGrpcCallOptions &options)
|
std::shared_ptr<QGrpcServerStream> Client::streamTestMethodServerStream(const qtgrpc::tests::SimpleStringMessage &arg, const QGrpcCallOptions &options)
|
||||||
{
|
{
|
||||||
return startStream<qtgrpc::tests::SimpleStringMessage, QGrpcServerStream>("testMethodServerStream"_L1, arg, options);
|
return startStream<QGrpcServerStream>("testMethodServerStream"_L1, arg, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<QGrpcClientStream> Client::streamTestMethodClientStream(const qtgrpc::tests::SimpleStringMessage &arg, const QGrpcCallOptions &options)
|
std::shared_ptr<QGrpcClientStream> Client::streamTestMethodClientStream(const qtgrpc::tests::SimpleStringMessage &arg, const QGrpcCallOptions &options)
|
||||||
{
|
{
|
||||||
return startStream<qtgrpc::tests::SimpleStringMessage, QGrpcClientStream>("testMethodClientStream"_L1, arg, options);
|
return startStream<QGrpcClientStream>("testMethodClientStream"_L1, arg, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<QGrpcBidirStream> Client::streamTestMethodBiStream(const qtgrpc::tests::SimpleStringMessage &arg, const QGrpcCallOptions &options)
|
std::shared_ptr<QGrpcBidirStream> Client::streamTestMethodBiStream(const qtgrpc::tests::SimpleStringMessage &arg, const QGrpcCallOptions &options)
|
||||||
{
|
{
|
||||||
return startStream<qtgrpc::tests::SimpleStringMessage, QGrpcBidirStream>("testMethodBiStream"_L1, arg, options);
|
return startStream<QGrpcBidirStream>("testMethodBiStream"_L1, arg, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace TestService
|
} // namespace TestService
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ void QmlClient::testMethod(const qtgrpc::tests::SimpleStringMessage &arg, const
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<QGrpcCallReply> reply = call<qtgrpc::tests::SimpleStringMessage>("testMethod"_L1, arg, options);
|
std::shared_ptr<QGrpcCallReply> reply = call("testMethod"_L1, arg, options);
|
||||||
reply->subscribe(jsEngine, [reply, callback, jsEngine]() {
|
reply->subscribe(jsEngine, [reply, callback, jsEngine]() {
|
||||||
auto result = qtgrpc::tests::SimpleStringMessage(reply->read<qtgrpc::tests::SimpleStringMessage>());
|
auto result = qtgrpc::tests::SimpleStringMessage(reply->read<qtgrpc::tests::SimpleStringMessage>());
|
||||||
QJSValue(callback).call(QJSValueList{jsEngine->toScriptValue(result)});
|
QJSValue(callback).call(QJSValueList{jsEngine->toScriptValue(result)});
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue