14 #include <daw/daw_algorithm.h>
15 #include <daw/iterator/daw_reverse_iterator.h>
21 #include <string_view>
27 std::vector<json_path_node>
31 std::string_view m_name{ };
32 char const *m_value_start =
nullptr;
33 long long m_index = -1;
36 friend std::vector<json_path_node>
38 char const *doc_start );
42 long long Index,
char const *ValueStart )
44 , m_value_start( ValueStart )
55 constexpr std::string_view
name( )
const {
60 constexpr
long long index( )
const {
76 return daw::algorithm::accumulate(
77 path_stack.begin( ), path_stack.end( ), std::string{ },
79 if( sv.index( ) >= 0 ) {
80 state +=
"[" + std::to_string( sv.index( ) ) +
"]";
81 }
else if( not sv.
name( ).empty( ) ) {
82 state +=
"." + static_cast<std::string>( sv.name( ) );
84 return std::forward<decltype( state )>( state );
92 inline std::vector<json_path_node>
94 if( parse_location ==
nullptr or doc_start ==
nullptr ) {
97 if( std::less<>{ }( parse_location, doc_start ) ) {
104 std::vector<json_path_node> parse_stack{ };
108 std::optional<json_path_node> last_popped{ };
112 if( parse_stack.empty( ) ) {
113 return JsonBaseParseTypes::None;
115 return parse_stack.back( ).
type( );
119 if(
auto const range = jp.
value.get_range( );
120 range.empty( ) or last <= range.data( ) ) {
123 if(
auto const t = child_of( ); t == JsonBaseParseTypes::Class ) {
124 state.m_name = *jp.
name;
126 }
else if( t == JsonBaseParseTypes::Array ) {
133 state.m_value_start = jp.
value.get_range( ).first;
134 state.m_type = jp.
value.type( );
135 last_popped = std::nullopt;
139 bool handle_on_array_start(
json_value const & ) {
140 parse_stack.push_back( state );
145 bool handle_on_array_end( ) {
146 if( not parse_stack.empty( ) ) {
147 last_popped = parse_stack.back( );
148 state = parse_stack.back( );
149 parse_stack.pop_back( );
154 bool handle_on_class_start(
json_value const & ) {
155 parse_stack.push_back( state );
160 bool handle_on_class_end( ) {
161 if( not parse_stack.empty( ) ) {
162 last_popped = parse_stack.back( );
163 state = parse_stack.back( );
164 parse_stack.pop_back( );
170 auto sv = std::string_view( );
173 }
catch( json_exception
const & ) {
174 parse_stack.push_back( state );
177 if( sv.data( ) <= last and last <= ( sv.data( ) + sv.size( ) ) ) {
178 parse_stack.push_back( state );
185 auto sv = std::string_view( );
188 }
catch( json_exception
const & ) {
189 parse_stack.push_back( state );
192 if( sv.data( ) <= last and last <= ( sv.data( ) + sv.size( ) ) ) {
193 parse_stack.push_back( state );
200 auto sv = std::string_view( );
203 }
catch( json_exception
const & ) {
204 parse_stack.push_back( state );
207 if( sv.data( ) <= last and last <= ( sv.data( ) + sv.size( ) ) ) {
208 parse_stack.push_back( state );
215 auto sv = std::string_view( );
218 }
catch( json_exception
const & ) {
219 parse_stack.push_back( state );
222 if( sv.data( ) <= last and last <= ( sv.data( ) + sv.size( ) ) ) {
223 parse_stack.push_back( state );
228 } handler{ doc_start, parse_location + 1 };
232 }
catch( json_exception
const & ) {
236 if( handler.last_popped ) {
237 handler.parse_stack.push_back( *handler.last_popped );
239 return std::move( handler.parse_stack );
242 inline std::vector<json_path_node>
248 char const *doc_start ) {
254 char const *doc_start ) {
260 char const *doc_start ) {
262 ErrorReason::UnexpectedEndOfData );
264 ErrorReason::UnexpectedEndOfData );
266 return daw::algorithm::accumulate( doc_start, doc_pos, std::size_t{ },
267 []( std::size_t count,
char c ) {
275 char const *doc_start ) {
280 char const *doc_start ) {
282 ErrorReason::UnexpectedEndOfData );
284 ErrorReason::UnexpectedEndOfData );
286 auto first = daw::reverse_iterator<char const *>( doc_pos );
287 auto last = daw::reverse_iterator<char const *>( doc_start );
289 std::distance( first, daw::algorithm::find( first, last,
'\n' ) );
291 return static_cast<std::size_t
>( pos );
295 char const *doc_start ) {