#include "feature.h" #include namespace NYql { namespace { template std::expected GetAvailability( TLangVersion current, EBackportCompatibleFeaturesMode mode, const TFeature& feature) { if (auto v = feature.MinLangVer; !IsBackwardCompatibleFeatureAvailable(current, v, mode)) { if constexpr (std::is_same_v) { return std::unexpected( TStringBuilder() << feature.Description << " is not available before language version " << NYql::FormatLangVersion(v)); } else if constexpr (std::is_same_v) { return std::unexpected(std::monostate()); } else { static_assert(false, "Bad TError"); } } if (auto v = feature.MaxLangVer; !IsAvailableLangVersion(current, v)) { if constexpr (std::is_same_v) { return std::unexpected( TStringBuilder() << feature.Description << " is not available after language version " << NYql::FormatLangVersion(v)); } else if constexpr (std::is_same_v) { return std::unexpected(std::monostate()); } else { static_assert(false, "Bad TError"); } } return std::monostate(); } } // namespace bool IsAvailableOn( TLangVersion current, EBackportCompatibleFeaturesMode mode, const TFeature& feature) { return GetAvailability(current, mode, feature).has_value(); } std::expected EnsureIsAvailableOn( TLangVersion current, EBackportCompatibleFeaturesMode mode, const TFeature& feature) { return GetAvailability(current, mode, feature); } } // namespace NYql