Generate inline parsing code for all fields of a data type
| 242 | |
| 243 | // Generate inline parsing code for all fields of a data type |
| 244 | static void generate_object_fields_parse(std::stringstream& ss, |
| 245 | const std::string& data_type, |
| 246 | const std::string& result_var, |
| 247 | const std::string& meta_var, |
| 248 | const std::string& src_var, |
| 249 | const std::string& len_var, |
| 250 | const std::string& ok_var, |
| 251 | const std::string& indent, |
| 252 | int depth) { |
| 253 | auto* fields = DataTypeRegistry::instance().lookup(data_type); |
| 254 | if (!fields) return; |
| 255 | |
| 256 | std::string fp = "_fp" + std::to_string(depth); |
| 257 | |
| 258 | for (uint32_t i = 0; i < fields->size(); i++) { |
| 259 | const auto& field = (*fields)[i]; |
| 260 | ss << indent << "if (uint32_t " << fp << " = __coi_json::find_key(" << src_var << ", " << len_var << ", \"" |
| 261 | << field.name << "\", " << field.name.length() << ")) {\n"; |
| 262 | ss << indent << " " << fp << " = __coi_json::skip_ws(" << src_var << ", " << fp << ", " << len_var << ");\n"; |
| 263 | |
| 264 | if (is_array_type(field.type)) { |
| 265 | generate_array_field_parse(ss, get_array_element_type(field.type), field.name, i, |
| 266 | result_var, meta_var, src_var, fp, len_var, indent + " ", depth); |
| 267 | } else if (!field.type.empty() && std::isupper(field.type[0]) && |
| 268 | DataTypeRegistry::instance().lookup(field.type)) { |
| 269 | generate_nested_field_parse(ss, field.type, field.name, i, |
| 270 | result_var, meta_var, src_var, fp, len_var, indent + " ", depth); |
| 271 | } else { |
| 272 | generate_primitive_field_parse(ss, field.type, field.name, i, |
| 273 | result_var, meta_var, src_var, fp, len_var, ok_var, indent + " "); |
| 274 | } |
| 275 | |
| 276 | ss << indent << "}\n"; |
| 277 | } |
| 278 | } |
| 279 | |
| 280 | // Generate JSON parse code for root-level arrays (e.g., Json.parse(User[], ...)) |
| 281 | static std::string generate_json_parse_array( |
no test coverage detected