Updates base_api_def based on overrides in new_api_def.
| 362 | |
| 363 | // Updates base_api_def based on overrides in new_api_def. |
| 364 | Status MergeApiDefs(ApiDef* base_api_def, const ApiDef& new_api_def) { |
| 365 | // Merge visibility |
| 366 | if (new_api_def.visibility() != ApiDef::DEFAULT_VISIBILITY) { |
| 367 | base_api_def->set_visibility(new_api_def.visibility()); |
| 368 | } |
| 369 | // Merge endpoints |
| 370 | if (new_api_def.endpoint_size() > 0) { |
| 371 | base_api_def->clear_endpoint(); |
| 372 | std::copy( |
| 373 | new_api_def.endpoint().begin(), new_api_def.endpoint().end(), |
| 374 | protobuf::RepeatedFieldBackInserter(base_api_def->mutable_endpoint())); |
| 375 | } |
| 376 | // Merge args |
| 377 | for (const auto& new_arg : new_api_def.in_arg()) { |
| 378 | bool found_base_arg = false; |
| 379 | for (int i = 0; i < base_api_def->in_arg_size(); ++i) { |
| 380 | auto* base_arg = base_api_def->mutable_in_arg(i); |
| 381 | if (base_arg->name() == new_arg.name()) { |
| 382 | MergeArg(base_arg, new_arg); |
| 383 | found_base_arg = true; |
| 384 | break; |
| 385 | } |
| 386 | } |
| 387 | if (!found_base_arg) { |
| 388 | return errors::FailedPrecondition("Argument ", new_arg.name(), |
| 389 | " not defined in base api for ", |
| 390 | base_api_def->graph_op_name()); |
| 391 | } |
| 392 | } |
| 393 | for (const auto& new_arg : new_api_def.out_arg()) { |
| 394 | bool found_base_arg = false; |
| 395 | for (int i = 0; i < base_api_def->out_arg_size(); ++i) { |
| 396 | auto* base_arg = base_api_def->mutable_out_arg(i); |
| 397 | if (base_arg->name() == new_arg.name()) { |
| 398 | MergeArg(base_arg, new_arg); |
| 399 | found_base_arg = true; |
| 400 | break; |
| 401 | } |
| 402 | } |
| 403 | if (!found_base_arg) { |
| 404 | return errors::FailedPrecondition("Argument ", new_arg.name(), |
| 405 | " not defined in base api for ", |
| 406 | base_api_def->graph_op_name()); |
| 407 | } |
| 408 | } |
| 409 | // Merge arg order |
| 410 | if (new_api_def.arg_order_size() > 0) { |
| 411 | // Validate that new arg_order is correct. |
| 412 | if (new_api_def.arg_order_size() != base_api_def->arg_order_size()) { |
| 413 | return errors::FailedPrecondition( |
| 414 | "Invalid number of arguments ", new_api_def.arg_order_size(), " for ", |
| 415 | base_api_def->graph_op_name(), |
| 416 | ". Expected: ", base_api_def->arg_order_size()); |
| 417 | } |
| 418 | if (!std::is_permutation(new_api_def.arg_order().begin(), |
| 419 | new_api_def.arg_order().end(), |
| 420 | base_api_def->arg_order().begin())) { |
| 421 | return errors::FailedPrecondition( |
no test coverage detected