@@ -79,6 +79,16 @@ operator<<(std::ostream& os, LogParameter<T> const& param);
79
79
80
80
namespace beast {
81
81
82
+ // Forward declaration for use in interfaces
83
+ namespace detail {
84
+ class SimpleJsonWriter ;
85
+ }
86
+
87
+ // Type alias for journal attribute factory functions
88
+ using JournalAttributesFactory = void (detail::SimpleJsonWriter&);
89
+
90
+ namespace detail {
91
+
82
92
class SimpleJsonWriter
83
93
{
84
94
public:
@@ -125,6 +135,16 @@ class SimpleJsonWriter
125
135
stream_.append (" \" ," sv);
126
136
}
127
137
std::string_view
138
+ writeInt (std::int8_t val) const
139
+ {
140
+ return pushNumber (val, stream_);
141
+ }
142
+ std::string_view
143
+ writeInt (std::int16_t val) const
144
+ {
145
+ return pushNumber (val, stream_);
146
+ }
147
+ std::string_view
128
148
writeInt (std::int32_t val) const
129
149
{
130
150
return pushNumber (val, stream_);
@@ -135,6 +155,21 @@ class SimpleJsonWriter
135
155
return pushNumber (val, stream_);
136
156
}
137
157
std::string_view
158
+ writeUInt (std::size_t val) const
159
+ {
160
+ return pushNumber (val, stream_);
161
+ }
162
+ std::string_view
163
+ writeUInt (std::uint8_t val) const
164
+ {
165
+ return pushNumber (val, stream_);
166
+ }
167
+ std::string_view
168
+ writeUInt (std::uint16_t val) const
169
+ {
170
+ return pushNumber (val, stream_);
171
+ }
172
+ std::string_view
138
173
writeUInt (std::uint32_t val) const
139
174
{
140
175
return pushNumber (val, stream_);
@@ -259,6 +294,8 @@ class SimpleJsonWriter
259
294
std::string& stream_;
260
295
};
261
296
297
+ } // namespace detail
298
+
262
299
/* * A namespace for easy access to logging severity values. */
263
300
namespace severities {
264
301
/* * Severity level / threshold of a Journal message. */
@@ -312,15 +349,15 @@ class Journal
312
349
class JsonLogContext
313
350
{
314
351
std::string buffer_;
315
- SimpleJsonWriter messageParamsWriter_;
352
+ detail:: SimpleJsonWriter messageParamsWriter_;
316
353
317
354
public:
318
355
JsonLogContext () : messageParamsWriter_(buffer_)
319
356
{
320
357
buffer_.reserve (1024 * 5 );
321
358
}
322
359
323
- SimpleJsonWriter&
360
+ detail:: SimpleJsonWriter&
324
361
writer ()
325
362
{
326
363
return messageParamsWriter_;
@@ -596,7 +633,7 @@ class Journal
596
633
: m_name(other.m_name), m_sink(other.m_sink)
597
634
{
598
635
std::string stream{other.m_attributesJson };
599
- SimpleJsonWriter writer{stream};
636
+ detail:: SimpleJsonWriter writer{stream};
600
637
if (other.m_attributesJson .empty ())
601
638
{
602
639
writer.startObject ();
@@ -620,7 +657,7 @@ class Journal
620
657
: m_name(name), m_sink(&sink)
621
658
{
622
659
std::string stream;
623
- SimpleJsonWriter writer{stream};
660
+ detail:: SimpleJsonWriter writer{stream};
624
661
writer.startObject ();
625
662
attributesFactory (writer);
626
663
m_attributesJson = std::move (stream);
@@ -741,7 +778,7 @@ class Journal
741
778
742
779
auto isEmpty = globalLogAttributesJson_.empty ();
743
780
std::string stream{std::move (globalLogAttributesJson_)};
744
- SimpleJsonWriter writer{stream};
781
+ detail:: SimpleJsonWriter writer{stream};
745
782
if (isEmpty)
746
783
{
747
784
writer.startObject ();
@@ -860,7 +897,7 @@ namespace ripple::log {
860
897
namespace detail {
861
898
862
899
template <typename T>
863
- concept CanToChars = requires (T val) {
900
+ concept ToCharsFormattable = requires (T val) {
864
901
{
865
902
to_chars (std::declval<char *>(), std::declval<char *>(), val)
866
903
} -> std::convertible_to<std::to_chars_result>;
@@ -869,14 +906,22 @@ concept CanToChars = requires(T val) {
869
906
template <typename T>
870
907
void
871
908
setJsonValue (
872
- beast::SimpleJsonWriter& writer,
909
+ beast::detail:: SimpleJsonWriter& writer,
873
910
char const * name,
874
911
T&& value,
875
912
std::ostream* outStream)
876
913
{
877
914
using ValueType = std::decay_t <T>;
878
915
writer.writeKey (name);
879
- if constexpr (std::is_integral_v<ValueType>)
916
+ if constexpr (std::is_same_v<ValueType, bool >)
917
+ {
918
+ auto sv = writer.writeBool (value);
919
+ if (outStream)
920
+ {
921
+ outStream->write (sv.data (), sv.size ());
922
+ }
923
+ }
924
+ else if constexpr (std::is_integral_v<ValueType>)
880
925
{
881
926
std::string_view sv;
882
927
if constexpr (std::is_signed_v<ValueType>)
@@ -901,14 +946,6 @@ setJsonValue(
901
946
outStream->write (sv.data (), sv.size ());
902
947
}
903
948
}
904
- else if constexpr (std::is_same_v<ValueType, bool >)
905
- {
906
- auto sv = writer.writeBool (value);
907
- if (outStream)
908
- {
909
- outStream->write (sv.data (), sv.size ());
910
- }
911
- }
912
949
else if constexpr (
913
950
std::is_same_v<ValueType, char const *> ||
914
951
std::is_same_v<ValueType, char *>)
@@ -929,15 +966,14 @@ setJsonValue(
929
966
}
930
967
else
931
968
{
932
- if constexpr (CanToChars <ValueType>)
969
+ if constexpr (ToCharsFormattable <ValueType>)
933
970
{
934
971
char buffer[1024 ];
935
972
std::to_chars_result result =
936
973
to_chars (std::begin (buffer), std::end (buffer), value);
937
974
if (result.ec == std::errc{})
938
975
{
939
- std::string_view sv;
940
- sv = {std::begin (buffer), result.ptr };
976
+ std::string_view sv{std::begin (buffer), result.ptr };
941
977
writer.writeString (sv);
942
978
if (outStream)
943
979
{
@@ -1010,7 +1046,7 @@ template <typename... Pair>
1010
1046
[[nodiscard]] auto
1011
1047
attributes (Pair&&... pairs)
1012
1048
{
1013
- return [&](beast::SimpleJsonWriter& writer) {
1049
+ return [&](beast::detail:: SimpleJsonWriter& writer) {
1014
1050
(detail::setJsonValue (writer, pairs.first , pairs.second , nullptr ), ...);
1015
1051
};
1016
1052
}
0 commit comments