diff options
author | Mårten Nordheim <marten.nordheim@qt.io> | 2023-02-27 17:36:01 +0100 |
---|---|---|
committer | Mårten Nordheim <marten.nordheim@qt.io> | 2023-03-06 15:22:07 +0100 |
commit | 13209168fecad210c75039eb7c7f7147eb11034b (patch) | |
tree | 3f871c2645c397110211d6e5b4b6434946a80649 /examples/network/dnslookup | |
parent | 8716a1508982e9c30d8898251c44253f796d0000 (diff) |
DNS Lookup: Change local function to return struct instead of enum
This let's us get rid of an out-parameter.
Task-number: QTBUG-108873
Change-Id: Ifc08d3905932f28ecdfdf3a7de1499700cc7e606
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
(cherry picked from commit af95f9746666c63e54c760d34b25c3c8b9bfdc72)
Reviewed-by: Konrad Kujawa <konrad.kujawa@qt.io>
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
Diffstat (limited to 'examples/network/dnslookup')
-rw-r--r-- | examples/network/dnslookup/dnslookup.cpp | 73 |
1 files changed, 37 insertions, 36 deletions
diff --git a/examples/network/dnslookup/dnslookup.cpp b/examples/network/dnslookup/dnslookup.cpp index d1b7ce1e78..cd7af8e6dc 100644 --- a/examples/network/dnslookup/dnslookup.cpp +++ b/examples/network/dnslookup/dnslookup.cpp @@ -13,6 +13,7 @@ #include <stdio.h> +using namespace Qt::StringLiterals; static std::optional<QDnsLookup::Type> typeFromParameter(QStringView type) { if (type.compare(u"a", Qt::CaseInsensitive) == 0) @@ -38,16 +39,22 @@ static std::optional<QDnsLookup::Type> typeFromParameter(QStringView type) //! [0] -enum CommandLineParseResult +struct CommandLineParseResult { - CommandLineOk, - CommandLineError, - CommandLineVersionRequested, - CommandLineHelpRequested + enum class Status { + Ok, + Error, + VersionRequested, + HelpRequested + }; + Status statusCode = Status::Ok; + std::optional<QString> errorString = std::nullopt; }; -CommandLineParseResult parseCommandLine(QCommandLineParser &parser, DnsQuery *query, QString *errorMessage) +CommandLineParseResult parseCommandLine(QCommandLineParser &parser, DnsQuery *query) { + using Status = CommandLineParseResult::Status; + parser.setSingleDashWordOptionMode(QCommandLineParser::ParseAsLongOptions); const QCommandLineOption nameServerOption("n", "The name server to use.", "nameserver"); parser.addOption(nameServerOption); @@ -57,48 +64,41 @@ CommandLineParseResult parseCommandLine(QCommandLineParser &parser, DnsQuery *qu const QCommandLineOption helpOption = parser.addHelpOption(); const QCommandLineOption versionOption = parser.addVersionOption(); - if (!parser.parse(QCoreApplication::arguments())) { - *errorMessage = parser.errorText(); - return CommandLineError; - } + if (!parser.parse(QCoreApplication::arguments())) + return { Status::Error, parser.errorText() }; if (parser.isSet(versionOption)) - return CommandLineVersionRequested; + return { Status::VersionRequested }; if (parser.isSet(helpOption)) - return CommandLineHelpRequested; + return { Status::HelpRequested }; if (parser.isSet(nameServerOption)) { const QString nameserver = parser.value(nameServerOption); query->nameServer = QHostAddress(nameserver); - if (query->nameServer.isNull() || query->nameServer.protocol() == QAbstractSocket::UnknownNetworkLayerProtocol) { - *errorMessage = "Bad nameserver address: " + nameserver; - return CommandLineError; + if (query->nameServer.isNull() + || query->nameServer.protocol() == QAbstractSocket::UnknownNetworkLayerProtocol) { + return { Status::Error, + u"Bad nameserver address: %1"_qs.arg(nameserver) }; } } if (parser.isSet(typeOption)) { const QString typeParameter = parser.value(typeOption); - if (std::optional<QDnsLookup::Type> type = typeFromParameter(typeParameter)) { + if (std::optional<QDnsLookup::Type> type = typeFromParameter(typeParameter)) query->type = *type; - } else { - *errorMessage = "Bad record type: " + typeParameter; - return CommandLineError; - } + else + return { Status::Error, u"Bad record type: %1"_qs.arg(typeParameter) }; } const QStringList positionalArguments = parser.positionalArguments(); - if (positionalArguments.isEmpty()) { - *errorMessage = "Argument 'name' missing."; - return CommandLineError; - } - if (positionalArguments.size() > 1) { - *errorMessage = "Several 'name' arguments specified."; - return CommandLineError; - } + if (positionalArguments.isEmpty()) + return { Status::Error, u"Argument 'name' missing."_qs }; + if (positionalArguments.size() > 1) + return { Status::Error, u"Several 'name' arguments specified."_qs }; query->name = positionalArguments.first(); - return CommandLineOk; + return { Status::Ok }; } //! [0] @@ -195,19 +195,20 @@ int main(int argc, char *argv[]) "An example demonstrating the " "class QDnsLookup.")); DnsQuery query; - QString errorMessage; - switch (parseCommandLine(parser, &query, &errorMessage)) { - case CommandLineOk: + using Status = CommandLineParseResult::Status; + CommandLineParseResult parseResult = parseCommandLine(parser, &query); + switch (parseResult.statusCode) { + case Status::Ok: break; - case CommandLineError: - fputs(qPrintable(errorMessage), stderr); + case Status::Error: + fputs(qPrintable(parseResult.errorString.value_or(u"Unknown error occurred"_qs)), stderr); fputs("\n\n", stderr); fputs(qPrintable(parser.helpText()), stderr); return 1; - case CommandLineVersionRequested: + case Status::VersionRequested: parser.showVersion(); Q_UNREACHABLE_RETURN(0); - case CommandLineHelpRequested: + case Status::HelpRequested: parser.showHelp(); Q_UNREACHABLE_RETURN(0); } |