10#include <unordered_map>
13#include <userver/utils/meta.hpp>
15#include <userver/formats/common/meta.hpp>
17namespace boost::uuids {
21USERVER_NAMESPACE_BEGIN
23namespace utils::impl::strong_typedef {
24struct StrongTypedefTag;
34template <
typename... Types,
typename StringBuilder>
35void WriteToStream(
const std::variant<Types...>& value, StringBuilder& sw) {
36 return std::visit([&sw](
const auto& item) { WriteToStream(item, sw); }, value);
40template <
typename T,
typename StringBuilder>
47 WriteToStream(*value, sw);
55template <
class T,
class StringBuilder>
56constexpr inline bool kIsSerializeAllowedInWriteToStream =
true;
59template <
typename T,
typename StringBuilder>
60void WriteToStreamArray(
const T& value, StringBuilder& sw) {
61 typename StringBuilder::ArrayGuard guard(sw);
62 for (
const auto& item : value) {
64 WriteToStream(
static_cast<
const meta::RangeValueType<T>&>(item), sw);
69template <
typename T,
typename StringBuilder>
70void WriteToStreamDict(
const T& value, StringBuilder& sw) {
71 typename StringBuilder::ObjectGuard guard(sw);
72 for (
const auto& [key, item] : value) {
74 WriteToStream(item, sw);
84template <
typename T,
typename StringBuilder>
87 using Value =
typename StringBuilder::Value;
89 if constexpr (meta::kIsMap<T>) {
90 impl::WriteToStreamDict(value, sw);
91 }
else if constexpr (meta::kIsRange<T>) {
93 !std::is_same_v<T, boost::uuids::uuid>,
94 "Include <userver/formats/serialize/boost_uuid.hpp> to serialize 'boost::uuids::uuid"
97 !meta::kIsRecursiveRange<T>,
98 "Trying to log a recursive range, which can be dangerous. "
99 "(boost::filesystem::path?) Please implement WriteToStream "
102 impl::WriteToStreamArray(value, sw);
103 }
else if constexpr (
common::impl::kHasSerialize<Value, T>) {
105 !
sizeof(T) || impl::kIsSerializeAllowedInWriteToStream<T, StringBuilder>,
106 "SAX serialization falls back to Serialize call, which is not "
107 "allowed. Please implement WriteToStream for your type"
109 sw.WriteValue(Serialize(value,
serialize::
To<Value>{}));
111 static_assert(!
sizeof(T),
"Please implement WriteToStream or Serialize for your type");