Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion conanfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ def requirements(self):
self.requires('libev/[^4.33]')
self.requires('openssl/[>=1.1 <4]')
self.requires('rapidjson/[>=cci.20230929 <cci.20230930]', transitive_headers=True)
self.requires('yaml-cpp/[^0.8.0]')
self.requires('yaml-cpp/[>=0.8.0 <=0.9.0]')
self.requires('zlib/[^1.3]')
self.requires('zstd/[^1.5]')
self.requires('icu/[>=74.1 <77]', force=True)
Expand Down
39 changes: 35 additions & 4 deletions universal/src/formats/yaml/value.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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 <typename T>
requires std::integral<T> || std::floating_point<T>
struct as_if<T, IsConvertibleChecker<T> > {
explicit as_if(const Node& node_)
: node(node_)
{}
const Node& node;

T operator()(const IsConvertibleChecker<T>& fallback) const {
if (!node.m_pNode) {
return fallback;
}

T t;
if (convert<T>::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
Expand Down
Loading