cmCMakePresetsGraphReadJSONConfigurePresets.cxx 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. file Copyright.txt or https://cmake.org/licensing for details. */
  3. #include <cstddef>
  4. #include <functional>
  5. #include <map>
  6. #include <memory>
  7. #include <string>
  8. #include <vector>
  9. #include <cm/optional>
  10. #include <cmext/string_view>
  11. #include <cm3p/json/value.h>
  12. #include "cmCMakePresetsGraph.h"
  13. #include "cmCMakePresetsGraphInternal.h"
  14. #include "cmJSONHelpers.h"
  15. namespace {
  16. using ReadFileResult = cmCMakePresetsGraph::ReadFileResult;
  17. using CacheVariable = cmCMakePresetsGraph::CacheVariable;
  18. using ConfigurePreset = cmCMakePresetsGraph::ConfigurePreset;
  19. using ArchToolsetStrategy = cmCMakePresetsGraph::ArchToolsetStrategy;
  20. ReadFileResult ArchToolsetStrategyHelper(
  21. cm::optional<ArchToolsetStrategy>& out, const Json::Value* value)
  22. {
  23. if (!value) {
  24. out = cm::nullopt;
  25. return ReadFileResult::READ_OK;
  26. }
  27. if (!value->isString()) {
  28. return ReadFileResult::INVALID_PRESET;
  29. }
  30. if (value->asString() == "set") {
  31. out = ArchToolsetStrategy::Set;
  32. return ReadFileResult::READ_OK;
  33. }
  34. if (value->asString() == "external") {
  35. out = ArchToolsetStrategy::External;
  36. return ReadFileResult::READ_OK;
  37. }
  38. return ReadFileResult::INVALID_PRESET;
  39. }
  40. std::function<ReadFileResult(ConfigurePreset&, const Json::Value*)>
  41. ArchToolsetHelper(
  42. std::string ConfigurePreset::*valueField,
  43. cm::optional<ArchToolsetStrategy> ConfigurePreset::*strategyField)
  44. {
  45. auto const objectHelper =
  46. cmJSONObjectHelper<ConfigurePreset, ReadFileResult>(
  47. ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESET, false)
  48. .Bind("value", valueField,
  49. cmCMakePresetsGraphInternal::PresetStringHelper, false)
  50. .Bind("strategy", strategyField, ArchToolsetStrategyHelper, false);
  51. return [valueField, strategyField, objectHelper](
  52. ConfigurePreset& out, const Json::Value* value) -> ReadFileResult {
  53. if (!value) {
  54. (out.*valueField).clear();
  55. out.*strategyField = cm::nullopt;
  56. return ReadFileResult::READ_OK;
  57. }
  58. if (value->isString()) {
  59. out.*valueField = value->asString();
  60. out.*strategyField = cm::nullopt;
  61. return ReadFileResult::READ_OK;
  62. }
  63. if (value->isObject()) {
  64. return objectHelper(out, value);
  65. }
  66. return ReadFileResult::INVALID_PRESET;
  67. };
  68. }
  69. auto const ArchitectureHelper = ArchToolsetHelper(
  70. &ConfigurePreset::Architecture, &ConfigurePreset::ArchitectureStrategy);
  71. auto const ToolsetHelper = ArchToolsetHelper(
  72. &ConfigurePreset::Toolset, &ConfigurePreset::ToolsetStrategy);
  73. auto const VariableStringHelper = cmJSONStringHelper<ReadFileResult>(
  74. ReadFileResult::READ_OK, ReadFileResult::INVALID_VARIABLE);
  75. ReadFileResult VariableValueHelper(std::string& out, const Json::Value* value)
  76. {
  77. if (!value) {
  78. out.clear();
  79. return ReadFileResult::READ_OK;
  80. }
  81. if (value->isBool()) {
  82. out = value->asBool() ? "TRUE" : "FALSE";
  83. return ReadFileResult::READ_OK;
  84. }
  85. return VariableStringHelper(out, value);
  86. }
  87. auto const VariableObjectHelper =
  88. cmJSONObjectHelper<CacheVariable, ReadFileResult>(
  89. ReadFileResult::READ_OK, ReadFileResult::INVALID_VARIABLE, false)
  90. .Bind("type"_s, &CacheVariable::Type, VariableStringHelper, false)
  91. .Bind("value"_s, &CacheVariable::Value, VariableValueHelper);
  92. ReadFileResult VariableHelper(cm::optional<CacheVariable>& out,
  93. const Json::Value* value)
  94. {
  95. if (value->isBool()) {
  96. out = CacheVariable{
  97. /*Type=*/"BOOL",
  98. /*Value=*/value->asBool() ? "TRUE" : "FALSE",
  99. };
  100. return ReadFileResult::READ_OK;
  101. }
  102. if (value->isString()) {
  103. out = CacheVariable{
  104. /*Type=*/"",
  105. /*Value=*/value->asString(),
  106. };
  107. return ReadFileResult::READ_OK;
  108. }
  109. if (value->isObject()) {
  110. out.emplace();
  111. return VariableObjectHelper(*out, value);
  112. }
  113. if (value->isNull()) {
  114. out = cm::nullopt;
  115. return ReadFileResult::READ_OK;
  116. }
  117. return ReadFileResult::INVALID_VARIABLE;
  118. }
  119. auto const VariablesHelper =
  120. cmJSONMapHelper<cm::optional<CacheVariable>, ReadFileResult>(
  121. ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESET, VariableHelper);
  122. auto const PresetWarningsHelper =
  123. cmJSONObjectHelper<ConfigurePreset, ReadFileResult>(
  124. ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESET, false)
  125. .Bind("dev"_s, &ConfigurePreset::WarnDev,
  126. cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
  127. .Bind("deprecated"_s, &ConfigurePreset::WarnDeprecated,
  128. cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
  129. .Bind("uninitialized"_s, &ConfigurePreset::WarnUninitialized,
  130. cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
  131. .Bind("unusedCli"_s, &ConfigurePreset::WarnUnusedCli,
  132. cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
  133. .Bind("systemVars"_s, &ConfigurePreset::WarnSystemVars,
  134. cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false);
  135. auto const PresetErrorsHelper =
  136. cmJSONObjectHelper<ConfigurePreset, ReadFileResult>(
  137. ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESET, false)
  138. .Bind("dev"_s, &ConfigurePreset::ErrorDev,
  139. cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
  140. .Bind("deprecated"_s, &ConfigurePreset::ErrorDeprecated,
  141. cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false);
  142. auto const PresetDebugHelper =
  143. cmJSONObjectHelper<ConfigurePreset, ReadFileResult>(
  144. ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESET, false)
  145. .Bind("output"_s, &ConfigurePreset::DebugOutput,
  146. cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
  147. .Bind("tryCompile"_s, &ConfigurePreset::DebugTryCompile,
  148. cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
  149. .Bind("find"_s, &ConfigurePreset::DebugFind,
  150. cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false);
  151. auto const ConfigurePresetHelper =
  152. cmJSONObjectHelper<ConfigurePreset, ReadFileResult>(
  153. ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESET, false)
  154. .Bind("name"_s, &ConfigurePreset::Name,
  155. cmCMakePresetsGraphInternal::PresetStringHelper)
  156. .Bind("inherits"_s, &ConfigurePreset::Inherits,
  157. cmCMakePresetsGraphInternal::PresetVectorOneOrMoreStringHelper,
  158. false)
  159. .Bind("hidden"_s, &ConfigurePreset::Hidden,
  160. cmCMakePresetsGraphInternal::PresetBoolHelper, false)
  161. .Bind<std::nullptr_t>("vendor"_s, nullptr,
  162. cmCMakePresetsGraphInternal::VendorHelper(
  163. ReadFileResult::INVALID_PRESET),
  164. false)
  165. .Bind("displayName"_s, &ConfigurePreset::DisplayName,
  166. cmCMakePresetsGraphInternal::PresetStringHelper, false)
  167. .Bind("description"_s, &ConfigurePreset::Description,
  168. cmCMakePresetsGraphInternal::PresetStringHelper, false)
  169. .Bind("generator"_s, &ConfigurePreset::Generator,
  170. cmCMakePresetsGraphInternal::PresetStringHelper, false)
  171. .Bind("architecture"_s, ArchitectureHelper, false)
  172. .Bind("toolset"_s, ToolsetHelper, false)
  173. .Bind("toolchainFile"_s, &ConfigurePreset::ToolchainFile,
  174. cmCMakePresetsGraphInternal::PresetStringHelper, false)
  175. .Bind("binaryDir"_s, &ConfigurePreset::BinaryDir,
  176. cmCMakePresetsGraphInternal::PresetStringHelper, false)
  177. .Bind("installDir"_s, &ConfigurePreset::InstallDir,
  178. cmCMakePresetsGraphInternal::PresetStringHelper, false)
  179. .Bind<std::string>("cmakeExecutable"_s, nullptr,
  180. cmCMakePresetsGraphInternal::PresetStringHelper, false)
  181. .Bind("cacheVariables"_s, &ConfigurePreset::CacheVariables,
  182. VariablesHelper, false)
  183. .Bind("environment"_s, &ConfigurePreset::Environment,
  184. cmCMakePresetsGraphInternal::EnvironmentMapHelper, false)
  185. .Bind("warnings"_s, PresetWarningsHelper, false)
  186. .Bind("errors"_s, PresetErrorsHelper, false)
  187. .Bind("debug"_s, PresetDebugHelper, false)
  188. .Bind("condition"_s, &ConfigurePreset::ConditionEvaluator,
  189. cmCMakePresetsGraphInternal::PresetConditionHelper, false);
  190. }
  191. namespace cmCMakePresetsGraphInternal {
  192. ReadFileResult ConfigurePresetsHelper(std::vector<ConfigurePreset>& out,
  193. const Json::Value* value)
  194. {
  195. static auto const helper =
  196. cmJSONVectorHelper<ConfigurePreset, ReadFileResult>(
  197. ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESETS,
  198. ConfigurePresetHelper);
  199. return helper(out, value);
  200. }
  201. }