32 namespace json_details {
33 template<
typename output_t,
auto... PolicyFlags,
typename WritableType>
34 DAW_ATTRIB_INLINE
constexpr auto apply_policy_flags( WritableType &&it ) {
36 daw::remove_cvref_t<WritableType>> ) {
37 if constexpr(
sizeof...( PolicyFlags ) == 0 ) {
41 json_details::serialization::set_bits(
42 output_t::policy_flags( ),
43 PolicyFlags... )>( it.get( ) );
47 daw::remove_cvref_t<WritableType>,
48 options::output_flags_t<PolicyFlags...>::value>( it );
54 typename JsonClass,
typename Value,
typename WritableType,
55 auto... PolicyFlags DAW_ENABLEIF2( concepts::is_writable_output_type_v<
56 daw::remove_cvref_t<WritableType>> )>
58 concepts::is_writable_output_type_v<daw::remove_cvref_t<WritableType>> )
59 constexpr
daw::rvalue_to_value_t<WritableType> to_json(
60 Value const &value, WritableType &&it,
61 options::output_flags_t<PolicyFlags...> flags ) {
62 if constexpr( json_details::is_char_pointer_v<Value> ) {
65 if( value ==
nullptr ) {
66 return to_json<use_default>(
67 std::optional<daw::string_view>( ), DAW_FWD( it ), flags );
69 return to_json<JsonClass>(
70 daw::string_view( value ), DAW_FWD( it ), flags );
71 }
else if constexpr( json_details::is_char_array_v<Value> ) {
74 return to_json<JsonClass>(
75 daw::string_view( value, std::extent_v<Value> - 1U ),
80 json_details::json_serialize_deduced_type<JsonClass, Value>;
82 using output_t = daw::rvalue_to_value_t<WritableType>;
83 if constexpr( std::is_pointer_v<daw::remove_cvref_t<WritableType>> ) {
87 json_details::apply_policy_flags<output_t, PolicyFlags...>( it );
89 out_it = json_details::member_to_string<json_class_t>( out_it, value );
94 template<
typename JsonClass,
typename Value,
auto... PolicyFlags>
95 DAW_CPP20_CX_ALLOC std::string
97 options::output_flags_t<PolicyFlags...> flgs ) {
99 (void)to_json<JsonClass>( value, out, flgs );
100 return std::move( out ).finish( );
103 namespace json_details {
104 template<
auto... PolicyFlags,
typename WritableType>
105 constexpr auto make_output_iterator( WritableType &&it ) {
106 using output_t = daw::rvalue_to_value_t<WritableType>;
108 if constexpr( std::is_pointer_v<daw::remove_cvref_t<output_t>> ) {
111 if constexpr( is_serialization_policy_v<
112 daw::remove_cvref_t<WritableType>> ) {
113 if constexpr(
sizeof...( PolicyFlags ) == 0 ) {
116 return serialization_policy<
typename output_t::iterator_type,
117 json_details::serialization::set_bits(
118 output_t::policy_flags( ),
119 PolicyFlags... )>( it.get( ) );
122 return serialization_policy<
123 daw::remove_cvref_t<WritableType>,
124 options::output_flags_t<PolicyFlags...>::value>( it );
130 typename JsonElement,
typename Container,
typename WritableType,
131 auto... PolicyFlags DAW_ENABLEIF2( concepts::is_writable_output_type_v<
132 daw::remove_cvref_t<WritableType>> )>
134 concepts::is_writable_output_type_v<daw::remove_cvref_t<WritableType>> )
135 constexpr
daw::rvalue_to_value_t<WritableType> to_json_array(
136 Container const &c, WritableType &&it,
137 options::output_flags_t<PolicyFlags...> flags ) {
138 if constexpr( json_details::is_char_array_v<Container> ) {
140 return to_json_array<JsonElement>(
141 daw::string_view( c, std::extent_v<Container> - 1U ),
144 }
else if constexpr( std::is_array_v<Container> ) {
145 return to_json_array<JsonElement>(
146 daw::span<std::remove_extent_t<Container>
const>(
147 c, std::extent_v<Container> ),
150 }
else if constexpr( std::is_pointer_v<Container> ) {
151 static_assert( daw::deduced_false_v<Container>,
152 "Pointers have no length, pass a span or container" );
155 daw::traits::is_container_like_v<daw::remove_cvref_t<Container>>,
156 "Supplied container must support begin( )/end( )" );
159 json_details::make_output_iterator<PolicyFlags...>( DAW_FWD( it ) );
160 json_details::reserve_array_output<
161 json_details::json_serialize_deduced_type<
162 JsonElement, daw::remove_cvref_t<
decltype( *std::begin( c ) )>>>(
165 out_it.add_indent( );
168 auto first = std::begin( c );
169 auto last = std::end( c );
170 bool const has_elements = first != last;
171 while( first != last ) {
172 (void)[&out_it](
auto &&v ) {
173 using v_type = DAW_TYPEOF( v );
175 json_details::json_serialize_deduced_type<JsonElement, v_type>;
180 missing_json_data_contract_for_or_unknown_type<JsonElement>>,
181 "Unable to detect unnamed mapping" );
183 out_it.next_member( );
185 out_it = json_details::member_to_string<JsonMember>( out_it, v );
189 if( first != last ) {
194 out_it.del_indent( );
196 out_it.output_newline( );
199 return out_it.get( );
203 template<
typename JsonElement,
typename Container,
auto... PolicyFlags>
204 DAW_CPP20_CX_ALLOC std::string
206 options::output_flags_t<PolicyFlags...> flgs ) {
207 static_assert( not std::is_same_v<std::string, JsonElement> );
209 (void)to_json_array<JsonElement>( c, out, flgs );
210 return std::move( out ).finish( );