1 /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
2 file Copyright.txt or https://cmake.org/licensing for details. */
7 #include <cm3p/json/value.h>
9 #include "cmCMakePresetsGraph.h"
10 #include "cmJSONHelpers.h"
12 #define CHECK_OK(expr) \
14 auto _result = expr; \
15 if (_result != ReadFileResult::READ_OK) \
19 namespace cmCMakePresetsGraphInternal {
20 enum class ExpandMacroResult
27 using MacroExpander = std::function<ExpandMacroResult(
28 const std::string&, const std::string&, std::string&, int version)>;
31 class cmCMakePresetsGraph::Condition
34 virtual ~Condition() = default;
36 virtual bool Evaluate(
37 const std::vector<cmCMakePresetsGraphInternal::MacroExpander>& expanders,
38 int version, cm::optional<bool>& out) const = 0;
39 virtual bool IsNull() const { return false; }
42 namespace cmCMakePresetsGraphInternal {
44 class NullCondition : public cmCMakePresetsGraph::Condition
46 bool Evaluate(const std::vector<MacroExpander>& /*expanders*/,
47 int /*version*/, cm::optional<bool>& out) const override
53 bool IsNull() const override { return true; }
56 class ConstCondition : public cmCMakePresetsGraph::Condition
59 bool Evaluate(const std::vector<MacroExpander>& /*expanders*/,
60 int /*version*/, cm::optional<bool>& out) const override
69 class EqualsCondition : public cmCMakePresetsGraph::Condition
72 bool Evaluate(const std::vector<MacroExpander>& expanders, int version,
73 cm::optional<bool>& out) const override;
79 class InListCondition : public cmCMakePresetsGraph::Condition
82 bool Evaluate(const std::vector<MacroExpander>& expanders, int version,
83 cm::optional<bool>& out) const override;
86 std::vector<std::string> List;
89 class MatchesCondition : public cmCMakePresetsGraph::Condition
92 bool Evaluate(const std::vector<MacroExpander>& expanders, int version,
93 cm::optional<bool>& out) const override;
99 class AnyAllOfCondition : public cmCMakePresetsGraph::Condition
102 bool Evaluate(const std::vector<MacroExpander>& expanders, int version,
103 cm::optional<bool>& out) const override;
105 std::vector<std::unique_ptr<Condition>> Conditions;
109 class NotCondition : public cmCMakePresetsGraph::Condition
112 bool Evaluate(const std::vector<MacroExpander>& expanders, int version,
113 cm::optional<bool>& out) const override;
115 std::unique_ptr<Condition> SubCondition;
118 cmCMakePresetsGraph::ReadFileResult PresetStringHelper(
119 std::string& out, const Json::Value* value);
121 cmCMakePresetsGraph::ReadFileResult PresetVectorStringHelper(
122 std::vector<std::string>& out, const Json::Value* value);
124 cmCMakePresetsGraph::ReadFileResult PresetBoolHelper(bool& out,
125 const Json::Value* value);
127 cmCMakePresetsGraph::ReadFileResult PresetOptionalBoolHelper(
128 cm::optional<bool>& out, const Json::Value* value);
130 cmCMakePresetsGraph::ReadFileResult PresetIntHelper(int& out,
131 const Json::Value* value);
133 cmCMakePresetsGraph::ReadFileResult PresetOptionalIntHelper(
134 cm::optional<int>& out, const Json::Value* value);
136 cmCMakePresetsGraph::ReadFileResult PresetVectorIntHelper(
137 std::vector<int>& out, const Json::Value* value);
139 cmCMakePresetsGraph::ReadFileResult ConfigurePresetsHelper(
140 std::vector<cmCMakePresetsGraph::ConfigurePreset>& out,
141 const Json::Value* value);
143 cmCMakePresetsGraph::ReadFileResult BuildPresetsHelper(
144 std::vector<cmCMakePresetsGraph::BuildPreset>& out,
145 const Json::Value* value);
147 cmCMakePresetsGraph::ReadFileResult TestPresetsHelper(
148 std::vector<cmCMakePresetsGraph::TestPreset>& out, const Json::Value* value);
150 cmJSONHelper<std::nullptr_t, cmCMakePresetsGraph::ReadFileResult> VendorHelper(
151 cmCMakePresetsGraph::ReadFileResult error);
153 cmCMakePresetsGraph::ReadFileResult PresetConditionHelper(
154 std::shared_ptr<cmCMakePresetsGraph::Condition>& out,
155 const Json::Value* value);
157 cmCMakePresetsGraph::ReadFileResult PresetVectorOneOrMoreStringHelper(
158 std::vector<std::string>& out, const Json::Value* value);
160 cmCMakePresetsGraph::ReadFileResult EnvironmentMapHelper(
161 std::map<std::string, cm::optional<std::string>>& out,
162 const Json::Value* value);