| 472 | } |
| 473 | |
| 474 | TSharedPtr<FJsonObject> FURLabRpcDispatcher::HandleMeta(const TSharedPtr<FJsonObject>& /*Req*/) |
| 475 | { |
| 476 | // Pre-session bootstrap reply: ship the full op table so the Python |
| 477 | // client can synthesise `URLabClient.<namespace>.<op>` methods at |
| 478 | // discover time. `meta` is intentionally NOT registered through the |
| 479 | // table — it's hardcoded above, which breaks the chicken-and-egg. |
| 480 | TSharedPtr<FJsonObject> Reply = MakeShared<FJsonObject>(); |
| 481 | Reply->SetStringField(TEXT("op"), TEXT("meta_ok")); |
| 482 | |
| 483 | auto CategoryString = [](URLabOpRegistry::EOpCategory C) { |
| 484 | switch (C) |
| 485 | { |
| 486 | case URLabOpRegistry::EOpCategory::EditorOnly: |
| 487 | return TEXT("editor_only"); |
| 488 | case URLabOpRegistry::EOpCategory::ManagerRequired: |
| 489 | return TEXT("manager_required"); |
| 490 | case URLabOpRegistry::EOpCategory::NoManager: |
| 491 | return TEXT("no_manager"); |
| 492 | } |
| 493 | return TEXT("unknown"); |
| 494 | }; |
| 495 | |
| 496 | TArray<TSharedPtr<FJsonValue>> Ops; |
| 497 | for (const URLabOpRegistry::FOpDecl& D : URLabOpRegistry::GetAllOps()) |
| 498 | { |
| 499 | TSharedPtr<FJsonObject> O = MakeShared<FJsonObject>(); |
| 500 | O->SetStringField(TEXT("name"), D.Name); |
| 501 | O->SetStringField(TEXT("category"), CategoryString(D.Category)); |
| 502 | O->SetStringField(TEXT("namespace"), D.Namespace); |
| 503 | if (D.RequiredFields.Num() > 0) |
| 504 | { |
| 505 | TArray<TSharedPtr<FJsonValue>> Fields; |
| 506 | for (const FString& F : D.RequiredFields) |
| 507 | Fields.Add(MakeShared<FJsonValueString>(F)); |
| 508 | O->SetArrayField(TEXT("required_fields"), Fields); |
| 509 | } |
| 510 | if (D.ReplyFields.Num() > 0) |
| 511 | { |
| 512 | TArray<TSharedPtr<FJsonValue>> Fields; |
| 513 | for (const FString& F : D.ReplyFields) |
| 514 | Fields.Add(MakeShared<FJsonValueString>(F)); |
| 515 | O->SetArrayField(TEXT("reply_fields"), Fields); |
| 516 | } |
| 517 | Ops.Add(MakeShared<FJsonValueObject>(O)); |
| 518 | } |
| 519 | Reply->SetArrayField(TEXT("ops"), Ops); |
| 520 | return Reply; |
| 521 | } |
| 522 | |
| 523 | TSharedPtr<FJsonObject> FURLabRpcDispatcher::HandleSetPaused(const TSharedPtr<FJsonObject>& Req) |
| 524 | { |
nothing calls this directly
no test coverage detected