DAW JSON Link
daw_to_json.h
Go to the documentation of this file.
1// Copyright (c) Darrell Wright
2//
3// Distributed under the Boost Software License, version 1.0. (see accompanying
4// file LICENSE or copy at http://www.boost.org/LICENSE_1_0.txt)
5//
6// Official repository: https://github.com/beached/daw_json_link
7//
8
9#pragma once
10
11#include "daw_to_json_fwd.h"
14#include "impl/version.h"
15
16#include <daw/daw_traits.h>
17
18#include <iterator>
19#include <string>
20#include <string_view>
21#include <type_traits>
22
23namespace daw::json {
24 inline namespace DAW_JSON_VER {
25 template<typename Value, typename JsonClass, typename OutputIterator>
26 [[maybe_unused]] constexpr OutputIterator to_json( Value const &value,
27 OutputIterator out_it ) {
28 if constexpr( std::is_pointer<OutputIterator>::value ) {
29 daw_json_assert( out_it, ErrorReason::NullOutputIterator );
30 }
32 auto state = json_details::member_to_string( template_arg<JsonClass>,
33 out_it, value );
34 } else {
36 template_arg<JsonClass>,
38 .get( );
39 }
40 return out_it;
41 }
42
43 template<typename Result, typename Value, typename JsonClass,
44 typename SerializationPolicy>
45 [[maybe_unused, nodiscard]] constexpr Result to_json( Value const &value ) {
46 Result result{ };
47 if constexpr( std::is_same_v<Result, std::string> ) {
48 result.reserve( 4096 );
49 }
50
51 using iter_t = std::back_insert_iterator<Result>;
52 using policy = std::conditional_t<
53 std::is_same_v<SerializationPolicy, use_default_serialization_policy>,
54 serialization_policy<iter_t>, SerializationPolicy>;
55
56 (void)json_details::member_to_string( template_arg<JsonClass>,
57 policy( iter_t( result ) ), value );
58 if constexpr( std::is_same_v<Result, std::string> ) {
59 result.shrink_to_fit( );
60 }
61 return result;
62 }
63
64 template<typename JsonElement, typename Container, typename OutputIterator>
65 [[maybe_unused]] constexpr OutputIterator
66 to_json_array( Container const &c, OutputIterator it ) {
67 static_assert(
68 traits::is_container_like_v<daw::remove_cvref_t<Container>>,
69 "Supplied container must support begin( )/end( )" );
70 using iter_t =
71 std::conditional_t<is_serialization_policy<OutputIterator>::value,
72 OutputIterator,
74
75 auto out_it = iter_t( it );
76 if constexpr( std::is_pointer<OutputIterator>::value ) {
77 daw_json_assert( out_it, ErrorReason::NullOutputIterator );
78 }
79 *out_it++ = '[';
80 out_it.add_indent( );
81 // Not const & as some types(vector<bool>::const_reference are not ref
82 // types
83 auto first = std::begin( c );
84 auto last = std::end( c );
85 bool const has_elements = first != last;
86 while( first != last ) {
87 auto const &v = *first;
88 using v_type = DAW_TYPEOF( v );
89 constexpr bool is_auto_detect_v =
90 std::is_same<JsonElement,
91 json_details::auto_detect_array_element>::value;
92 using JsonMember =
93 std::conditional_t<is_auto_detect_v,
94 json_details::json_deduced_type<v_type>,
95 JsonElement>;
96
97 static_assert(
98 not std::is_same_v<JsonMember,
100 "Unable to detect unnamed mapping" );
101 // static_assert( not std::is_same_v<JsonElement, JsonMember> );
102 out_it.next_member( );
103
104 out_it =
105 json_details::member_to_string( template_arg<JsonMember>, out_it, v );
106 ++first;
107 if( first != last ) {
108 *out_it++ = ',';
109 }
110 }
111 // The last character will be a ',' prior to this
112 out_it.del_indent( );
113 if( has_elements ) {
114 out_it.output_newline( );
115 }
116 *out_it++ = ']';
117 return out_it.get( );
118 }
119
120 template<typename Result, typename JsonElement,
121 typename SerializationPolicy, typename Container>
122 [[maybe_unused, nodiscard]] constexpr Result
123 to_json_array( Container &&c ) {
124 static_assert(
125 traits::is_container_like_v<daw::remove_cvref_t<Container>>,
126 "Supplied container must support begin( )/end( )" );
127 using iter_t = json_details::basic_appender<Result>;
128 using policy = std::conditional_t<
129 std::is_same_v<SerializationPolicy, use_default_serialization_policy>,
130 serialization_policy<iter_t>, SerializationPolicy>;
131 Result result{ };
132 auto out_it = policy( iter_t( result ) );
133
134 to_json_array<JsonElement>( c, out_it );
135 return result;
136 }
137 } // namespace DAW_JSON_VER
138} // namespace daw::json
#define daw_json_assert(Bool,...)
Definition: daw_json_assert.h:179
Iterator & it
Definition: daw_json_traits.h:251
constexpr OutputIterator member_to_string(template_param< JsonMember >, OutputIterator it, T const &value)
Definition: to_daw_json_string.h:1340
constexpr OutputIterator to_json(Value const &value, OutputIterator out_it)
Definition: daw_to_json.h:26
constexpr OutputIterator to_json_array(Container const &c, OutputIterator it)
Definition: daw_to_json.h:66
Definition: daw_from_json.h:22
Definition: daw_json_serialize_policy.h:118
Definition: daw_json_traits.h:119
Definition: daw_json_serialize_policy.h:47
#define DAW_JSON_VER
The version string used in namespace definitions. Must be a valid namespace name.
Definition: version.h:16