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