| 317 | } |
| 318 | |
| 319 | Payload processRequest(dap::json::Deserializer* d, dap::integer sequence) { |
| 320 | dap::string command; |
| 321 | if (!d->field("command", &command)) { |
| 322 | handlers.error("Request missing string 'command' field"); |
| 323 | return {}; |
| 324 | } |
| 325 | |
| 326 | const dap::TypeInfo* typeinfo; |
| 327 | GenericRequestHandler handler; |
| 328 | std::tie(typeinfo, handler) = handlers.request(command); |
| 329 | if (!typeinfo) { |
| 330 | handlers.error("No request handler registered for command '%s'", |
| 331 | command.c_str()); |
| 332 | return {}; |
| 333 | } |
| 334 | |
| 335 | auto data = new uint8_t[typeinfo->size()]; |
| 336 | typeinfo->construct(data); |
| 337 | |
| 338 | if (!d->field("arguments", [&](dap::Deserializer* d) { |
| 339 | return typeinfo->deserialize(d, data); |
| 340 | })) { |
| 341 | handlers.error("Failed to deserialize request"); |
| 342 | typeinfo->destruct(data); |
| 343 | delete[] data; |
| 344 | return {}; |
| 345 | } |
| 346 | |
| 347 | return [=] { |
| 348 | handler( |
| 349 | data, |
| 350 | [=](const dap::TypeInfo* typeinfo, const void* data) { |
| 351 | // onSuccess |
| 352 | dap::json::Serializer s; |
| 353 | s.object([&](dap::FieldSerializer* fs) { |
| 354 | return fs->field("seq", dap::integer(nextSeq++)) && |
| 355 | fs->field("type", "response") && |
| 356 | fs->field("request_seq", sequence) && |
| 357 | fs->field("success", dap::boolean(true)) && |
| 358 | fs->field("command", command) && |
| 359 | fs->field("body", [&](dap::Serializer* s) { |
| 360 | return typeinfo->serialize(s, data); |
| 361 | }); |
| 362 | }); |
| 363 | send(s.dump()); |
| 364 | |
| 365 | if (auto handler = handlers.responseSent(typeinfo)) { |
| 366 | handler(data, nullptr); |
| 367 | } |
| 368 | }, |
| 369 | [=](const dap::TypeInfo* typeinfo, const dap::Error& error) { |
| 370 | // onError |
| 371 | dap::json::Serializer s; |
| 372 | s.object([&](dap::FieldSerializer* fs) { |
| 373 | return fs->field("seq", dap::integer(nextSeq++)) && |
| 374 | fs->field("type", "response") && |
| 375 | fs->field("request_seq", sequence) && |
| 376 | fs->field("success", dap::boolean(false)) && |
nothing calls this directly
no test coverage detected