From 17059240024ec8b2cc69c278701da76270c05182 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Thu, 2 Feb 2023 20:36:44 -0500 Subject: [PATCH] Improve error reporting in chip-tool when the wrong quotes are used. (#24821) * Improve error reporting in chip-tool when the wrong quotes are used. In interactive mode, arguments are delimited by single quotes. If our argument init fails, and we have arguments that include mismatched double quotes, there's a good chance the wrong quotes were used in the command, and we should log that. * Address review comment. --- .../chip-tool/commands/common/Commands.cpp | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/examples/chip-tool/commands/common/Commands.cpp b/examples/chip-tool/commands/common/Commands.cpp index adab8a12be75f5..749cbdcc739250 100644 --- a/examples/chip-tool/commands/common/Commands.cpp +++ b/examples/chip-tool/commands/common/Commands.cpp @@ -72,6 +72,35 @@ std::vector GetArgumentsFromJson(Command * command, Json::Value & v return args; }; +// Check for arguments with a starting '"' but no ending '"': those +// would indicate that people are using double-quoting, not single +// quoting, on arguments with spaces. +static void DetectAndLogMismatchedDoubleQuotes(int argc, char ** argv) +{ + for (int curArg = 0; curArg < argc; ++curArg) + { + char * arg = argv[curArg]; + if (!arg) + { + continue; + } + + auto len = strlen(arg); + if (len == 0) + { + continue; + } + + if (arg[0] == '"' && arg[len - 1] != '"') + { + ChipLogError(chipTool, + "Mismatched '\"' detected in argument: '%s'. Use single quotes to delimit arguments with spaces " + "in them: 'x y', not \"x y\".", + arg); + } + } +} + } // namespace void Commands::Register(const char * clusterName, commands_list commandsList) @@ -217,6 +246,10 @@ CHIP_ERROR Commands::RunCommand(int argc, char ** argv, bool interactive) int argumentsPosition = isGlobalCommand ? 4 : 3; if (!command->InitArguments(argc - argumentsPosition, &argv[argumentsPosition])) { + if (interactive) + { + DetectAndLogMismatchedDoubleQuotes(argc - argumentsPosition, &argv[argumentsPosition]); + } ShowCommand(argv[0], argv[1], command); return CHIP_ERROR_INVALID_ARGUMENT; }