diff --git a/conanfile.py b/conanfile.py index 035553532295..89e9ef22ae6b 100644 --- a/conanfile.py +++ b/conanfile.py @@ -118,7 +118,7 @@ def requirements(self): self.requires('libev/[^4.33]') self.requires('openssl/[>=1.1 <4]') self.requires('rapidjson/[>=cci.20230929 =0.8.0 <=0.9.0]') self.requires('zlib/[^1.3]') self.requires('zstd/[^1.5]') self.requires('icu/[>=74.1 <77]', force=True) diff --git a/universal/src/formats/yaml/value.cpp b/universal/src/formats/yaml/value.cpp index 4b9b5c01c8e6..2b9252c0b4de 100644 --- a/universal/src/formats/yaml/value.cpp +++ b/universal/src/formats/yaml/value.cpp @@ -11,10 +11,6 @@ #include "exttypes.hpp" #include "string_view_support.hpp" -USERVER_NAMESPACE_BEGIN - -namespace formats::yaml { - namespace { // Helper structure for YAML conversions. YAML has built in conversion logic and @@ -32,6 +28,41 @@ struct IsConvertibleChecker { } }; +} // anonymous namespace + +namespace YAML { + +// Reverting harm done by https://github.com/jbeder/yaml-cpp/commit/96f5c887f373ac483844c51cfc9a3621002314f0 +// to detect if the conversion is successful without throwing an exception +template +requires std::integral || std::floating_point +struct as_if > { + explicit as_if(const Node& node_) + : node(node_) + {} + const Node& node; + + T operator()(const IsConvertibleChecker& fallback) const { + if (!node.m_pNode) { + return fallback; + } + + T t; + if (convert::decode(node, t)) { + return t; + } + return fallback; + } +}; + +} // namespace YAML + +USERVER_NAMESPACE_BEGIN + +namespace formats::yaml { + +namespace { + auto MakeMissingNode() { return YAML::Node{}[0]; } // yaml-cpp allows to parse quoted and typed strings into bool and numeric