@@ -34,6 +34,17 @@ namespace daw {
3434 namespace json_to_cpp {
3535 bool enable_comments;
3636 bool enable_jsonlink;
37+ struct state_t {
38+ bool has_arrays;
39+ bool has_integrals;
40+ bool has_optionals;
41+ bool has_strings;
42+ state_t ( ):
43+ has_arrays{ false },
44+ has_integrals{ false },
45+ has_optionals{ false },
46+ has_strings{ false } { }
47+ };
3748
3849 void config_t::set_links ( ) {
3950 link_boolean ( " enable_comments" , enable_comments );
@@ -100,13 +111,13 @@ namespace daw {
100111 return " unknown_" + std::to_string ( unknown_count ( ) );
101112 }
102113
103- void parse_json_array ( boost::string_view cur_name, daw::json::impl::value_t const & cur_item, std::vector<obj_info_t > & obj_info );
114+ void parse_json_array ( boost::string_view cur_name, daw::json::impl::value_t const & cur_item, std::vector<obj_info_t > & obj_info, state_t & obj_state );
104115
105116 auto find_by_name ( std::vector<obj_info_t > & obj_info, std::string const & name ) {
106117 return std::find_if ( obj_info.begin ( ), obj_info.end ( ), [&]( auto const & v ) { return v.name == name; } );
107118 }
108119
109- void parse_json_object ( boost::string_view cur_name, daw::json::impl::object_value const & cur_item, std::vector<obj_info_t > & obj_info ) {
120+ void parse_json_object ( boost::string_view cur_name, daw::json::impl::object_value const & cur_item, std::vector<obj_info_t > & obj_info, state_t & obj_state ) {
110121 using daw::json::impl::value_t ;
111122
112123 obj_info_t cur_obj;
@@ -120,12 +131,23 @@ namespace daw {
120131 val_info.type = member.second .type ( );
121132 cur_obj.members [val_info.name ] = val_info;
122133
123- if ( val_info.type == value_t ::value_types::object ) {
124- parse_json_object ( val_info.name , member.second .get_object ( ), obj_info );
125- } else if ( val_info.type == value_t ::value_types::array ) {
126- parse_json_array ( val_info.name , member.second , obj_info );
127- }
128-
134+ switch ( val_info.type ) {
135+ case value_t ::value_types::array:
136+ obj_state.has_arrays = true ;
137+ parse_json_array ( val_info.name , member.second , obj_info, obj_state );
138+ break ;
139+ case value_t ::value_types::object:
140+ parse_json_object ( val_info.name , member.second .get_object ( ), obj_info, obj_state );
141+ break ;
142+ case value_t ::value_types::integral:
143+ obj_state.has_integrals = true ;
144+ break ;
145+ case value_t ::value_types::string:
146+ obj_state.has_strings = true ;
147+ break ;
148+ default :
149+ break ;
150+ }
129151 }
130152
131153 auto old_item = find_by_name ( obj_info, cur_obj.name );
@@ -138,7 +160,7 @@ namespace daw {
138160 }
139161 }
140162
141- void parse_json_array ( boost::string_view cur_name, daw::json::impl::value_t const & cur_item, std::vector<obj_info_t > & obj_info ) {
163+ void parse_json_array ( boost::string_view cur_name, daw::json::impl::value_t const & cur_item, std::vector<obj_info_t > & obj_info, state_t & obj_state ) {
142164 using daw::json::impl::value_t ;
143165 obj_info_t cur_obj;
144166 cur_obj.is_array = true ;
@@ -150,15 +172,29 @@ namespace daw {
150172 val_info.name = " element_" + cur_obj.name ;
151173 auto const & arry = cur_item.get_array ( );
152174 val_info.type = arry.front ( ).type ( );
153- if ( val_info.type == value_t ::value_types::array ) {
154- for ( auto const & item: arry ) {
155- parse_json_array ( val_info.name , item, obj_info );
156- }
157- } else if ( val_info.type == value_t ::value_types::object ) {
158- for ( auto const & item: arry ) {
159- parse_json_object ( val_info.name , item.get_object ( ), obj_info );
175+ switch ( val_info.type ) {
176+ case value_t ::value_types::array: {
177+ obj_state.has_arrays = true ;
178+ for ( auto const & item: arry ) {
179+ parse_json_array ( val_info.name , item, obj_info, obj_state );
180+ }
160181 }
182+ break ;
183+ case value_t ::value_types::object:
184+ for ( auto const & item: arry ) {
185+ parse_json_object ( val_info.name , item.get_object ( ), obj_info, obj_state );
186+ }
187+ break ;
188+ case value_t ::value_types::integral:
189+ obj_state.has_integrals = true ;
190+ break ;
191+ case value_t ::value_types::string:
192+ obj_state.has_strings = true ;
193+ break ;
194+ default :
195+ break ;
161196 }
197+
162198 cur_obj.members [val_info.name ] = val_info;
163199
164200 auto old_item = find_by_name ( obj_info, cur_obj.name );
@@ -171,12 +207,13 @@ namespace daw {
171207 }
172208 }
173209
174- std::vector<obj_info_t > parse_json_object ( daw::json::impl::value_t const & json_obj ) {
210+ std::vector<obj_info_t > parse_json_object ( daw::json::impl::value_t const & json_obj, state_t & obj_state ) {
175211 std::vector<obj_info_t > result;
212+
176213 if ( json_obj.type ( ) == daw::json::impl::value_t ::value_types::object ) {
177- parse_json_object ( " root_type" , json_obj.get_object ( ), result );
214+ parse_json_object ( " root_type" , json_obj.get_object ( ), result, obj_state );
178215 } else if ( json_obj.type ( ) == daw::json::impl::value_t ::value_types::array ) {
179- parse_json_array ( " root_type" , json_obj, result );
216+ parse_json_array ( " root_type" , json_obj, result, obj_state );
180217 } else {
181218 std::cerr << " Root object must either be an array or object and not a bare json value(e.g. integer, real, boolean...)" ;
182219 exit ( EXIT_FAILURE );
@@ -305,9 +342,20 @@ namespace daw {
305342 }
306343 }
307344
308- std::string generate_code ( std::vector<obj_info_t > obj_info, config_t const & config ) {
345+ void generate_includes ( std::stringstream & ss, config_t const & config, state_t const & obj_state ) {
346+ if ( obj_state.has_optionals ) ss << " #include <boost/optional.hpp>\n " ;
347+ if ( obj_state.has_integrals ) ss << " #include <cstdint>\n " ;
348+ if ( obj_state.has_strings ) ss << " #include <string>\n " ;
349+ if ( obj_state.has_arrays ) ss << " #include <vector>\n " ;
350+ if ( config.enable_jsonlink ) ss << " #include <daw/json/daw_json_link.h>\n " ;
351+ ss << ' \n ' ;
352+ }
353+
354+ std::string generate_code ( std::vector<obj_info_t > obj_info, config_t const & config, state_t const & obj_state ) {
309355 using daw::json::impl::value_t ;
310356 std::stringstream ss;
357+ ss << " // Code auto generated from json file.\n " ;
358+ generate_includes ( ss, config, obj_state );
311359 for ( auto const & cur_obj: obj_info ) {
312360 auto const obj_type = cur_obj.name + " _t" ;
313361
@@ -343,9 +391,17 @@ namespace daw {
343391 if ( config.enable_comments ) {
344392 ss << " \t // " << obj_type;
345393 }
346- ss << " \n\n " ;
347- if ( config.enable_jsonlink ) {
348- generate_jsonlink ( true , ss, obj_type, cur_obj );
394+ ss << " \n " ;
395+ }
396+ for ( auto const & cur_obj: obj_info ) {
397+ auto const obj_type = cur_obj.name + " _t" ;
398+ for ( auto const & item: cur_obj.members ) {
399+ auto const & member = item.second ;
400+ auto const member_type = type_to_string ( member.name , member.type );
401+ if ( config.enable_jsonlink ) {
402+ generate_jsonlink ( true , ss, obj_type, cur_obj );
403+ }
404+ ss << ' \n ' ;
349405 }
350406 }
351407 return ss.str ( );
@@ -354,9 +410,10 @@ namespace daw {
354410 } // namespace anonymous
355411
356412 std::string generate_cpp ( boost::string_view json_string, config_t const & config ) {
413+ state_t obj_state;
357414 auto json_obj = daw::json::parse_json ( json_string );
358- auto obj_info = parse_json_object ( json_obj );
359- std::string result = generate_code ( obj_info, config );
415+ auto obj_info = parse_json_object ( json_obj, obj_state );
416+ std::string result = generate_code ( obj_info, config, obj_state );
360417
361418 return result;
362419
0 commit comments