diff --git a/docs/docs/01-intro/01-overview.md b/docs/docs/01-intro/01-overview.md index 7fabbae90b1..ed99af4c1b9 100644 --- a/docs/docs/01-intro/01-overview.md +++ b/docs/docs/01-intro/01-overview.md @@ -402,6 +402,49 @@ ctx.procedures.makeRequest().then( ); ``` + + + +An Unreal C++ [client](#client) can call a procedure defined by a Rust or TypeScript module: + +```cpp +{ +... + // Call the procedure without a callback + Context.Procedures->MakeRequest({}); +} + +``` + +A Unreal C++ [client](#client) can also register a callback to run when a procedure call finishes, which will be invoked with that procedure's return value: + +```cpp +{ +... + FOnMakeRequestComplete Callback; + BIND_DELEGATE_SAFE(Callback, this, AGameManager, OnMakeRequestComplete); + Context.Procedures->MakeRequest(Callback); +} + +// Make sure to mark any callback functions as UFUNCTION() or they will not be executed +void AGameManager::OnMakeRequestComplete(const FProcedureEventContext& Context, const FString& Result, bool bSuccess) +{ + UE_LOG(LogTemp, Log, TEXT("Procedure `MakeRequest` returned %s"), *Result); +} + +``` + + + + +An Unreal C++ [client](#client) can call a procedure defined by a Rust or TypeScript module: + +![MakeRequest without callback](/images/unreal/intro/ue-blueprint-makerequest-nocallback.png) + +A Unreal C++ [client](#client) can also register a callback to run when a procedure call finishes, which will be invoked with that procedure's return value: + +![MakeRequest with callback](/images/unreal/intro/ue-blueprint-makerequest-with-callback.png) + diff --git a/docs/docs/11-Procedures/01-overview.md b/docs/docs/11-Procedures/01-overview.md index f8acb7887e1..5698ce250c8 100644 --- a/docs/docs/11-Procedures/01-overview.md +++ b/docs/docs/11-Procedures/01-overview.md @@ -458,6 +458,22 @@ Clients can invoke procedures using methods on `ctx.procedures`: ctx.procedures.insertAValue({ a: 12, b: "Foo" }); ``` + + + +Clients can invoke procedures using methods on `ctx.Procedures`: + +```cpp +Context.Procedures->InsertAValue(12, TEXT("Foo"), {}); +``` + + + + +Clients can invoke procedures using methods on `ctx.Procedures`: + +![Calling Procedures](/images/unreal/procedures/ue-blueprint-calling-procedure.png) + @@ -485,7 +501,7 @@ That callback will have access to the return value of the procedure, or an error if the procedure fails. ```csharp -ctx.Procedures.AddTwoNumbers(12, "Foo", (ctx, result) => +ctx.Procedures.AddTwoNumbers(1, 2, (ctx, result) => { if (result.IsSuccess) { @@ -509,5 +525,47 @@ ctx.procedures.addTwoNumbers({ lhs: 1, rhs: 2 }).then( ); ``` + + + +A client can also invoke a procedure while registering a callback to run when it completes. +That callback will have access to the return value of the procedure, +or an error if the procedure fails. + +```cpp +{ + ... + FOnAddTwoNumbersComplete ReturnCallback; + BIND_DELEGATE_SAFE(ReturnCallback, this, AGameManager, OnAddTwoNumbersComplete); + Context.Procedures->AddTwoNumbers(1, 2, ReturnCallback); +} + +void AGameManager::OnAddTwoNumbersComplete(const FProcedureEventContext& Context, int32 Result, bool bSuccess) +{ + if (bSuccess) + { + UE_LOG(LogTemp, Log, TEXT("1 + 2 = %d"), Result); + } + else + { + if (Context.Event.Status.IsInternalError()) + { + UE_LOG(LogTemp, Error, TEXT("Error: %s"), *Context.Event.Status.GetAsInternalError()); + return; + } + UE_LOG(LogTemp, Error, TEXT("Out of energy!")); + } +} +``` + + + + +A client can also invoke a procedure while registering a callback to run when it completes. +That callback will have access to the return value of the procedure, +or an error if the procedure fails. + +![Procedure Callbacks](/images/unreal/procedures/ue-blueprint-procedure-callback.png) + diff --git a/docs/static/images/unreal/intro/ue-blueprint-makerequest-nocallback.png b/docs/static/images/unreal/intro/ue-blueprint-makerequest-nocallback.png new file mode 100644 index 00000000000..0965eac3dff Binary files /dev/null and b/docs/static/images/unreal/intro/ue-blueprint-makerequest-nocallback.png differ diff --git a/docs/static/images/unreal/intro/ue-blueprint-makerequest-with-callback.png b/docs/static/images/unreal/intro/ue-blueprint-makerequest-with-callback.png new file mode 100644 index 00000000000..da6727ad247 Binary files /dev/null and b/docs/static/images/unreal/intro/ue-blueprint-makerequest-with-callback.png differ diff --git a/docs/static/images/unreal/procedures/ue-blueprint-calling-procedure.png b/docs/static/images/unreal/procedures/ue-blueprint-calling-procedure.png new file mode 100644 index 00000000000..0995bae53fc Binary files /dev/null and b/docs/static/images/unreal/procedures/ue-blueprint-calling-procedure.png differ diff --git a/docs/static/images/unreal/procedures/ue-blueprint-procedure-callback.png b/docs/static/images/unreal/procedures/ue-blueprint-procedure-callback.png new file mode 100644 index 00000000000..5eb7d0b970b Binary files /dev/null and b/docs/static/images/unreal/procedures/ue-blueprint-procedure-callback.png differ diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/Callback.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/Callback.h index f8c8d61fa8b..6905446c09f 100644 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/Callback.h +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/Callback.h @@ -680,40 +680,36 @@ class SPACETIMEDBSDK_API USpacetimeDBProcedureStatusBpLib : public UBlueprintFun } UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ProcedureStatus") - static bool IsReturned(const FProcedureStatusType& InValue) { return InValue.IsReturned(); } + static bool IsReturned(const FSpacetimeDBProcedureStatus& InValue) { return InValue.IsReturned(); } - UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ProcedureStatus") - static TArray GetAsReturned(const FProcedureStatusType& InValue) - { - return InValue.GetAsReturned(); - } + // We don't allow the raw value to be exported as GetAsReturned() from the ProcedureEventContext. UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|ProcedureStatus") - static FProcedureStatusType OutOfEnergy(const FSpacetimeDBUnit& InValue) + static FSpacetimeDBProcedureStatus OutOfEnergy(const FSpacetimeDBUnit& InValue) { - return FProcedureStatusType::OutOfEnergy(InValue); + return FSpacetimeDBProcedureStatus::OutOfEnergy(InValue); } UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ProcedureStatus") - static bool IsOutOfEnergy(const FProcedureStatusType& InValue) { return InValue.IsOutOfEnergy(); } + static bool IsOutOfEnergy(const FSpacetimeDBProcedureStatus& InValue) { return InValue.IsOutOfEnergy(); } UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ProcedureStatus") - static FSpacetimeDBUnit GetAsOutOfEnergy(const FProcedureStatusType& InValue) + static FSpacetimeDBUnit GetAsOutOfEnergy(const FSpacetimeDBProcedureStatus& InValue) { return InValue.GetAsOutOfEnergy(); } UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|ProcedureStatus") - static FProcedureStatusType InternalError(const FString& InValue) + static FSpacetimeDBProcedureStatus InternalError(const FString& InValue) { - return FProcedureStatusType::InternalError(InValue); + return FSpacetimeDBProcedureStatus::InternalError(InValue); } UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ProcedureStatus") - static bool IsInternalError(const FProcedureStatusType& InValue) { return InValue.IsInternalError(); } + static bool IsInternalError(const FSpacetimeDBProcedureStatus& InValue) { return InValue.IsInternalError(); } UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ProcedureStatus") - static FString GetAsInternalError(const FProcedureStatusType& InValue) + static FString GetAsInternalError(const FSpacetimeDBProcedureStatus& InValue) { return InValue.GetAsInternalError(); }