/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ #include <memory> #include <string> #include <vector> #include <cm3p/json/value.h> #include "cmCMakePresetsGraph.h" #include "cmJSONHelpers.h" #define CHECK_OK(expr) \ do { \ auto _result = expr; \ if (_result != ReadFileResult::READ_OK) \ return _result; \ } while (false) namespace cmCMakePresetsGraphInternal { enum class ExpandMacroResult { Ok, Ignore, Error, }; using MacroExpander = std::function<ExpandMacroResult( const std::string&, const std::string&, std::string&, int version)>; } class cmCMakePresetsGraph::Condition { public: virtual ~Condition() = default; virtual bool Evaluate( const std::vector<cmCMakePresetsGraphInternal::MacroExpander>& expanders, int version, cm::optional<bool>& out) const = 0; virtual bool IsNull() const { return false; } }; namespace cmCMakePresetsGraphInternal { class NullCondition : public cmCMakePresetsGraph::Condition { bool Evaluate(const std::vector<MacroExpander>& /*expanders*/, int /*version*/, cm::optional<bool>& out) const override { out = true; return true; } bool IsNull() const override { return true; } }; class ConstCondition : public cmCMakePresetsGraph::Condition { public: bool Evaluate(const std::vector<MacroExpander>& /*expanders*/, int /*version*/, cm::optional<bool>& out) const override { out = this->Value; return true; } bool Value; }; class EqualsCondition : public cmCMakePresetsGraph::Condition { public: bool Evaluate(const std::vector<MacroExpander>& expanders, int version, cm::optional<bool>& out) const override; std::string Lhs; std::string Rhs; }; class InListCondition : public cmCMakePresetsGraph::Condition { public: bool Evaluate(const std::vector<MacroExpander>& expanders, int version, cm::optional<bool>& out) const override; std::string String; std::vector<std::string> List; }; class MatchesCondition : public cmCMakePresetsGraph::Condition { public: bool Evaluate(const std::vector<MacroExpander>& expanders, int version, cm::optional<bool>& out) const override; std::string String; std::string Regex; }; class AnyAllOfCondition : public cmCMakePresetsGraph::Condition { public: bool Evaluate(const std::vector<MacroExpander>& expanders, int version, cm::optional<bool>& out) const override; std::vector<std::unique_ptr<Condition>> Conditions; bool StopValue; }; class NotCondition : public cmCMakePresetsGraph::Condition { public: bool Evaluate(const std::vector<MacroExpander>& expanders, int version, cm::optional<bool>& out) const override; std::unique_ptr<Condition> SubCondition; }; cmCMakePresetsGraph::ReadFileResult PresetStringHelper( std::string& out, const Json::Value* value); cmCMakePresetsGraph::ReadFileResult PresetVectorStringHelper( std::vector<std::string>& out, const Json::Value* value); cmCMakePresetsGraph::ReadFileResult PresetBoolHelper(bool& out, const Json::Value* value); cmCMakePresetsGraph::ReadFileResult PresetOptionalBoolHelper( cm::optional<bool>& out, const Json::Value* value); cmCMakePresetsGraph::ReadFileResult PresetIntHelper(int& out, const Json::Value* value); cmCMakePresetsGraph::ReadFileResult PresetOptionalIntHelper( cm::optional<int>& out, const Json::Value* value); cmCMakePresetsGraph::ReadFileResult PresetVectorIntHelper( std::vector<int>& out, const Json::Value* value); cmCMakePresetsGraph::ReadFileResult ConfigurePresetsHelper( std::vector<cmCMakePresetsGraph::ConfigurePreset>& out, const Json::Value* value); cmCMakePresetsGraph::ReadFileResult BuildPresetsHelper( std::vector<cmCMakePresetsGraph::BuildPreset>& out, const Json::Value* value); cmCMakePresetsGraph::ReadFileResult TestPresetsHelper( std::vector<cmCMakePresetsGraph::TestPreset>& out, const Json::Value* value); cmJSONHelper<std::nullptr_t, cmCMakePresetsGraph::ReadFileResult> VendorHelper( cmCMakePresetsGraph::ReadFileResult error); cmCMakePresetsGraph::ReadFileResult PresetConditionHelper( std::shared_ptr<cmCMakePresetsGraph::Condition>& out, const Json::Value* value); cmCMakePresetsGraph::ReadFileResult PresetVectorOneOrMoreStringHelper( std::vector<std::string>& out, const Json::Value* value); cmCMakePresetsGraph::ReadFileResult EnvironmentMapHelper( std::map<std::string, cm::optional<std::string>>& out, const Json::Value* value); }