DAW JSON Link
Loading...
Searching...
No Matches
daw_json_serialize_policy.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 "version.h"
12
18
19#include <daw/daw_move.h>
20
21#include <cstddef>
22#include <iterator>
23#include <memory>
24
25namespace daw::json {
26 inline namespace DAW_JSON_VER {
27 /***
28 * Create the parser options flag for BasicParsePolicy
29 * @tparam Policies Policy types that satisfy the `is_policy_flag` trait.
30 * @param policies A list of parser options to change from the defaults.
31 * @return A json_options_t that encodes the options for the parser
32 */
33 template<typename... Policies>
34 constexpr json_options_t serialize_options( Policies... policies ) {
35 static_assert( json_details::are_option_flags<Policies...>,
36 "Only registered policy types are allowed" );
37 auto result = json_details::serialization::default_policy_flag;
38 if constexpr( sizeof...( Policies ) > 0 ) {
39 result |=
40 ( json_details::serialization::set_bits_for( policies ) | ... );
41 }
42 return result;
43 }
44 namespace json_details {
45 template<typename T>
46 DAW_ATTRIB_INLINE constexpr daw::string_view as_sv( T const &value ) {
47 if constexpr( std::is_same_v<char, DAW_TYPEOF( value )> ) {
48 return daw::string_view( &value, 1 );
49 } else {
50 return daw::string_view( value );
51 }
52 }
53 } // namespace json_details
54
55 template<typename WritableType,
56 json_options_t PolicyFlags =
57 json_details::serialization::default_policy_flag>
59 static_assert(
60 concepts::is_writable_output_type_v<WritableType>,
61 "Output type does not have a writeable_output_trait specialization" );
63 WritableType *m_writable;
64
65 DAW_ATTRIB_INLINE static DAW_CONSTEVAL json_options_t policy_flags( ) {
66 return PolicyFlags;
67 }
68
69 std::size_t indentation_level = 0;
70
71 DAW_ATTRIB_INLINE constexpr WritableType const &get( ) const {
72 return *m_writable;
73 }
74
75 DAW_ATTRIB_INLINE constexpr WritableType &get( ) {
76 return *m_writable;
77 }
78
79 DAW_ATTRIB_INLINE explicit constexpr serialization_policy(
80 WritableType &writable )
81 : m_writable( std::addressof( writable ) ) {}
82
83 static constexpr options::SerializationFormat serialization_format =
84 json_details::serialization::get_bits_for<options::SerializationFormat>(
85 PolicyFlags );
86
87 static constexpr options::IndentationType indentation_type =
88 json_details::serialization::get_bits_for<options::IndentationType>(
89 PolicyFlags );
90
91 static constexpr options::RestrictedStringOutput
92 restricted_string_output = json_details::serialization::get_bits_for<
93 options::RestrictedStringOutput>( PolicyFlags );
94
95 static constexpr options::NewLineDelimiter newline_delimiter =
96 json_details::serialization::get_bits_for<options::NewLineDelimiter>(
97 PolicyFlags );
98
99 static constexpr options::OutputTrailingComma output_trailing_comma =
100 json_details::serialization::get_bits_for<options::OutputTrailingComma>(
101 PolicyFlags );
102
103 DAW_ATTRIB_INLINE constexpr void add_indent( ) {
104 if constexpr( serialization_format !=
105 options::SerializationFormat::Minified ) {
106 ++indentation_level;
107 }
108 }
109
110 DAW_ATTRIB_INLINE constexpr void del_indent( ) {
111 if constexpr( serialization_format !=
112 options::SerializationFormat::Minified ) {
113 --indentation_level;
114 }
115 }
116
117 DAW_ATTRIB_INLINE constexpr void output_indent( ) {
118 if constexpr( serialization_format !=
119 options::SerializationFormat::Minified ) {
120 DAW_CPP23_STATIC_LOCAL constexpr std::string_view indent =
121 json_details::serialization::generate_indent<serialization_format,
122 indentation_type>;
123 if( not indent.empty( ) ) {
124 for( std::size_t n = 0; n < indentation_level; ++n ) {
125 write_output( *m_writable, indent );
126 }
127 }
128 }
129 }
130
131 static constexpr std::string_view newline =
132 newline_delimiter == options::NewLineDelimiter::n ? "\n" : "\r\n";
133
134 DAW_ATTRIB_INLINE constexpr void output_newline( ) {
135 if constexpr( serialization_format !=
136 options::SerializationFormat::Minified ) {
137 write_output( *m_writable, newline );
138 }
139 }
140
141 static constexpr daw::string_view space =
142 serialization_format != options::SerializationFormat::Minified
143 ? " "
144 : nullptr;
145
146 DAW_ATTRIB_INLINE constexpr void next_member( ) {
147 output_newline( );
148 output_indent( );
149 }
150
151 template<typename ContiguousCharRange, typename... ContiguousCharRanges>
152 DAW_ATTRIB_FLATINLINE constexpr void
153 write( ContiguousCharRange const &chr,
154 ContiguousCharRanges const &...chrs ) {
155
156 write_output( *m_writable,
157 json_details::as_sv( chr ),
158 json_details::as_sv( chrs )... );
159 }
160
161 DAW_ATTRIB_INLINE constexpr void copy_buffer( char const *first,
162 char const *last ) {
163 write(
164 daw::string_view( first, static_cast<std::size_t>( last - first ) ) );
165 }
166
167 DAW_ATTRIB_FLATINLINE constexpr void put( char c ) {
168 put_output( *m_writable, c );
169 }
170
171 DAW_ATTRIB_INLINE constexpr serialization_policy &operator=( char c ) {
172 put_output( *m_writable, c );
173 return *this;
174 }
175
176 DAW_ATTRIB_INLINE constexpr serialization_policy &operator*( ) {
177 return *this;
178 }
179
180 DAW_ATTRIB_INLINE constexpr serialization_policy &operator++( ) {
181 return *this;
182 }
183
184 DAW_ATTRIB_INLINE constexpr serialization_policy operator++( int ) & {
185 return *this;
186 }
187 };
188
189 template<typename, typename...>
190 inline constexpr bool is_serialization_policy_v = false;
191
192 template<typename OutputIterator, json_options_t PolicyFlags>
193 inline constexpr bool is_serialization_policy_v<
195 } // namespace DAW_JSON_VER
196} // namespace daw::json
constexpr json_options_t serialize_options(Policies... policies)
constexpr WritableOutput & put_output(WritableOutput &out, CharT c)
constexpr WritableOutput & write_output(WritableOutput &out, StringViews const &...svs)
Customization point traits.
constexpr void write(ContiguousCharRange const &chr, ContiguousCharRanges const &...chrs)
DAW_ATTRIB_INLINE constexpr void copy_buffer(char const *first, char const *last)
#define DAW_JSON_VER
The version string used in namespace definitions. Must be a valid namespace name.
Definition version.h:20