/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file LICENSE.rst or https://cmake.org/licensing for details. */ #pragma once #include "cmConfigure.h" // IWYU pragma: keep #include #include #include #include #include #include #include #include "cmArgumentParser.h" #include "cmCTestCommand.h" class cmExecutionStatus; class cmCTestGenericHandler; class cmCTestHandlerCommand : public cmCTestCommand { public: using cmCTestCommand::cmCTestCommand; protected: struct BasicArguments : ArgumentParser::ParseResult { std::string CaptureCMakeError; std::vector ParsedKeywords; }; template static auto MakeBasicParser() -> cmArgumentParser { static_assert(std::is_base_of::value, ""); return cmArgumentParser{} .Bind("CAPTURE_CMAKE_ERROR"_s, &BasicArguments::CaptureCMakeError) .BindParsedKeywords(&BasicArguments::ParsedKeywords); } struct HandlerArguments : BasicArguments { bool Append = false; bool Quiet = false; std::string ReturnValue; std::string Build; std::string Source; std::string SubmitIndex; }; template static auto MakeHandlerParser() -> cmArgumentParser { static_assert(std::is_base_of::value, ""); return cmArgumentParser{ MakeBasicParser() } .Bind("APPEND"_s, &HandlerArguments::Append) .Bind("QUIET"_s, &HandlerArguments::Quiet) .Bind("RETURN_VALUE"_s, &HandlerArguments::ReturnValue) .Bind("SOURCE"_s, &HandlerArguments::Source) .Bind("BUILD"_s, &HandlerArguments::Build) .Bind("SUBMIT_INDEX"_s, &HandlerArguments::SubmitIndex); } protected: template bool Invoke(cmArgumentParser const& parser, std::vector const& arguments, cmExecutionStatus& status, Handler handler) const { std::vector unparsed; Args args = parser.Parse(arguments, &unparsed); return this->InvokeImpl(args, unparsed, status, [&]() -> bool { return handler(args); }); }; bool ExecuteHandlerCommand(HandlerArguments& args, cmExecutionStatus& status) const; private: bool InvokeImpl(BasicArguments& args, std::vector const& unparsed, cmExecutionStatus& status, std::function handler) const; virtual std::string GetName() const = 0; virtual void CheckArguments(HandlerArguments& arguments, cmExecutionStatus& status) const; virtual std::unique_ptr InitializeHandler( HandlerArguments& arguments, cmExecutionStatus& status) const; virtual void ProcessAdditionalValues(cmCTestGenericHandler*, HandlerArguments const& arguments, cmExecutionStatus& status) const; };