mirror of
https://github.com/ProtonMail/proton-bridge.git
synced 2025-12-17 23:56:56 +00:00
fix(BRIDGE-8): more robust command-line args parser in bridge-gui.
fix(BRIDGE-8): add command-line invocation to log.
This commit is contained in:
@ -23,16 +23,15 @@
|
||||
using namespace bridgepp;
|
||||
|
||||
|
||||
|
||||
//****************************************************************************************************************************************************
|
||||
//
|
||||
//****************************************************************************************************************************************************
|
||||
TEST(CLI, stripStringParameterFromCommandLine) {
|
||||
struct Test {
|
||||
struct TestData {
|
||||
QStringList input;
|
||||
QStringList expectedOutput;
|
||||
};
|
||||
QList<Test> const tests = {
|
||||
QList<TestData> const tests = {
|
||||
{{}, {}},
|
||||
{{ "--a", "-b", "--C" }, { "--a", "-b", "--C" } },
|
||||
{{ "--string", "value" }, {} },
|
||||
@ -44,7 +43,36 @@ TEST(CLI, stripStringParameterFromCommandLine) {
|
||||
{{ "--string", "--string", "value", "-b", "--string"}, { "value", "-b" } },
|
||||
};
|
||||
|
||||
for (Test const& test: tests) {
|
||||
for (TestData const& test: tests) {
|
||||
EXPECT_EQ(stripStringParameterFromCommandLine("--string", test.input), test.expectedOutput);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
TEST(CLI, parseGoCLIStringArgument) {
|
||||
struct TestData {
|
||||
QStringList args;
|
||||
QStringList params;
|
||||
QStringList expectedOutput;
|
||||
};
|
||||
|
||||
QList<TestData> const tests = {
|
||||
{ {}, {}, {} },
|
||||
{ {"-param"}, {"param"}, {} },
|
||||
{ {"--param", "1"}, {"param"}, { "1" } },
|
||||
{ {"--param", "1","p", "-p", "2", "-flag", "-param=3", "--p=4"}, {"param", "p"}, { "1", "2", "3", "4" } },
|
||||
{ {"--param", "--param", "1"}, {"param"}, { "--param" } },
|
||||
};
|
||||
|
||||
for (TestData const& test: tests) {
|
||||
EXPECT_EQ(parseGoCLIStringArgument(test.args, test.params), test.expectedOutput);
|
||||
}
|
||||
}
|
||||
|
||||
TEST(CLI, cliArgsToStringList) {
|
||||
int constexpr argc = 3;
|
||||
char *argv[] = { const_cast<char *>("1"), const_cast<char *>("2"), const_cast<char *>("3") };
|
||||
QStringList const strList { "1", "2", "3" };
|
||||
EXPECT_EQ(cliArgsToStringList(argc,argv), strList);
|
||||
EXPECT_EQ(cliArgsToStringList(0, nullptr), QStringList {});
|
||||
}
|
||||
|
||||
@ -42,4 +42,51 @@ QStringList stripStringParameterFromCommandLine(QString const ¶mName, QStrin
|
||||
}
|
||||
|
||||
|
||||
//****************************************************************************************************************************************************
|
||||
/// The flags may be present more than once in the args. All values are returned in order of appearance.
|
||||
///
|
||||
/// \param[in] args The arguments
|
||||
/// \param[in] paramNames the list of names for the parameter, without any prefix hypen.
|
||||
/// \return The values found for the flag.
|
||||
//****************************************************************************************************************************************************
|
||||
QStringList parseGoCLIStringArgument(QStringList const &args, QStringList const& paramNames) {
|
||||
// go cli package is pretty permissive when it comes to parsing arguments. For each name 'param', all the following seems to be accepted:
|
||||
// -param value
|
||||
// --param value
|
||||
// -param=value
|
||||
// --param=value
|
||||
|
||||
QStringList result;
|
||||
qsizetype const argCount = args.count();
|
||||
for (qsizetype i = 0; i < args.size(); ++i) {
|
||||
for (QString const ¶mName: paramNames) {
|
||||
if ((i < argCount - 1) && ((args[i] == "-" + paramName) || (args[i] == "--" + paramName))) {
|
||||
result.append(args[i + 1]);
|
||||
i += 1;
|
||||
continue;
|
||||
}
|
||||
if (QRegularExpressionMatch match = QRegularExpression(QString("^-{1,2}%1=(.+)$").arg(paramName)).match(args[i]); match.hasMatch()) {
|
||||
result.append(match.captured(1));
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
//****************************************************************************************************************************************************
|
||||
/// \param[in] argc The number of command-line arguments.
|
||||
/// \param[in] argv The list of command-line arguments.
|
||||
/// \return A QStringList representing the arguments list.
|
||||
//****************************************************************************************************************************************************
|
||||
QStringList cliArgsToStringList(int argc, char **argv) {
|
||||
QStringList result;
|
||||
result.reserve(argc);
|
||||
for (qsizetype i = 0; i < argc; ++i) {
|
||||
result.append(QString::fromLocal8Bit(argv[i]));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
} // namespace bridgepp
|
||||
|
||||
@ -15,18 +15,15 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Proton Mail Bridge. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
#ifndef BRIDGEPP_CLI_UTILS_H
|
||||
#define BRIDGEPP_CLI_UTILS_H
|
||||
|
||||
|
||||
namespace bridgepp {
|
||||
|
||||
|
||||
QStringList stripStringParameterFromCommandLine(QString const ¶mName, QStringList const &commandLineParams); ///< Remove a string parameter from a list of command-line parameters.
|
||||
|
||||
QStringList parseGoCLIStringArgument(QStringList const &args, QStringList const ¶mNames); ///< Parse a command-line string argument as expected by go's CLI package.
|
||||
QStringList cliArgsToStringList(int argc, char **argv); ///< Converts C-style command-line arguments to a string list.
|
||||
|
||||
}
|
||||
|
||||
|
||||
#endif // BRIDGEPP_CLI_UTILS_H
|
||||
|
||||
Reference in New Issue
Block a user