cmCTestHandlerCommand.h 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. file Copyright.txt or https://cmake.org/licensing for details. */
  3. #pragma once
  4. #include "cmConfigure.h" // IWYU pragma: keep
  5. #include <functional>
  6. #include <memory>
  7. #include <string>
  8. #include <type_traits>
  9. #include <vector>
  10. #include <cm/string_view>
  11. #include <cmext/string_view>
  12. #include "cmArgumentParser.h"
  13. #include "cmCTestCommand.h"
  14. class cmExecutionStatus;
  15. class cmCTestGenericHandler;
  16. class cmCTestHandlerCommand : public cmCTestCommand
  17. {
  18. public:
  19. using cmCTestCommand::cmCTestCommand;
  20. protected:
  21. struct BasicArguments : ArgumentParser::ParseResult
  22. {
  23. std::string CaptureCMakeError;
  24. std::vector<cm::string_view> ParsedKeywords;
  25. };
  26. template <typename Args>
  27. static auto MakeBasicParser() -> cmArgumentParser<Args>
  28. {
  29. static_assert(std::is_base_of<BasicArguments, Args>::value, "");
  30. return cmArgumentParser<Args>{}
  31. .Bind("CAPTURE_CMAKE_ERROR"_s, &BasicArguments::CaptureCMakeError)
  32. .BindParsedKeywords(&BasicArguments::ParsedKeywords);
  33. }
  34. struct HandlerArguments : BasicArguments
  35. {
  36. bool Append = false;
  37. bool Quiet = false;
  38. std::string ReturnValue;
  39. std::string Build;
  40. std::string Source;
  41. std::string SubmitIndex;
  42. };
  43. template <typename Args>
  44. static auto MakeHandlerParser() -> cmArgumentParser<Args>
  45. {
  46. static_assert(std::is_base_of<HandlerArguments, Args>::value, "");
  47. return cmArgumentParser<Args>{ MakeBasicParser<Args>() }
  48. .Bind("APPEND"_s, &HandlerArguments::Append)
  49. .Bind("QUIET"_s, &HandlerArguments::Quiet)
  50. .Bind("RETURN_VALUE"_s, &HandlerArguments::ReturnValue)
  51. .Bind("SOURCE"_s, &HandlerArguments::Source)
  52. .Bind("BUILD"_s, &HandlerArguments::Build)
  53. .Bind("SUBMIT_INDEX"_s, &HandlerArguments::SubmitIndex);
  54. }
  55. protected:
  56. template <typename Args, typename Handler>
  57. bool Invoke(cmArgumentParser<Args> const& parser,
  58. std::vector<std::string> const& arguments,
  59. cmExecutionStatus& status, Handler handler) const
  60. {
  61. std::vector<std::string> unparsed;
  62. Args args = parser.Parse(arguments, &unparsed);
  63. return this->InvokeImpl(args, unparsed, status,
  64. [&]() -> bool { return handler(args); });
  65. };
  66. bool ExecuteHandlerCommand(HandlerArguments& args,
  67. cmExecutionStatus& status) const;
  68. private:
  69. bool InvokeImpl(BasicArguments& args,
  70. std::vector<std::string> const& unparsed,
  71. cmExecutionStatus& status,
  72. std::function<bool()> handler) const;
  73. virtual std::string GetName() const = 0;
  74. virtual void CheckArguments(HandlerArguments& arguments,
  75. cmExecutionStatus& status) const;
  76. virtual std::unique_ptr<cmCTestGenericHandler> InitializeHandler(
  77. HandlerArguments& arguments, cmExecutionStatus& status) const;
  78. virtual void ProcessAdditionalValues(cmCTestGenericHandler*,
  79. HandlerArguments const& arguments,
  80. cmExecutionStatus& status) const;
  81. };