| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
- file Copyright.txt or https://cmake.org/licensing for details. */
- #pragma once
- #include "cmConfigure.h" // IWYU pragma: keep
- #include <functional>
- #include <memory>
- #include <string>
- #include <type_traits>
- #include <vector>
- #include <cm/string_view>
- #include <cmext/string_view>
- #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<cm::string_view> ParsedKeywords;
- };
- template <typename Args>
- static auto MakeBasicParser() -> cmArgumentParser<Args>
- {
- static_assert(std::is_base_of<BasicArguments, Args>::value, "");
- return cmArgumentParser<Args>{}
- .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 <typename Args>
- static auto MakeHandlerParser() -> cmArgumentParser<Args>
- {
- static_assert(std::is_base_of<HandlerArguments, Args>::value, "");
- return cmArgumentParser<Args>{ MakeBasicParser<Args>() }
- .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 <typename Args, typename Handler>
- bool Invoke(cmArgumentParser<Args> const& parser,
- std::vector<std::string> const& arguments,
- cmExecutionStatus& status, Handler handler) const
- {
- std::vector<std::string> 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<std::string> const& unparsed,
- cmExecutionStatus& status,
- std::function<bool()> handler) const;
- virtual std::string GetName() const = 0;
- virtual void CheckArguments(HandlerArguments& arguments,
- cmExecutionStatus& status) const;
- virtual std::unique_ptr<cmCTestGenericHandler> InitializeHandler(
- HandlerArguments& arguments, cmExecutionStatus& status) const;
- virtual void ProcessAdditionalValues(cmCTestGenericHandler*,
- HandlerArguments const& arguments,
- cmExecutionStatus& status) const;
- };
|