97 return daw::algorithm::accumulate(
98 std::data( path_stack ),
99 daw::data_end( path_stack ),
103 if( sv.index( ) >= 0 ) {
105 state += std::to_string( sv.index( ) );
107 }
else if( not sv.name( ).empty( ) ) {
109 state += std::string( sv.name( ) );
111 return DAW_FWD( state );
121 char const *doc_start ) {
122 if( parse_location ==
nullptr or doc_start ==
nullptr ) {
125 if( json_details::less{ }( parse_location, doc_start ) ) {
132 std::vector<json_path_node> parse_stack{ };
136 std::optional<json_path_node> last_popped{ };
140 if( parse_stack.empty( ) ) {
141 return JsonBaseParseTypes::None;
143 return parse_stack.back( ).
type( );
146 [[nodiscard]]
bool handle_on_value(
json_pair jp ) {
147 if(
auto const range = jp.
value.get_raw_state( );
148 range.empty( ) or last <= std::data( range ) ) {
151 if(
auto const t = child_of( ); t == JsonBaseParseTypes::Class ) {
152 state.m_name = *jp.
name;
154 }
else if( t == JsonBaseParseTypes::Array ) {
161 state.m_value_start = jp.
value.get_raw_state( ).first;
162 state.m_type = jp.
value.type( );
163 last_popped = std::nullopt;
167 [[nodiscard]]
bool handle_on_array_start(
json_value const & ) {
168 parse_stack.push_back( state );
173 [[nodiscard]]
bool handle_on_array_end( ) {
174 if( not parse_stack.empty( ) ) {
175 last_popped = parse_stack.back( );
176 state = parse_stack.back( );
177 parse_stack.pop_back( );
182 [[nodiscard]]
bool handle_on_class_start(
json_value const & ) {
183 parse_stack.push_back( state );
188 [[nodiscard]]
bool handle_on_class_end( ) {
189 if( not parse_stack.empty( ) ) {
190 last_popped = parse_stack.back( );
191 state = parse_stack.back( );
192 parse_stack.pop_back( );
197 [[nodiscard]]
bool handle_on_number(
json_value jv ) {
198 auto sv = std::string_view( );
199#if defined( DAW_USE_EXCEPTIONS )
203#if defined( DAW_USE_EXCEPTIONS )
204 }
catch( json_exception
const & ) {
205 parse_stack.push_back( state );
209 if( std::data( sv ) <= last and last <= daw::data_end( sv ) ) {
210 parse_stack.push_back( state );
216 [[nodiscard]]
bool handle_on_bool(
json_value jv ) {
217 auto sv = std::string_view( );
218#if defined( DAW_USE_EXCEPTIONS )
222#if defined( DAW_USE_EXCEPTIONS )
223 }
catch( json_exception
const & ) {
224 parse_stack.push_back( state );
228 if( std::data( sv ) <= last and last <= daw::data_end( sv ) ) {
229 parse_stack.push_back( state );
235 [[nodiscard]]
bool handle_on_string(
json_value jv ) {
236 auto sv = std::string_view( );
237#if defined( DAW_USE_EXCEPTIONS )
241#if defined( DAW_USE_EXCEPTIONS )
242 }
catch( json_exception
const & ) {
243 parse_stack.push_back( state );
247 if( std::data( sv ) <= last and last <= daw::data_end( sv ) ) {
248 parse_stack.push_back( state );
254 [[nodiscard]]
bool handle_on_null(
json_value jv ) {
255 auto sv = std::string_view( );
256#if defined( DAW_USE_EXCEPTIONS )
260#if defined( DAW_USE_EXCEPTIONS )
261 }
catch( json_exception
const & ) {
262 parse_stack.push_back( state );
266 if( std::data( sv ) <= last and last <= daw::data_end( sv ) ) {
267 parse_stack.push_back( state );
272 } handler{ doc_start, parse_location + 1 };
274#if defined( DAW_USE_EXCEPTIONS )
278#if defined( DAW_USE_EXCEPTIONS )
279 }
catch( json_exception
const & ) {
284 if( handler.last_popped ) {
285 handler.parse_stack.push_back( *handler.last_popped );
287 return std::move( handler.parse_stack );
335 ErrorReason::UnexpectedEndOfData );
337 ErrorReason::UnexpectedEndOfData );
339 auto const first = daw::reverse_iterator<char const *>( doc_pos );
340 auto const last = daw::reverse_iterator<char const *>( doc_start );
341 auto const pos = daw::algorithm::find( first, last,
'\n' ) - first;
343 return static_cast<std::size_t
>( pos );