f7c73494b61552af067230a2cd37a567c72b3f3a
[platform/upstream/cmake.git] / Source / cmCMakePresetsGraphInternal.h
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 <memory>
4 #include <string>
5 #include <vector>
6
7 #include <cm3p/json/value.h>
8
9 #include "cmCMakePresetsGraph.h"
10 #include "cmJSONHelpers.h"
11
12 #define CHECK_OK(expr)                                                        \
13   do {                                                                        \
14     auto _result = expr;                                                      \
15     if (_result != ReadFileResult::READ_OK)                                   \
16       return _result;                                                         \
17   } while (false)
18
19 namespace cmCMakePresetsGraphInternal {
20 enum class ExpandMacroResult
21 {
22   Ok,
23   Ignore,
24   Error,
25 };
26
27 using MacroExpander = std::function<ExpandMacroResult(
28   const std::string&, const std::string&, std::string&, int version)>;
29 }
30
31 class cmCMakePresetsGraph::Condition
32 {
33 public:
34   virtual ~Condition() = default;
35
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; }
40 };
41
42 namespace cmCMakePresetsGraphInternal {
43
44 class NullCondition : public cmCMakePresetsGraph::Condition
45 {
46   bool Evaluate(const std::vector<MacroExpander>& /*expanders*/,
47                 int /*version*/, cm::optional<bool>& out) const override
48   {
49     out = true;
50     return true;
51   }
52
53   bool IsNull() const override { return true; }
54 };
55
56 class ConstCondition : public cmCMakePresetsGraph::Condition
57 {
58 public:
59   bool Evaluate(const std::vector<MacroExpander>& /*expanders*/,
60                 int /*version*/, cm::optional<bool>& out) const override
61   {
62     out = this->Value;
63     return true;
64   }
65
66   bool Value;
67 };
68
69 class EqualsCondition : public cmCMakePresetsGraph::Condition
70 {
71 public:
72   bool Evaluate(const std::vector<MacroExpander>& expanders, int version,
73                 cm::optional<bool>& out) const override;
74
75   std::string Lhs;
76   std::string Rhs;
77 };
78
79 class InListCondition : public cmCMakePresetsGraph::Condition
80 {
81 public:
82   bool Evaluate(const std::vector<MacroExpander>& expanders, int version,
83                 cm::optional<bool>& out) const override;
84
85   std::string String;
86   std::vector<std::string> List;
87 };
88
89 class MatchesCondition : public cmCMakePresetsGraph::Condition
90 {
91 public:
92   bool Evaluate(const std::vector<MacroExpander>& expanders, int version,
93                 cm::optional<bool>& out) const override;
94
95   std::string String;
96   std::string Regex;
97 };
98
99 class AnyAllOfCondition : public cmCMakePresetsGraph::Condition
100 {
101 public:
102   bool Evaluate(const std::vector<MacroExpander>& expanders, int version,
103                 cm::optional<bool>& out) const override;
104
105   std::vector<std::unique_ptr<Condition>> Conditions;
106   bool StopValue;
107 };
108
109 class NotCondition : public cmCMakePresetsGraph::Condition
110 {
111 public:
112   bool Evaluate(const std::vector<MacroExpander>& expanders, int version,
113                 cm::optional<bool>& out) const override;
114
115   std::unique_ptr<Condition> SubCondition;
116 };
117
118 cmCMakePresetsGraph::ReadFileResult PresetStringHelper(
119   std::string& out, const Json::Value* value);
120
121 cmCMakePresetsGraph::ReadFileResult PresetVectorStringHelper(
122   std::vector<std::string>& out, const Json::Value* value);
123
124 cmCMakePresetsGraph::ReadFileResult PresetBoolHelper(bool& out,
125                                                      const Json::Value* value);
126
127 cmCMakePresetsGraph::ReadFileResult PresetOptionalBoolHelper(
128   cm::optional<bool>& out, const Json::Value* value);
129
130 cmCMakePresetsGraph::ReadFileResult PresetIntHelper(int& out,
131                                                     const Json::Value* value);
132
133 cmCMakePresetsGraph::ReadFileResult PresetOptionalIntHelper(
134   cm::optional<int>& out, const Json::Value* value);
135
136 cmCMakePresetsGraph::ReadFileResult PresetVectorIntHelper(
137   std::vector<int>& out, const Json::Value* value);
138
139 cmCMakePresetsGraph::ReadFileResult ConfigurePresetsHelper(
140   std::vector<cmCMakePresetsGraph::ConfigurePreset>& out,
141   const Json::Value* value);
142
143 cmCMakePresetsGraph::ReadFileResult BuildPresetsHelper(
144   std::vector<cmCMakePresetsGraph::BuildPreset>& out,
145   const Json::Value* value);
146
147 cmCMakePresetsGraph::ReadFileResult TestPresetsHelper(
148   std::vector<cmCMakePresetsGraph::TestPreset>& out, const Json::Value* value);
149
150 cmJSONHelper<std::nullptr_t, cmCMakePresetsGraph::ReadFileResult> VendorHelper(
151   cmCMakePresetsGraph::ReadFileResult error);
152
153 cmCMakePresetsGraph::ReadFileResult PresetConditionHelper(
154   std::shared_ptr<cmCMakePresetsGraph::Condition>& out,
155   const Json::Value* value);
156
157 cmCMakePresetsGraph::ReadFileResult PresetVectorOneOrMoreStringHelper(
158   std::vector<std::string>& out, const Json::Value* value);
159
160 cmCMakePresetsGraph::ReadFileResult EnvironmentMapHelper(
161   std::map<std::string, cm::optional<std::string>>& out,
162   const Json::Value* value);
163 }