| 508 | |
| 509 | |
| 510 | static Try<Nothing> convertResourcesImpl( |
| 511 | Message* message, |
| 512 | Try<Nothing> (*convertResource)(mesos::Resource* resource), |
| 513 | const hashmap<const Descriptor*, bool>& resourcesContainment) |
| 514 | { |
| 515 | CHECK_NOTNULL(message); |
| 516 | |
| 517 | const Descriptor* descriptor = message->GetDescriptor(); |
| 518 | |
| 519 | if (descriptor == mesos::Resource::descriptor()) { |
| 520 | return convertResource(static_cast<mesos::Resource*>(message)); |
| 521 | } |
| 522 | |
| 523 | const google::protobuf::Reflection* reflection = message->GetReflection(); |
| 524 | |
| 525 | for (int i = 0; i < descriptor->field_count(); ++i) { |
| 526 | const google::protobuf::FieldDescriptor* field = descriptor->field(i); |
| 527 | const Descriptor* messageDescriptor = field->message_type(); |
| 528 | |
| 529 | if (messageDescriptor == nullptr || |
| 530 | !resourcesContainment.at(messageDescriptor)) { |
| 531 | continue; |
| 532 | } |
| 533 | |
| 534 | if (!field->is_repeated()) { |
| 535 | if (reflection->HasField(*message, field)) { |
| 536 | Try<Nothing> result = convertResourcesImpl( |
| 537 | reflection->MutableMessage(message, field), |
| 538 | convertResource, |
| 539 | resourcesContainment); |
| 540 | |
| 541 | if (result.isError()) { |
| 542 | return result; |
| 543 | } |
| 544 | } |
| 545 | } else { |
| 546 | const int size = reflection->FieldSize(*message, field); |
| 547 | |
| 548 | for (int j = 0; j < size; ++j) { |
| 549 | Try<Nothing> result = convertResourcesImpl( |
| 550 | reflection->MutableRepeatedMessage(message, field, j), |
| 551 | convertResource, |
| 552 | resourcesContainment); |
| 553 | |
| 554 | if (result.isError()) { |
| 555 | return result; |
| 556 | } |
| 557 | } |
| 558 | } |
| 559 | } |
| 560 | |
| 561 | return Nothing(); |
| 562 | } |
| 563 | |
| 564 | } // namespace internal { |
| 565 |
no test coverage detected