From 4f653692052d5e0ec0586043b55102a67c0e8230 Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Wed, 29 Jan 2025 08:27:44 +1000 Subject: [PATCH 01/35] refactor: align marketplace structure with unity (dx-3545 dx-3546 dx-3551) --- Config/DefaultImmutable.ini | 8 - .../Marketplace/ImtblBridgeWidget4_26.uasset | Bin 716144 -> 690681 bytes .../Marketplace/ImtblSwapWidget4_26.uasset | Bin 578747 -> 553728 bytes Immutable.uplugin | 5 + Source/Immutable/Immutable.Build.cs | 191 +++++++------- .../Marketplace/ImtblBridgeRequest.cpp | 73 ------ .../Marketplace/ImtblSwapRequest.cpp | 85 ------- .../Public/Immutable/ApplicationConfig.h | 6 +- .../Public/Immutable/ImmutableEnums.h | 11 - .../Marketplace/ImtblBridgeRequest.h | 71 ------ .../Immutable/Marketplace/ImtblSwapRequest.h | 77 ------ Source/ImmutableCore/ImmutableCore.Build.cs | 20 ++ .../ImmutableCore/Private/ImmutableCore.cpp | 15 ++ .../ImmutableCore/Private/ImmutableEnums.cpp | 1 + Source/ImmutableCore/Public/ImmutableCore.h | 8 + Source/ImmutableCore/Public/ImmutableEnums.h | 13 + .../ImmutableMarketplace.Build.cs | 67 +++-- .../Bridge/ImmutableBridgeQueryParams.cpp | 1 + .../Private/ImmutableMarketplaceEnums.cpp | 1 + .../ImmutableMarketplaceLinkConfig.cpp | 40 +++ .../ImmutableMarketplaceLinkFactory.cpp | 109 ++++++++ .../OnRamp/ImmutableOnRampQueryParams.cpp | 1 + .../Private/OnRampWebBrowserWidget.cpp | 95 ++----- .../Private/Swap/ImmutableSwapQueryParams.cpp | 1 + .../Bridge/ImmutableBridgeQueryParams.h | 29 +++ .../ImmutableMarketplaceDeveloperSettings.h | 16 ++ .../Public/ImmutableMarketplaceEnums.h | 11 + .../Public/ImmutableMarketplaceLinkConfig.h | 37 +++ .../Public/ImmutableMarketplaceLinkFactory.h | 57 +++++ .../Public/ImmutableMarketplaceSettings.h | 25 -- .../OnRamp/ImmutableOnRampQueryParams.h | 28 +++ .../Public/OnRampWebBrowserWidget.h | 22 +- .../Public/OnRampWidgetConfig.h | 237 ------------------ .../Public/Swap/ImmutableSwapQueryParams.h | 21 ++ 34 files changed, 575 insertions(+), 807 deletions(-) delete mode 100644 Config/DefaultImmutable.ini delete mode 100644 Source/Immutable/Private/Immutable/Marketplace/ImtblBridgeRequest.cpp delete mode 100644 Source/Immutable/Private/Immutable/Marketplace/ImtblSwapRequest.cpp delete mode 100644 Source/Immutable/Public/Immutable/ImmutableEnums.h delete mode 100644 Source/Immutable/Public/Immutable/Marketplace/ImtblBridgeRequest.h delete mode 100644 Source/Immutable/Public/Immutable/Marketplace/ImtblSwapRequest.h create mode 100644 Source/ImmutableCore/ImmutableCore.Build.cs create mode 100644 Source/ImmutableCore/Private/ImmutableCore.cpp create mode 100644 Source/ImmutableCore/Private/ImmutableEnums.cpp create mode 100644 Source/ImmutableCore/Public/ImmutableCore.h create mode 100644 Source/ImmutableCore/Public/ImmutableEnums.h create mode 100644 Source/ImmutableMarketplace/Private/Bridge/ImmutableBridgeQueryParams.cpp create mode 100644 Source/ImmutableMarketplace/Private/ImmutableMarketplaceEnums.cpp create mode 100644 Source/ImmutableMarketplace/Private/ImmutableMarketplaceLinkConfig.cpp create mode 100644 Source/ImmutableMarketplace/Private/ImmutableMarketplaceLinkFactory.cpp create mode 100644 Source/ImmutableMarketplace/Private/OnRamp/ImmutableOnRampQueryParams.cpp create mode 100644 Source/ImmutableMarketplace/Private/Swap/ImmutableSwapQueryParams.cpp create mode 100644 Source/ImmutableMarketplace/Public/Bridge/ImmutableBridgeQueryParams.h create mode 100644 Source/ImmutableMarketplace/Public/ImmutableMarketplaceDeveloperSettings.h create mode 100644 Source/ImmutableMarketplace/Public/ImmutableMarketplaceEnums.h create mode 100644 Source/ImmutableMarketplace/Public/ImmutableMarketplaceLinkConfig.h create mode 100644 Source/ImmutableMarketplace/Public/ImmutableMarketplaceLinkFactory.h delete mode 100644 Source/ImmutableMarketplace/Public/ImmutableMarketplaceSettings.h create mode 100644 Source/ImmutableMarketplace/Public/OnRamp/ImmutableOnRampQueryParams.h delete mode 100644 Source/ImmutableMarketplace/Public/OnRampWidgetConfig.h create mode 100644 Source/ImmutableMarketplace/Public/Swap/ImmutableSwapQueryParams.h diff --git a/Config/DefaultImmutable.ini b/Config/DefaultImmutable.ini deleted file mode 100644 index 2adadae..0000000 --- a/Config/DefaultImmutable.ini +++ /dev/null @@ -1,8 +0,0 @@ - - -[/Script/Immutable.ImtblSwapRequest] -BaseUrls=((Sandbox, "https://checkout-playground.sandbox.immutable.com/checkout/swap"),(Production, "https://toolkit.immutable.com/checkout/swap")) -ApiKeys=((Sandbox, "pk_imapik-test-7-hfC5T$W$eEDE8Mc5mp"),(Production, "pk_imapik-WGd9orNd8mLdtTCTb3CP")) - -[/Script/Immutable.ImtblBridgeRequest] -BaseUrls=((Sandbox, "https://checkout-playground.sandbox.immutable.com/checkout/squid"),(Production, "https://toolkit.immutable.com/checkout/squid")) diff --git a/Content/BlueprintSampleContent/Marketplace/ImtblBridgeWidget4_26.uasset b/Content/BlueprintSampleContent/Marketplace/ImtblBridgeWidget4_26.uasset index 163c52f2aa299a57abe338c3488b32ca5ea06d8e..0aeec5a18f40ea5453e4cc30b1fdf2321a9b75e7 100644 GIT binary patch literal 690681 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

}?<8q69O%LgBr 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 P-@wsTE1ygVdi(zYPeO-d diff --git a/Content/BlueprintSampleContent/Marketplace/ImtblSwapWidget4_26.uasset b/Content/BlueprintSampleContent/Marketplace/ImtblSwapWidget4_26.uasset index 7d9cb1b4d83770deaea372591a6f97000e7d08a2..f33f2850b558b857be33e9a024e837e82e2d96ab 100644 GIT binary patch literal 553728 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 F{Qr+8HbDRY literal 578747 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

    P@d|JFQl1 zh>RZ9pzAX@mQ5zrsy^%e5HW8=AGZmk>W5TkQT=aK6;S=*sa<}$J*n&%)?wSXz`a%H zV+zokSoK$+{hy~e|M@14v`rjq{KO*8p&|)Wg6b5jb=OaI z+xT7wM{XECQ|gf`Jdlq@EqA(4Ewi_(hQQcKpFrG_TdY}JFFl&Sr&pJG+4G0NQl65@bT3>~ z<+SYUo4Td?rEdNt ztk?)1T3PYAQhfbDEaG=h#MPsJP!Jc!7~axdj^bl>m_>yo_n6(+DcMTrdmYQ@&Yw

    ^cGY!2d}#zw&1U)9ljbCtc7R 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%0AQXwLY<_zehcM9+~QilOao#-*eAW*SCGw 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%0DK>43bJEql-sp2|!%*B7+7j<`| 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 diff --git a/Immutable.uplugin b/Immutable.uplugin index 9d589c6..6780758 100644 --- a/Immutable.uplugin +++ b/Immutable.uplugin @@ -21,6 +21,11 @@ "Type": "Runtime", "LoadingPhase": "Default" }, + { + "Name": "ImmutableCore", + "Type": "Runtime", + "LoadingPhase": "Default" + }, { "Name": "ImmutableEditor", "Type": "Editor", diff --git a/Source/Immutable/Immutable.Build.cs b/Source/Immutable/Immutable.Build.cs index c2a00b3..2129f99 100644 --- a/Source/Immutable/Immutable.Build.cs +++ b/Source/Immutable/Immutable.Build.cs @@ -6,52 +6,53 @@ public class Immutable : ModuleRules { - public Immutable(ReadOnlyTargetRules Target) : base(Target) - { - PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; - + public Immutable(ReadOnlyTargetRules Target) : base(Target) + { + PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; + #if UE_5_1_OR_LATER IncludeOrderVersion = EngineIncludeOrderVersion.Latest; #endif - RuntimeDependencies.Add("$(PluginDir)/Web/index.js"); + RuntimeDependencies.Add("$(PluginDir)/Web/index.js"); - PublicDependencyModuleNames.AddRange( - new string[] - { - "Core", - "JsonUtilities", - } - ); - - PrivateDependencyModuleNames.AddRange( - new string[] - { - "CoreUObject", - "Engine", - "Slate", - "SlateCore", - "Json", - "UMG", - "Projects", - "DeveloperSettings", - "HTTP", - } - ); + PublicDependencyModuleNames.AddRange(new string[] + { + "Core", + "JsonUtilities" + }); + + PublicDependencyModuleNames.AddRange(new string[] + { + "ImmutableCore" + }); + + PrivateDependencyModuleNames.AddRange(new string[] + { + "CoreUObject", + "Engine", + "Slate", + "SlateCore", + "Json", + "UMG", + "Projects", + "DeveloperSettings", + "HTTP", + }); #if UE_5_1_OR_LATER - PublicDependencyModuleNames.AddRange( - new string[] - { - "WebBrowser", - "WebBrowserWidget" - } - ); + PublicDependencyModuleNames.AddRange( + new string[] + { + "WebBrowser", + "WebBrowserWidget" + } + ); #else - PrivateDependencyModuleNames.Add("BluExtension"); - if (Target.Platform == UnrealTargetPlatform.Win64) - { - PublicDependencyModuleNames.Add("Blu"); - } + PrivateDependencyModuleNames.Add("BluExtension"); + if (Target.Platform == UnrealTargetPlatform.Win64) + { + PublicDependencyModuleNames.Add("Blu"); + } #endif #if UE_5_1_OR_LATER @@ -59,64 +60,64 @@ public Immutable(ReadOnlyTargetRules Target) : base(Target) PublicDefinitions.Add("USING_BUNDLED_CEF=1"); PublicDefinitions.Add("USING_BLUI_CEF=0"); #else - if (Target.Platform == UnrealTargetPlatform.Win64) - { - PublicDefinitions.Add("USING_BLUI_CEF=1"); - } - else - { - PublicDefinitions.Add("USING_BLUI_CEF=0"); - } - - PublicDefinitions.Add("USING_BUNDLED_CEF=0"); + if (Target.Platform == UnrealTargetPlatform.Win64) + { + PublicDefinitions.Add("USING_BLUI_CEF=1"); + } + else + { + PublicDefinitions.Add("USING_BLUI_CEF=0"); + } + + PublicDefinitions.Add("USING_BUNDLED_CEF=0"); #endif - DynamicallyLoadedModuleNames.AddRange( - new string[] - { + DynamicallyLoadedModuleNames.AddRange( + new string[] + { // ... add any modules that your module loads dynamically here ... } - ); - - if (Target.bBuildEditor == true) - { - PrivateDependencyModuleNames.Add("UnrealEd"); - } - - if (Target.Platform == UnrealTargetPlatform.Android) - { - PrivateDependencyModuleNames.AddRange(new string[] { "Launch" }); - - string PluginPath = Utils.MakePathRelativeTo(ModuleDirectory, Target.RelativeEnginePath); - AdditionalPropertiesForReceipt.Add("AndroidPlugin", Path.Combine(PluginPath, "Immutable_UPL_Android.xml")); - } - - if (Target.Platform == UnrealTargetPlatform.IOS) - { - PrivateDependencyModuleNames.AddRange(new string[] { "Launch" }); - - PrivateIncludePaths.AddRange(new string[] { Path.Combine(ModuleDirectory, "Private/Immutable", "IOS") }); - - PublicFrameworks.AddRange( - new string[] - { - "Foundation", - "AuthenticationServices" - } - ); - } - - if (Target.Platform == UnrealTargetPlatform.Mac) - { - PrivateIncludePaths.AddRange(new string[] { Path.Combine(ModuleDirectory, "Private/Immutable", "Mac") }); - - PublicFrameworks.AddRange( - new string[] - { - "Foundation", - "AuthenticationServices" - } - ); - } - } + ); + + if (Target.bBuildEditor == true) + { + PrivateDependencyModuleNames.Add("UnrealEd"); + } + + if (Target.Platform == UnrealTargetPlatform.Android) + { + PrivateDependencyModuleNames.AddRange(new string[] { "Launch" }); + + string PluginPath = Utils.MakePathRelativeTo(ModuleDirectory, Target.RelativeEnginePath); + AdditionalPropertiesForReceipt.Add("AndroidPlugin", Path.Combine(PluginPath, "Immutable_UPL_Android.xml")); + } + + if (Target.Platform == UnrealTargetPlatform.IOS) + { + PrivateDependencyModuleNames.AddRange(new string[] { "Launch" }); + + PrivateIncludePaths.AddRange(new string[] { Path.Combine(ModuleDirectory, "Private/Immutable", "IOS") }); + + PublicFrameworks.AddRange( + new string[] + { + "Foundation", + "AuthenticationServices" + } + ); + } + + if (Target.Platform == UnrealTargetPlatform.Mac) + { + PrivateIncludePaths.AddRange(new string[] { Path.Combine(ModuleDirectory, "Private/Immutable", "Mac") }); + + PublicFrameworks.AddRange( + new string[] + { + "Foundation", + "AuthenticationServices" + } + ); + } + } } \ No newline at end of file diff --git a/Source/Immutable/Private/Immutable/Marketplace/ImtblBridgeRequest.cpp b/Source/Immutable/Private/Immutable/Marketplace/ImtblBridgeRequest.cpp deleted file mode 100644 index 7251ee6..0000000 --- a/Source/Immutable/Private/Immutable/Marketplace/ImtblBridgeRequest.cpp +++ /dev/null @@ -1,73 +0,0 @@ -#include "Immutable/Marketplace/ImtblBridgeRequest.h" - -#include "GenericPlatform/GenericPlatformHttp.h" - -FString FImtblBridgeRequestQueryParams::GetPercentEncodedUrl() const -{ - TArray QueryParams; - - if (!FromChainID.IsEmpty()) - { - QueryParams.Add(FString::Printf(TEXT("%s=%s"), TEXT("fromChain"), *FGenericPlatformHttp::UrlEncode(FromChainID))); - } - - if (!FromTokenAddress.IsEmpty()) - { - // Token address is case-sensitive. - QueryParams.Add(FString::Printf(TEXT("%s=%s"), TEXT("fromToken"), *FGenericPlatformHttp::UrlEncode(FromTokenAddress.ToLower()))); - } - - if (!ToChainID.IsEmpty()) - { - QueryParams.Add(FString::Printf(TEXT("%s=%s"), TEXT("toChain"), *FGenericPlatformHttp::UrlEncode(ToChainID))); - } - - if (!ToTokenAddress.IsEmpty()) - { - // Token address is case-sensitive. - QueryParams.Add(FString::Printf(TEXT("%s=%s"), TEXT("toToken"), *FGenericPlatformHttp::UrlEncode(ToTokenAddress.ToLower()))); - } - - return FString::Join(QueryParams, TEXT("&")); -} - -bool UImtblBridgeRequest::GetBaseUrl(EImtblEnvironment Environment, FString& BaseUrl) const -{ - if (const FString* Find = BaseUrls.Find(Environment)) - { - BaseUrl = *Find; - - return true; - } - - return true; -} - -bool UImtblBridgeRequest::ComputePath(FString& ComputedPath, EImtblEnvironment Environment, FString FromChainID, FString FromTokenAddress, FString ToChainID, FString ToTokenAddress) const -{ - FString BaseUrl; - bool bFoundBaseUrl = GetBaseUrl(Environment, BaseUrl); - - if (!bFoundBaseUrl) - { - return false; - } - - FImtblBridgeRequestQueryParams QueryParams; - QueryParams.FromChainID = FromChainID; - QueryParams.FromTokenAddress = FromTokenAddress; - QueryParams.ToChainID = ToChainID; - QueryParams.ToTokenAddress = ToTokenAddress; - - const FString QueryParamsPercentEncodedUrl = QueryParams.GetPercentEncodedUrl(); - - ComputedPath = FString::Printf - ( - TEXT("%s%s%s"), - *BaseUrl, - !QueryParamsPercentEncodedUrl.IsEmpty() ? TEXT("?") : TEXT(""), - *QueryParamsPercentEncodedUrl - ); - - return true; -} \ No newline at end of file diff --git a/Source/Immutable/Private/Immutable/Marketplace/ImtblSwapRequest.cpp b/Source/Immutable/Private/Immutable/Marketplace/ImtblSwapRequest.cpp deleted file mode 100644 index 87bfea1..0000000 --- a/Source/Immutable/Private/Immutable/Marketplace/ImtblSwapRequest.cpp +++ /dev/null @@ -1,85 +0,0 @@ -#include "Immutable/Marketplace/ImtblSwapRequest.h" - -#include "GenericPlatform/GenericPlatformHttp.h" - -FString FImtblSwapRequestQueryParams::GetPercentEncodedUrl() const -{ - TArray QueryParams; - - if (!PublishableKey.IsEmpty()) - { - QueryParams.Add(FString::Printf(TEXT("%s=%s"), TEXT("publishableKey"), *FGenericPlatformHttp::UrlEncode(PublishableKey))); - } - - if (!FromTokenAddress.IsEmpty()) - { - QueryParams.Add(FString::Printf(TEXT("%s=%s"), TEXT("fromTokenAddress"), *FGenericPlatformHttp::UrlEncode(FromTokenAddress))); - } - - if (!ToTokenAddress.IsEmpty()) - { - QueryParams.Add(FString::Printf(TEXT("%s=%s"), TEXT("toTokenAddress"), *FGenericPlatformHttp::UrlEncode(ToTokenAddress))); - } - - return FString::Join(QueryParams, TEXT("&")); -} - -bool UImtblSwapRequest::GetBaseUrl(EImtblEnvironment Environment, FString& BaseUrl) const -{ - if (const FString* Find = BaseUrls.Find(Environment)) - { - BaseUrl = *Find; - - return true; - } - - return true; -} - -bool UImtblSwapRequest::GetApiKey(EImtblEnvironment Environment, FString& ApiKey) const -{ - if (const FString* Find = ApiKeys.Find(Environment)) - { - ApiKey = *Find; - - return true; - } - - return false; -} - -bool UImtblSwapRequest::ComputePath(FString& ComputedPath, EImtblEnvironment Environment, FString FromTokenAddress, FString ToTokenAddress) const -{ - FString BaseUrl; - bool bFoundBaseUrl = GetBaseUrl(Environment, BaseUrl); - - if (!bFoundBaseUrl) - { - return false; - } - - FString ApiKey; - bool bFoundApiKey = GetApiKey(Environment, ApiKey); - - if (!bFoundApiKey) - { - return false; - } - - FImtblSwapRequestQueryParams QueryParams; - QueryParams.PublishableKey = ApiKey; - QueryParams.FromTokenAddress = FromTokenAddress; - QueryParams.ToTokenAddress = ToTokenAddress; - - const FString QueryParamsPercentEncodedUrl = QueryParams.GetPercentEncodedUrl(); - - ComputedPath = FString::Printf - ( - TEXT("%s%s%s"), - *BaseUrl, - !QueryParamsPercentEncodedUrl.IsEmpty() ? TEXT("?") : TEXT(""), - *QueryParamsPercentEncodedUrl - ); - - return true; -} \ No newline at end of file diff --git a/Source/Immutable/Public/Immutable/ApplicationConfig.h b/Source/Immutable/Public/Immutable/ApplicationConfig.h index 3b96c20..e69592d 100644 --- a/Source/Immutable/Public/Immutable/ApplicationConfig.h +++ b/Source/Immutable/Public/Immutable/ApplicationConfig.h @@ -96,10 +96,10 @@ class IMMUTABLE_API UApplicationConfig : public UObject { switch (Environment) { - case EImtblEnvironment::Production: + case EImmutableEnvironment::Production: return ImmutablePassportEnvironmentConstants::EnvironmentProduction; default: - case EImtblEnvironment::Sandbox: + case EImmutableEnvironment::Sandbox: return ImmutablePassportEnvironmentConstants::EnvironmentProduction; } } @@ -159,7 +159,7 @@ class IMMUTABLE_API UApplicationConfig : public UObject * @note The default environment is set to the Sandbox environment. */ UPROPERTY(EditDefaultsOnly, Category = "Passport") - EImtblEnvironment Environment = EImtblEnvironment::Sandbox; + EImmutableEnvironment Environment = EImmutableEnvironment::Sandbox; /** * (Android, iOS, and macOS only) diff --git a/Source/Immutable/Public/Immutable/ImmutableEnums.h b/Source/Immutable/Public/Immutable/ImmutableEnums.h deleted file mode 100644 index 79183b4..0000000 --- a/Source/Immutable/Public/Immutable/ImmutableEnums.h +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once - -UENUM(BlueprintType) -enum class EImtblEnvironment : uint8 -{ - Sandbox, - Production, - MAX -}; - -ENUM_RANGE_BY_COUNT(EImtblEnvironment, EImtblEnvironment::MAX) \ No newline at end of file diff --git a/Source/Immutable/Public/Immutable/Marketplace/ImtblBridgeRequest.h b/Source/Immutable/Public/Immutable/Marketplace/ImtblBridgeRequest.h deleted file mode 100644 index 49fa9f3..0000000 --- a/Source/Immutable/Public/Immutable/Marketplace/ImtblBridgeRequest.h +++ /dev/null @@ -1,71 +0,0 @@ -#pragma once - -#include "ImtblBridgeRequest.generated.h" - -/** - * Bridge request query params - */ -USTRUCT(BlueprintType) -struct FImtblBridgeRequestQueryParams -{ - GENERATED_BODY() - -public: - FString GetPercentEncodedUrl() const; - -public: - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Immutable") - FString FromChainID; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Immutable") - FString FromTokenAddress; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Immutable") - FString ToChainID; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Immutable") - FString ToTokenAddress; -}; - -/** - * Functionality to generate bridge requests - */ -UCLASS(BlueprintType, Config = "Immutable", DefaultConfig) -class IMMUTABLE_API UImtblBridgeRequest : public UObject -{ - GENERATED_BODY() - -public: - /** - * Finds the base url associated with the environment. - * - * @param Environment The environment that will be used to look the value up. Only sandbox and production environment are supported. - * @param BaseUrl The base url associated with the key. - * @return True if an item was found (False indicates nothing in the map uses the provided environment). - */ - UFUNCTION(BlueprintPure, Category = "Immutable") - bool GetBaseUrl(EImtblEnvironment Environment, FString& BaseUrl) const; - - /** - * Generates a link for the bridge flow. - * - * @param ComputedPath [Out] The generated link. - * @param Environment [In] The environment for which the path is being computed for (e.g. sandbox, production). - * @param FromChainID [Optional] The ID of the source blockchain. Default value is an empty string. - * @param FromTokenAddress [Optional] The contract address of the token being bridged from. - * This should be a contract address of a token on the source blockchain. - * Default value is an empty string. - * @param ToChainID [Optional] The ID of the destination blockchain. Default value is an empty string. - * @param ToTokenAddress [Optional] The contract address of the token being bridged to. - * This should be a contract address of a token on the destination blockchain. - * Default is an empty string. - * - * @return True if link was computed (False indicates link failed to compute). - */ - UFUNCTION(BlueprintCallable, BlueprintPure = "False", Category = "Immutable") - bool ComputePath(FString& ComputedPath, EImtblEnvironment Environment, FString FromChainID = TEXT(""), FString FromTokenAddress = TEXT(""), FString ToChainID = TEXT(""), FString ToTokenAddress = TEXT("")) const; - -public: - UPROPERTY(Config, EditDefaultsOnly, BlueprintReadOnly, Category = "Immutable") - TMap BaseUrls; -}; \ No newline at end of file diff --git a/Source/Immutable/Public/Immutable/Marketplace/ImtblSwapRequest.h b/Source/Immutable/Public/Immutable/Marketplace/ImtblSwapRequest.h deleted file mode 100644 index 1802326..0000000 --- a/Source/Immutable/Public/Immutable/Marketplace/ImtblSwapRequest.h +++ /dev/null @@ -1,77 +0,0 @@ -#pragma once - -#include "ImtblSwapRequest.generated.h" - -enum class EImtblEnvironment : uint8; - -/** - * Swap request query params - */ -USTRUCT(BlueprintType) -struct FImtblSwapRequestQueryParams -{ - GENERATED_BODY() - -public: - FString GetPercentEncodedUrl() const; - -public: - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Immutable") - FString PublishableKey; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Immutable") - FString FromTokenAddress; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Immutable") - FString ToTokenAddress; -}; - -/** - * Functionality to generate swap requests - */ -UCLASS(BlueprintType, Config = "Immutable", DefaultConfig) -class IMMUTABLE_API UImtblSwapRequest : public UObject -{ - GENERATED_BODY() - -public: - /** - * Finds the base url associated with the environment. - * - * @param Environment The environment that will be used to look the value up. Only sandbox and production environment are supported. - * @param BaseUrl The base url associated with the key. - * @return True if an item was found (False indicates nothing in the map uses the provided environment). - */ - UFUNCTION(BlueprintPure, Category = "Immutable") - bool GetBaseUrl(EImtblEnvironment Environment, FString& BaseUrl) const; - - /** - * Finds the api key associated with the provided key. - * - * @param Environment The environment that will be used to look the value up. Only sandbox and production environment are supported. - * @param ApiKey The api key associated with the key. - * @return True if an item was found (False indicates nothing in the map uses the provided environment). - */ - UFUNCTION(BlueprintPure, Category = "Immutable") - bool GetApiKey(EImtblEnvironment Environment, FString& ApiKey) const; - - /** - * Generates a link for the swap flow. - * - * @param ComputedPath [Out] The generated link. - * @param Environment [In] The environment for which the path is being computed for (e.g. sandbox, production). - * @param ToTokenAddress [Optional] The token address of the token being swapped from. Default value is an empty string. - * @param FromTokenAddress [Optional] The token address of the token being swapped to. Default value is an empty string. - * - * @return True if path was computed (False indicates link failed to compute). - */ - UFUNCTION(BlueprintCallable, BlueprintPure = "False", Category = "Immutable") - bool ComputePath(FString& ComputedPath, EImtblEnvironment Environment, FString FromTokenAddress = TEXT(""), FString ToTokenAddress = TEXT("")) const; - -public: - UPROPERTY(Config, EditDefaultsOnly, BlueprintReadOnly, Category = "Immutable") - TMap BaseUrls; - - UPROPERTY(Config, EditDefaultsOnly, BlueprintReadOnly, Category = "Immutable") - TMap ApiKeys; -}; \ No newline at end of file diff --git a/Source/ImmutableCore/ImmutableCore.Build.cs b/Source/ImmutableCore/ImmutableCore.Build.cs new file mode 100644 index 0000000..62d7408 --- /dev/null +++ b/Source/ImmutableCore/ImmutableCore.Build.cs @@ -0,0 +1,20 @@ +using UnrealBuildTool; + +public class ImmutableCore : ModuleRules +{ + public ImmutableCore(ReadOnlyTargetRules Target) : base(Target) + { + PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; + + PublicDependencyModuleNames.AddRange(new string[] + { + "Core" + }); + + PrivateDependencyModuleNames.AddRange(new string[] + { + "CoreUObject", + "Engine" + }); + } +} \ No newline at end of file diff --git a/Source/ImmutableCore/Private/ImmutableCore.cpp b/Source/ImmutableCore/Private/ImmutableCore.cpp new file mode 100644 index 0000000..5faa1d6 --- /dev/null +++ b/Source/ImmutableCore/Private/ImmutableCore.cpp @@ -0,0 +1,15 @@ +#include "ImmutableCore.h" + +#define LOCTEXT_NAMESPACE "FImmutableCoreModule" + +void FImmutableCoreModule::StartupModule() +{ +} + +void FImmutableCoreModule::ShutdownModule() +{ +} + +#undef LOCTEXT_NAMESPACE + +IMPLEMENT_MODULE(FImmutableCoreModule, ImmutableCore) \ No newline at end of file diff --git a/Source/ImmutableCore/Private/ImmutableEnums.cpp b/Source/ImmutableCore/Private/ImmutableEnums.cpp new file mode 100644 index 0000000..b9c822c --- /dev/null +++ b/Source/ImmutableCore/Private/ImmutableEnums.cpp @@ -0,0 +1 @@ +#include "ImmutableEnums.h" \ No newline at end of file diff --git a/Source/ImmutableCore/Public/ImmutableCore.h b/Source/ImmutableCore/Public/ImmutableCore.h new file mode 100644 index 0000000..ab3b944 --- /dev/null +++ b/Source/ImmutableCore/Public/ImmutableCore.h @@ -0,0 +1,8 @@ +#pragma once + +class FImmutableCoreModule : public IModuleInterface +{ +public: + virtual void StartupModule() override; + virtual void ShutdownModule() override; +}; \ No newline at end of file diff --git a/Source/ImmutableCore/Public/ImmutableEnums.h b/Source/ImmutableCore/Public/ImmutableEnums.h new file mode 100644 index 0000000..35a8adb --- /dev/null +++ b/Source/ImmutableCore/Public/ImmutableEnums.h @@ -0,0 +1,13 @@ +#pragma once + +#include "ImmutableEnums.generated.h" + +UENUM(BlueprintType) +enum class EImmutableEnvironment : uint8 +{ + Sandbox, + Production, + MAX +}; + +ENUM_RANGE_BY_COUNT(EImmutableEnvironment, EImmutableEnvironment::MAX) \ No newline at end of file diff --git a/Source/ImmutableMarketplace/ImmutableMarketplace.Build.cs b/Source/ImmutableMarketplace/ImmutableMarketplace.Build.cs index f3eb699..6ee1c4e 100644 --- a/Source/ImmutableMarketplace/ImmutableMarketplace.Build.cs +++ b/Source/ImmutableMarketplace/ImmutableMarketplace.Build.cs @@ -2,43 +2,42 @@ public class ImmutableMarketplace : ModuleRules { - public ImmutableMarketplace(ReadOnlyTargetRules Target) : base(Target) - { - PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; + public ImmutableMarketplace(ReadOnlyTargetRules Target) : base(Target) + { + PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; - PublicDependencyModuleNames.AddRange( - new string[] - { - "Core", - "UMG" - } - ); + PublicDependencyModuleNames.AddRange(new string[] + { + "Core", + "UMG" + }); + + PrivateDependencyModuleNames.AddRange(new string[] + { + "CoreUObject", + "Engine", + "Slate", + "SlateCore", + "DeveloperSettings", + "HTTP" + }); + + PublicDependencyModuleNames.AddRange(new string[] + { + "ImmutableCore" + }); - PrivateDependencyModuleNames.AddRange( - new string[] - { - "CoreUObject", - "Engine", - "Slate", - "SlateCore", - "DeveloperSettings", - "HTTP" - } - ); - #if UE_5_1_OR_LATER - PublicDependencyModuleNames.AddRange( - new string[] - { - "WebBrowser", - } - ); + PublicDependencyModuleNames.AddRange(new string[] + { + "WebBrowser", + }); #else - PrivateDependencyModuleNames.Add("BluExtension"); - if (Target.Platform == UnrealTargetPlatform.Win64) - { - PublicDependencyModuleNames.Add("Blu"); - } + PrivateDependencyModuleNames.Add("BluExtension"); + if (Target.Platform == UnrealTargetPlatform.Win64) + { + PublicDependencyModuleNames.Add("Blu"); + } #endif - } + } } \ No newline at end of file diff --git a/Source/ImmutableMarketplace/Private/Bridge/ImmutableBridgeQueryParams.cpp b/Source/ImmutableMarketplace/Private/Bridge/ImmutableBridgeQueryParams.cpp new file mode 100644 index 0000000..e9b99aa --- /dev/null +++ b/Source/ImmutableMarketplace/Private/Bridge/ImmutableBridgeQueryParams.cpp @@ -0,0 +1 @@ +#include "Bridge/ImmutableBridgeQueryParams.h" \ No newline at end of file diff --git a/Source/ImmutableMarketplace/Private/ImmutableMarketplaceEnums.cpp b/Source/ImmutableMarketplace/Private/ImmutableMarketplaceEnums.cpp new file mode 100644 index 0000000..7e53e84 --- /dev/null +++ b/Source/ImmutableMarketplace/Private/ImmutableMarketplaceEnums.cpp @@ -0,0 +1 @@ +#include "ImmutableMarketplaceEnums.h" diff --git a/Source/ImmutableMarketplace/Private/ImmutableMarketplaceLinkConfig.cpp b/Source/ImmutableMarketplace/Private/ImmutableMarketplaceLinkConfig.cpp new file mode 100644 index 0000000..5fb9a9d --- /dev/null +++ b/Source/ImmutableMarketplace/Private/ImmutableMarketplaceLinkConfig.cpp @@ -0,0 +1,40 @@ +#include "ImmutableMarketplaceLinkConfig.h" + +#include "ImmutableEnums.h" + +#include "ImmutableMarketplaceEnums.h" + +FString UImmutableMarketplaceLinkConfig::OnRampBaseUrlSandbox = TEXT("https://global-stg.transak.com"); +FString UImmutableMarketplaceLinkConfig::OnRampBaseUrlProduction = TEXT("https://global.transak.com"); + +FString UImmutableMarketplaceLinkConfig::SwapBaseUrlSandbox = TEXT("https://checkout-playground.sandbox.immutable.com/checkout/swap"); +FString UImmutableMarketplaceLinkConfig::SwapBaseUrlProduction = TEXT("https://toolkit.immutable.com/checkout/swap"); + +FString UImmutableMarketplaceLinkConfig::BridgeBaseUrlSandbox = TEXT("https://checkout-playground.sandbox.immutable.com/checkout/squid"); +FString UImmutableMarketplaceLinkConfig::BridgeBaseUrlProduction = TEXT("https://toolkit.immutable.com/checkout/squid"); + +// These can be hardcoded as they are public API keys +FString UImmutableMarketplaceLinkConfig::ApiOnRampKeySandbox = TEXT("d14b44fb-0f84-4db5-affb-e044040d724b"); +FString UImmutableMarketplaceLinkConfig::ApiOnRampKeyProduction = TEXT("ad1bca70-d917-4628-bb0f-5609537498bc"); + +FString UImmutableMarketplaceLinkConfig::GetBaseUrl(EImmutableEnvironment Environment, EImmutableMarketplaceFlow Flow) +{ + switch (Flow) + { + case EImmutableMarketplaceFlow::OnRamp: + return Environment == EImmutableEnvironment::Sandbox ? OnRampBaseUrlSandbox : OnRampBaseUrlProduction; + + case EImmutableMarketplaceFlow::Swap: + return Environment == EImmutableEnvironment::Sandbox ? SwapBaseUrlSandbox : SwapBaseUrlProduction; + + case EImmutableMarketplaceFlow::Bridge: + return Environment == EImmutableEnvironment::Sandbox ? BridgeBaseUrlSandbox : BridgeBaseUrlProduction; + } + + return FString(); +} + +FString UImmutableMarketplaceLinkConfig::GetApiKey(EImmutableEnvironment Environment, EImmutableMarketplaceFlow Flow) +{ + return Flow == EImmutableMarketplaceFlow::OnRamp ? Environment == EImmutableEnvironment::Sandbox ? ApiOnRampKeySandbox : ApiOnRampKeyProduction : FString(); +} \ No newline at end of file diff --git a/Source/ImmutableMarketplace/Private/ImmutableMarketplaceLinkFactory.cpp b/Source/ImmutableMarketplace/Private/ImmutableMarketplaceLinkFactory.cpp new file mode 100644 index 0000000..0edb60b --- /dev/null +++ b/Source/ImmutableMarketplace/Private/ImmutableMarketplaceLinkFactory.cpp @@ -0,0 +1,109 @@ +#include "ImmutableMarketplaceLinkFactory.h" + +#include "PlatformHttp.h" + +#include "ImmutableMarketplaceEnums.h" +#include "ImmutableMarketplaceLinkConfig.h" + +FString UImmutableMarketplaceLinkFactory::GenerateOnRampLink(EImmutableEnvironment Environment, FString Email, FString WalletAddress, const FImmutableOnRampQueryParams& QueryParams, TMap ExtraQueryParams) +{ + auto FindExtraQueryParam = [&](const FString& Key, const FString& DefaultValue) -> FString + { + if (FString* Value = ExtraQueryParams.Find(Key)) + { + return *Value; + } + + return DefaultValue; + }; + + const FString BaseUrl = UImmutableMarketplaceLinkConfig::GetBaseUrl(Environment, EImmutableMarketplaceFlow::OnRamp); + const FString ApiKey = UImmutableMarketplaceLinkConfig::GetApiKey(Environment, EImmutableMarketplaceFlow::OnRamp); + + TArray QueryParamsArray + { + FString::Printf(TEXT("%s=%s"), TEXT("apiKey"), *FPlatformHttp::UrlEncode(ApiKey)), + FString::Printf(TEXT("%s=%s"), TEXT("cryptoCurrencyList"), *FPlatformHttp::UrlEncode(QueryParams.CryptoCurrencyList)), + FString::Printf(TEXT("%s=%s"), TEXT("defaultCryptoCurrency"), *FPlatformHttp::UrlEncode(QueryParams.DefaultCryptoCurrency)), + FString::Printf(TEXT("%s=%s"), TEXT("defaultFiatAmount"), *FPlatformHttp::UrlEncode(QueryParams.DefaultFiatAmount)), + FString::Printf(TEXT("%s=%s"), TEXT("defaultFiatCurrency"), *FPlatformHttp::UrlEncode(QueryParams.DefaultFiatCurrency)), + FString::Printf(TEXT("%s=%s"), TEXT("defaultPaymentMethod"), *FPlatformHttp::UrlEncode(FindExtraQueryParam(TEXT("defaultPaymentMethod"), TEXT("credit_debit_card")))), + FString::Printf(TEXT("%s=%s"), TEXT("disablePaymentMethods"), *FPlatformHttp::UrlEncode(FindExtraQueryParam("disablePaymentMethods", ""))), + FString::Printf(TEXT("%s=%s"), TEXT("disableWalletAddressForm"), *FPlatformHttp::UrlEncode(FindExtraQueryParam(TEXT("disableWalletAddressForm"), TEXT("true")))), + FString::Printf(TEXT("%s=%s"), TEXT("email"), *FPlatformHttp::UrlEncode(Email)), + FString::Printf(TEXT("%s=%s"), TEXT("exchangeScreenTitle"), *FPlatformHttp::UrlEncode(FindExtraQueryParam("exchangeScreenTitle", TEXT("Buy")))), + FString::Printf(TEXT("%s=%s"), TEXT("isAutoFillUserData"), *FPlatformHttp::UrlEncode(FindExtraQueryParam(TEXT("isAutoFillUserData"), TEXT("true")))), + FString::Printf(TEXT("%s=%s"), TEXT("network"), TEXT("immutablezkevm")), + FString::Printf(TEXT("%s=%s"), TEXT("productsAvailed"), TEXT("buy")), + FString::Printf(TEXT("%s=%s"), TEXT("themeColor"), *FPlatformHttp::UrlEncode(FindExtraQueryParam(TEXT("themeColor"), TEXT("0D0D0D")))), + FString::Printf(TEXT("%s=%s"), TEXT("walletAddress"), *FPlatformHttp::UrlEncode(WalletAddress)) + }; + + for (TTuple ExtraQueryParam : ExtraQueryParams) + { + QueryParamsArray.AddUnique(FString::Printf(TEXT("%s=%s"), *ExtraQueryParam.Key, *FPlatformHttp::UrlEncode(ExtraQueryParam.Value))); + } + + FString QueryString = FString::Join(QueryParamsArray, TEXT("&")); + + return FString::Printf(TEXT("%s?%s"), *BaseUrl, *QueryString); +} + +FString UImmutableMarketplaceLinkFactory::GenerateSwapLink(EImmutableEnvironment Environment, FString PublishableKey, const FImmutableSwapQueryParams& QueryParams) +{ + const FString BaseUrl = UImmutableMarketplaceLinkConfig::GetBaseUrl(Environment, EImmutableMarketplaceFlow::Swap); + + TArray QueryParamsArray; + + if (!PublishableKey.IsEmpty()) + { + QueryParamsArray.Add(FString::Printf(TEXT("%s=%s"), TEXT("publishableKey"), *FPlatformHttp::UrlEncode(PublishableKey))); + }; + + if (!QueryParams.FromTokenAddress.IsEmpty()) + { + QueryParamsArray.Add(FString::Printf(TEXT("%s=%s"), TEXT("fromTokenAddress"), *FPlatformHttp::UrlEncode(QueryParams.FromTokenAddress))); + } + + if (!QueryParams.ToTokenAddress.IsEmpty()) + { + QueryParamsArray.Add(FString::Printf(TEXT("%s=%s"), TEXT("toTokenAddress"), *FPlatformHttp::UrlEncode(QueryParams.ToTokenAddress))); + } + + FString QueryString = FString::Join(QueryParamsArray, TEXT("&")); + + return FString::Printf(TEXT("%s?%s"), *BaseUrl, *QueryString); +} + +FString UImmutableMarketplaceLinkFactory::GenerateBridgeLink(EImmutableEnvironment Environment, const FImmutableBridgeQueryParams& QueryParams) +{ + const FString BaseUrl = UImmutableMarketplaceLinkConfig::GetBaseUrl(Environment, EImmutableMarketplaceFlow::Bridge); + + TArray QueryParamsArray; + + if (!QueryParams.FromChainID.IsEmpty()) + { + QueryParamsArray.Add(FString::Printf(TEXT("%s=%s"),TEXT("fromChain"), *FPlatformHttp::UrlEncode(QueryParams.FromChainID))); + } + + if (!QueryParams.FromTokenAddress.IsEmpty()) + { + // Token address is case-sensitive. + QueryParamsArray.Add(FString::Printf(TEXT("%s=%s"), TEXT("fromToken"), *FPlatformHttp::UrlEncode(QueryParams.FromTokenAddress.ToLower()))); + } + + if (!QueryParams.ToChainID.IsEmpty()) + { + QueryParamsArray.Add(FString::Printf(TEXT("%s=%s"),TEXT("toChain"), *FPlatformHttp::UrlEncode(QueryParams.ToChainID))); + } + + if (!QueryParams.ToTokenAddress.IsEmpty()) + { + // Token address is case-sensitive. + QueryParamsArray.Add(FString::Printf(TEXT("%s=%s"),TEXT("toToken"), *FPlatformHttp::UrlEncode(QueryParams.ToTokenAddress.ToLower()))); + } + + FString QueryString = FString::Join(QueryParamsArray, TEXT("&")); + + return FString::Printf(TEXT("%s?%s"), *BaseUrl, *QueryString); +} \ No newline at end of file diff --git a/Source/ImmutableMarketplace/Private/OnRamp/ImmutableOnRampQueryParams.cpp b/Source/ImmutableMarketplace/Private/OnRamp/ImmutableOnRampQueryParams.cpp new file mode 100644 index 0000000..756fa7f --- /dev/null +++ b/Source/ImmutableMarketplace/Private/OnRamp/ImmutableOnRampQueryParams.cpp @@ -0,0 +1 @@ +#include "OnRamp/ImmutableOnRampQueryParams.h" \ No newline at end of file diff --git a/Source/ImmutableMarketplace/Private/OnRampWebBrowserWidget.cpp b/Source/ImmutableMarketplace/Private/OnRampWebBrowserWidget.cpp index 9747c36..47a6d83 100644 --- a/Source/ImmutableMarketplace/Private/OnRampWebBrowserWidget.cpp +++ b/Source/ImmutableMarketplace/Private/OnRampWebBrowserWidget.cpp @@ -1,9 +1,8 @@ #include "OnRampWebBrowserWidget.h" -#include "ImmutableMarketplaceSettings.h" #include "PlatformHttp.h" -#include "OnRampWidgetConfig.h" +#include "ImmutableMarketplaceLinkFactory.h" #if (ENGINE_MAJOR_VERSION >= 5 && ENGINE_MINOR_VERSION >= 1) #include "SWebBrowser.h" @@ -11,27 +10,35 @@ #include "UserInterface/BluWebBrowser.h" #endif -#define LOCTEXT_NAMESPACE "OnRampWidget" +#define LOCTEXT_NAMESPACE "OnRampWebBrowserWidget" DEFINE_LOG_CATEGORY(LogImmutableOnRampWidget); +UOnRampWidget::UOnRampWidget(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) +{ + QueryParams.DefaultCryptoCurrency = TEXT("IMX"); + QueryParams.DefaultFiatAmount = TEXT("50"); + QueryParams.DefaultFiatCurrency = TEXT("USD"); + QueryParams.CryptoCurrencyList = TEXT("imx,eth,usdc"); +} bool UOnRampWidget::IsReady() const { return bIsReady; } -void UOnRampWidget::Load(const FString& WalletAddress, const FString& Email, const FString& ProductsAvailed, const FString& ScreenTitle) +void UOnRampWidget::Load(const FString& WalletAddress, const FString& Email) { if (!WebBrowserWidget.IsValid()) { return; } - FString UrlToLoad = ComputePath(WalletAddress, Email, ProductsAvailed, ScreenTitle); - CallAndRegister_OnWhenReady(UOnRampWidget::FOnWhenReady::FDelegate::CreateWeakLambda(this, [this, UrlToLoad]() + const FString OnRampLink = UImmutableMarketplaceLinkFactory::GenerateOnRampLink(Environment, Email, WalletAddress, QueryParams, ExtraQueryParams); + + CallAndRegister_OnWhenReady(UOnRampWidget::FOnWhenReady::FDelegate::CreateWeakLambda(this, [this, OnRampLink]() { - WebBrowserWidget->LoadURL(UrlToLoad); + WebBrowserWidget->LoadURL(OnRampLink); OnWhenReady.RemoveAll(this); })); } @@ -78,80 +85,6 @@ TSharedRef UOnRampWidget::RebuildWidget() } } -FString UOnRampWidget::ComputePath(const FString& WalletAddress, const FString& Email, const FString& ProductsAvailed, const FString& ScreenTitle) -{ - auto Settings = GetDefault(); - - UOnRampWidgetConfig* OnRampWidgetConfig = Settings->DefaultOnRampWidgetConfig.GetDefaultObject(); - - if (!OnRampWidgetConfig) - { - UE_LOG(LogImmutableOnRampWidget, Error, TEXT("On ramp widget config is not assigned!")); - - return TEXT(""); - } - - FString Path = OnRampWidgetConfig->GetURL(); - TArray QueryParams; - - QueryParams.Add(FString(TEXT("apiKey=")) + FPlatformHttp::UrlEncode(OnRampWidgetConfig->GetAPIKey())); - QueryParams.Add(FString(TEXT("email=")) + FPlatformHttp::UrlEncode(Email)); - QueryParams.Add(FString(TEXT("walletAddress=")) + FPlatformHttp::UrlEncode(WalletAddress)); - QueryParams.Add(FString(TEXT("themeColor=")) + FPlatformHttp::UrlEncode(OnRampWidgetConfig->GetThemeColor().ToString())); - QueryParams.Add(FString(TEXT("isAutoFillUserData=")) + FPlatformHttp::UrlEncode(OnRampWidgetConfig->IsAutoFillUserData() ? TEXT("true") : TEXT("false"))); - QueryParams.Add(FString(TEXT("disableWalletAddressForm=")) + FPlatformHttp::UrlEncode(OnRampWidgetConfig->IsDisableWalletAddressForm() ? TEXT("true") : TEXT("false"))); - - if (!OnRampWidgetConfig->GetNetwork().IsEmpty()) - { - QueryParams.Add(FString(TEXT("network=")) + FPlatformHttp::UrlEncode(OnRampWidgetConfig->GetNetwork())); - } - - if (!ProductsAvailed.IsEmpty()) - { - QueryParams.Add(FString(TEXT("productsAvailed=")) + FPlatformHttp::UrlEncode(ProductsAvailed)); - } - - if (!ScreenTitle.IsEmpty()) - { - QueryParams.Add(FString(TEXT("exchangeScreenTitle=")) + FPlatformHttp::UrlEncode(ScreenTitle)); - } - - if (!OnRampWidgetConfig->GetDefaultCryptoCurrency().IsEmpty()) - { - QueryParams.Add(FString(TEXT("defaultCryptoCurrency=")) + FPlatformHttp::UrlEncode(OnRampWidgetConfig->GetDefaultCryptoCurrency())); - } - - if (!OnRampWidgetConfig->GetDefaultFiatAmount().IsEmpty()) - { - QueryParams.Add(FString(TEXT("defaultFiatAmount=")) + FPlatformHttp::UrlEncode(OnRampWidgetConfig->GetDefaultFiatAmount())); - } - - if (!OnRampWidgetConfig->GetDefaultFiatCurrency().IsEmpty()) - { - QueryParams.Add(FString(TEXT("defaultFiatCurrency=")) + FPlatformHttp::UrlEncode(OnRampWidgetConfig->GetDefaultFiatCurrency())); - } - - if (!OnRampWidgetConfig->GetDefaultPaymentMethod().IsEmpty()) - { - QueryParams.Add(FString(TEXT("defaultPaymentMethod=")) + FPlatformHttp::UrlEncode(OnRampWidgetConfig->GetDefaultPaymentMethod())); - } - - if (OnRampWidgetConfig->GetCryptoCurrencyList().Num() > 0) - { - QueryParams.Add(FString(TEXT("cryptoCurrencyList=")) + FPlatformHttp::UrlEncode(FString::Join(OnRampWidgetConfig->GetCryptoCurrencyList(), TEXT(",")))); - } - - if (OnRampWidgetConfig->GetDisablePaymentMethods().Num() > 0) - { - QueryParams.Add(FString(TEXT("disablePaymentMethods=")) + FPlatformHttp::UrlEncode(FString::Join(OnRampWidgetConfig->GetDisablePaymentMethods(), TEXT(",")))); - } - - Path += TEXT("?"); - Path += FString::Join(QueryParams, TEXT("&")); - - return Path; -} - void UOnRampWidget::HandleOnUrlChanged(const FText& Text) { if (Text.EqualToCaseIgnored(FText::FromString(InitialURL))) diff --git a/Source/ImmutableMarketplace/Private/Swap/ImmutableSwapQueryParams.cpp b/Source/ImmutableMarketplace/Private/Swap/ImmutableSwapQueryParams.cpp new file mode 100644 index 0000000..f1623cc --- /dev/null +++ b/Source/ImmutableMarketplace/Private/Swap/ImmutableSwapQueryParams.cpp @@ -0,0 +1 @@ +#include "Swap/ImmutableSwapQueryParams.h" \ No newline at end of file diff --git a/Source/ImmutableMarketplace/Public/Bridge/ImmutableBridgeQueryParams.h b/Source/ImmutableMarketplace/Public/Bridge/ImmutableBridgeQueryParams.h new file mode 100644 index 0000000..e8f1f4f --- /dev/null +++ b/Source/ImmutableMarketplace/Public/Bridge/ImmutableBridgeQueryParams.h @@ -0,0 +1,29 @@ +#pragma once + +#include "ImmutableBridgeQueryParams.generated.h" + +/** + * Represents the query parameters for generating a bridge URL. + */ +USTRUCT(BlueprintType) +struct IMMUTABLEMARKETPLACE_API FImmutableBridgeQueryParams +{ + GENERATED_BODY() + +public: + /** The ID of the source blockchain (default is null). */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Immutable|Marketplace") + FString FromChainID; + + /** The address of the token being moved from (default is null). */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Immutable|Marketplace") + FString FromTokenAddress; + + /** The ID of the destination blockchain (default is null). */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Immutable|Marketplace") + FString ToChainID; + + /** The address of the token being moved to (default is null). */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Immutable|Marketplace") + FString ToTokenAddress; +}; \ No newline at end of file diff --git a/Source/ImmutableMarketplace/Public/ImmutableMarketplaceDeveloperSettings.h b/Source/ImmutableMarketplace/Public/ImmutableMarketplaceDeveloperSettings.h new file mode 100644 index 0000000..7d9cfed --- /dev/null +++ b/Source/ImmutableMarketplace/Public/ImmutableMarketplaceDeveloperSettings.h @@ -0,0 +1,16 @@ +#pragma once + +#include "Engine/DeveloperSettings.h" + +#include "ImmutableMarketplaceDeveloperSettings.generated.h" + +/** + * Immutable Marketplace developer settings is a configuration class for the ImmutableMarketplace module. + * This class contains settings that can be adjusted to control the behavior + * of the ImmutableMarketplace tools within the Unreal Engine environment. + */ +UCLASS(Config = "Game", DefaultConfig) +class IMMUTABLEMARKETPLACE_API UImmutableMarketplaceDeveloperSettings : public UDeveloperSettings +{ + GENERATED_BODY() +}; \ No newline at end of file diff --git a/Source/ImmutableMarketplace/Public/ImmutableMarketplaceEnums.h b/Source/ImmutableMarketplace/Public/ImmutableMarketplaceEnums.h new file mode 100644 index 0000000..9a59dac --- /dev/null +++ b/Source/ImmutableMarketplace/Public/ImmutableMarketplaceEnums.h @@ -0,0 +1,11 @@ +#pragma once + +#include "ImmutableMarketplaceEnums.generated.h" + +UENUM(BlueprintType) +enum class EImmutableMarketplaceFlow : uint8 +{ + OnRamp, + Swap, + Bridge +}; \ No newline at end of file diff --git a/Source/ImmutableMarketplace/Public/ImmutableMarketplaceLinkConfig.h b/Source/ImmutableMarketplace/Public/ImmutableMarketplaceLinkConfig.h new file mode 100644 index 0000000..f953f38 --- /dev/null +++ b/Source/ImmutableMarketplace/Public/ImmutableMarketplaceLinkConfig.h @@ -0,0 +1,37 @@ +#pragma once + +#include "ImmutableMarketplaceLinkConfig.generated.h" + +enum class EImmutableEnvironment : uint8; + +enum class EImmutableMarketplaceFlow : uint8; + +/** + * + */ +UCLASS() +class IMMUTABLEMARKETPLACE_API UImmutableMarketplaceLinkConfig : public UObject +{ + GENERATED_BODY() + +public: + UFUNCTION(BlueprintPure, Category = "Immutable") + static FString GetBaseUrl(EImmutableEnvironment Environment, EImmutableMarketplaceFlow Flow); + + UFUNCTION(BlueprintPure, Category = "Immutable") + static FString GetApiKey(EImmutableEnvironment Environment, EImmutableMarketplaceFlow Flow); + +private: + static FString OnRampBaseUrlSandbox; + static FString OnRampBaseUrlProduction; + + static FString SwapBaseUrlSandbox; + static FString SwapBaseUrlProduction; + + static FString BridgeBaseUrlSandbox; + static FString BridgeBaseUrlProduction; + + // These can be hardcoded as they are public API keys + static FString ApiOnRampKeySandbox; + static FString ApiOnRampKeyProduction; +}; \ No newline at end of file diff --git a/Source/ImmutableMarketplace/Public/ImmutableMarketplaceLinkFactory.h b/Source/ImmutableMarketplace/Public/ImmutableMarketplaceLinkFactory.h new file mode 100644 index 0000000..e0eff99 --- /dev/null +++ b/Source/ImmutableMarketplace/Public/ImmutableMarketplaceLinkFactory.h @@ -0,0 +1,57 @@ +#pragma once + +#include "Kismet/BlueprintFunctionLibrary.h" + +#include "Bridge/ImmutableBridgeQueryParams.h" +#include "OnRamp/ImmutableOnRampQueryParams.h" +#include "Swap/ImmutableSwapQueryParams.h" + +#include "ImmutableMarketplaceLinkFactory.generated.h" + +enum class EImmutableEnvironment : uint8; + +UCLASS() +class IMMUTABLEMARKETPLACE_API UImmutableMarketplaceLinkFactory : public UBlueprintFunctionLibrary +{ + GENERATED_BODY() + +public: + /** + * Generates a URL for the on-ramp flow. + * + * @param Environment Specifies the environment (Sandbox or Production). + * @param Email The user's email address, pre-filled in the on-ramp flow. + * @param WalletAddress The user's wallet address, where tokens will be sent. + * @param QueryParams The query parameters for the on-ramp flow. Uses default values if not specified. + * @param ExtraQueryParams Additional query parameters. See https://docs.transak.com/docs/query-parameters for possible fields. + * If ExtraQueryParams includes any fields that are already defined in QueryParams, the values in QueryParams will take precedence. + * For example, if ExtraQueryParams contains "defaultFiatAmount", it will be ignored and the value from QueryParams.DefaultFiatAmount will be used instead. + * + * @return The generated on-ramp URL. + */ + UFUNCTION(BlueprintCallable, Category = "Immutable|Marketplace") + static FString GenerateOnRampLink(EImmutableEnvironment Environment, FString Email, FString WalletAddress, const FImmutableOnRampQueryParams& QueryParams, TMap ExtraQueryParams); + + /** + * Generates a link for the swap flow. + * + * @param Environment Specifies the environment (Sandbox or Production). + * @param PublishableKey The publishable key obtained from https://hub.immutable.com/. See https://docs.immutable.com/api/zkEVM/apikeys for more details. + * @param QueryParams The query parameters for the swap flow. Uses default values if not specified. + * + * @return The generated swap URL. + */ + UFUNCTION(BlueprintCallable, Category = "Immutable|Marketplace") + static FString GenerateSwapLink(EImmutableEnvironment Environment, FString PublishableKey, const FImmutableSwapQueryParams& QueryParams); + + /** + * Generates a link for the bridge flow. + * + * @param Environment Specifies the environment (Sandbox or Production). + * @param QueryParams The query parameters for the bridge flow. Uses default values if not specified. + * + * @return The generated bridge URL. + */ + UFUNCTION(BlueprintCallable, Category = "Immutable|Marketplace") + static FString GenerateBridgeLink(EImmutableEnvironment Environment, const FImmutableBridgeQueryParams& QueryParams); +}; \ No newline at end of file diff --git a/Source/ImmutableMarketplace/Public/ImmutableMarketplaceSettings.h b/Source/ImmutableMarketplace/Public/ImmutableMarketplaceSettings.h deleted file mode 100644 index d1da3e1..0000000 --- a/Source/ImmutableMarketplace/Public/ImmutableMarketplaceSettings.h +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once - -#include "Engine/DeveloperSettings.h" -#include "OnRampWidgetConfig.h" - -#include "ImmutableMarketplaceSettings.generated.h" - - -/** - * Immutable Marketplace developer settings is a configuration class for the ImmutableMarketplace module. - * This class contains settings that can be adjusted to control the behavior - * of the ImmutableMarketplace tools within the Unreal Engine environment. - */ -UCLASS(config = Game, defaultconfig, meta = (DisplayName = "Immutable Marketplace")) -class IMMUTABLEMARKETPLACE_API UImmutableMarketplaceSettings : public UDeveloperSettings -{ - GENERATED_BODY() - -public: - /// The default on ramp widget configuration class. - /// This property holds a reference to a subclass of UTransakConfig, - /// which is used to load on ramp widget in web browser. - UPROPERTY(Config, EditAnywhere, BlueprintReadOnly) - TSubclassOf DefaultOnRampWidgetConfig; -}; diff --git a/Source/ImmutableMarketplace/Public/OnRamp/ImmutableOnRampQueryParams.h b/Source/ImmutableMarketplace/Public/OnRamp/ImmutableOnRampQueryParams.h new file mode 100644 index 0000000..4b33b89 --- /dev/null +++ b/Source/ImmutableMarketplace/Public/OnRamp/ImmutableOnRampQueryParams.h @@ -0,0 +1,28 @@ +#pragma once + +#include "ImmutableOnRampQueryParams.generated.h" + +/** + * Represents the query parameters for generating an on-ramp URL. + */ +USTRUCT(BlueprintType) +struct IMMUTABLEMARKETPLACE_API FImmutableOnRampQueryParams +{ + GENERATED_BODY() + + /** The cryptocurrency to purchase (default: "IMX"). */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Immutable|Marketplace") + FString DefaultCryptoCurrency; + + /** The amount of fiat currency to spend when purchasing cryptocurrency (default: "50"). */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Immutable|Marketplace") + FString DefaultFiatAmount; + + /** The fiat currency to use (default: "USD"). */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Immutable|Marketplace") + FString DefaultFiatCurrency; + + /** A comma-separated list of available cryptocurrencies for purchase (default: "imx,eth,usdc"). */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Immutable|Marketplace") + FString CryptoCurrencyList; +}; \ No newline at end of file diff --git a/Source/ImmutableMarketplace/Public/OnRampWebBrowserWidget.h b/Source/ImmutableMarketplace/Public/OnRampWebBrowserWidget.h index a16b8d4..717529a 100644 --- a/Source/ImmutableMarketplace/Public/OnRampWebBrowserWidget.h +++ b/Source/ImmutableMarketplace/Public/OnRampWebBrowserWidget.h @@ -2,8 +2,10 @@ #include "Components/Widget.h" -#include "OnRampWebBrowserWidget.generated.h" +#include "ImmutableEnums.h" +#include "OnRamp/ImmutableOnRampQueryParams.h" +#include "OnRampWebBrowserWidget.generated.h" DECLARE_LOG_CATEGORY_EXTERN(LogImmutableOnRampWidget, Log, All); @@ -15,7 +17,6 @@ class SWebBrowser; class SBluWebBrowser; #endif - /** * A custom web browser widget for Immutable On Ramp funds transactions. */ @@ -28,6 +29,8 @@ class IMMUTABLEMARKETPLACE_API UOnRampWidget : public UWidget DECLARE_MULTICAST_DELEGATE(FOnWhenReady); public: + UOnRampWidget(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get()); + /** * Check if the web browser widget is ready to be loaded. * @@ -41,11 +44,9 @@ class IMMUTABLEMARKETPLACE_API UOnRampWidget : public UWidget * * @param WalletAddress The wallet address to load. * @param Email The email associated with the user. - * @param ProductsAvailed The products availed by the user. - * @param ScreenTitle The title of the screen to load. */ UFUNCTION(BlueprintCallable) - void Load(const FString& WalletAddress, const FString& Email, const FString& ProductsAvailed, const FString& ScreenTitle); + void Load(const FString& WalletAddress, const FString& Email); FDelegateHandle CallAndRegister_OnWhenReady(FOnWhenReady::FDelegate Delegate); @@ -55,8 +56,6 @@ class IMMUTABLEMARKETPLACE_API UOnRampWidget : public UWidget // End of UWidget interface protected: - FString ComputePath(const FString& WalletAddress, const FString& Email, const FString& ProductsAvailed, const FString& ScreenTitle); - void HandleOnUrlChanged(const FText& Text); #if (ENGINE_MAJOR_VERSION >= 5 && ENGINE_MINOR_VERSION >= 1) void HandleOnConsoleMessage(const FString& Message, const FString& Source, int32 Line, EWebBrowserConsoleLogSeverity Severity); @@ -68,6 +67,15 @@ class IMMUTABLEMARKETPLACE_API UOnRampWidget : public UWidget UPROPERTY(EditDefaultsOnly, BlueprintReadOnly) FString InitialURL = TEXT("about:blank"); + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly) + EImmutableEnvironment Environment = EImmutableEnvironment::Sandbox; + + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly) + FImmutableOnRampQueryParams QueryParams; + + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly) + TMap ExtraQueryParams; + #if (ENGINE_MAJOR_VERSION >= 5 && ENGINE_MINOR_VERSION >= 1) TSharedPtr WebBrowserWidget; #else diff --git a/Source/ImmutableMarketplace/Public/OnRampWidgetConfig.h b/Source/ImmutableMarketplace/Public/OnRampWidgetConfig.h deleted file mode 100644 index 6d581a0..0000000 --- a/Source/ImmutableMarketplace/Public/OnRampWidgetConfig.h +++ /dev/null @@ -1,237 +0,0 @@ -#pragma once - -#include "OnRampWidgetConfig.generated.h" - - -UENUM(BlueprintType) -enum class ETransakEnvironment : uint8 -{ - Sandbox, - Production, -}; - -/** - * @class UOnRampWidgetConfig - * @brief Configuration settings for on ramp widget. - */ -UCLASS(Abstract, Blueprintable, ClassGroup = Immutable) -class IMMUTABLEMARKETPLACE_API UOnRampWidgetConfig : public UObject -{ - GENERATED_BODY() - -public: - /** - * Get the URL based on the current environment setting. - * @return The URL corresponding to the current environment setting. - */ - FString GetURL() const - { - switch (Environment) - { - case ETransakEnvironment::Production: - return TEXT("https://global.transak.com/"); - default: - case ETransakEnvironment::Sandbox: - return TEXT("https://global-stg.transak.com/"); - } - } - - /** - * Get the API key based on the current environment. - * @return The API key corresponding to the current environment. - */ - FString GetAPIKey() const - { - switch (Environment) - { - case ETransakEnvironment::Production: - return TEXT("ad1bca70-d917-4628-bb0f-5609537498bc"); - default: - case ETransakEnvironment::Sandbox: - return TEXT("d14b44fb-0f84-4db5-affb-e044040d724b"); - } - } - - /** - * @details More details could be found under the class parameter - * @return Network as FString - */ - const FString& GetNetwork() const - { - return Network; - } - - /** - * @details More details could be found under the class parameter - * @return DefaultFiatCurrency as FString - */ - const FString& GetDefaultFiatCurrency() const - { - return DefaultFiatCurrency; - } - - /** - * @details More details could be found under the class parameter - * @return DefaultFiatAmount as FString - */ - const FString& GetDefaultFiatAmount() const - { - return DefaultFiatAmount; - } - - /** - * @details More details could be found under the class parameter - * @return DefaultCryptoCurrency as FString - */ - const FString& GetDefaultCryptoCurrency() const - { - return DefaultCryptoCurrency; - } - - /** - * @details More details could be found under the class parameter - * @return DefaultPaymentMethod as FString - */ - const FString& GetDefaultPaymentMethod() const - { - return DefaultPaymentMethod; - } - - /** - * @details More details could be found under the class parameter - * @return DisablePaymentMethods as array of FString - */ - const TArray& GetDisablePaymentMethods() const - { - return DisablePaymentMethods; - } - - /** - * @details More details could be found under the class parameter - * @return bIsAutoFillUserData as bool - */ - bool IsAutoFillUserData() const - { - return bIsAutoFillUserData; - } - - /** - * @details More details could be found under the class parameter - * @return bDisableWalletAddressForm as bool - */ - bool IsDisableWalletAddressForm() const - { - return bDisableWalletAddressForm; - } - - /** - * @details More details could be found under the class parameter - * @return CryptoCurrencyList as array of FString - */ - const TArray& GetCryptoCurrencyList() const - { - return CryptoCurrencyList; - } - - /** - * @details More details could be found under the class parameter - * @return ThemeColor as FLinearColor - */ - const FLinearColor& GetThemeColor() const - { - return ThemeColor; - } - -protected: - /** - * Specifies the environment for transactions. - * @note The default environment is set to the Sandbox environment. - */ - UPROPERTY(EditDefaultsOnly, Category = "General") - ETransakEnvironment Environment = ETransakEnvironment::Sandbox; - - /** - * The default payment method you would prefer the customer to buy/sell with. - * If you pass this param, the payment method will be selected by default and the customer can - * also select another payment method. - */ - UPROPERTY(EditDefaultsOnly, Category = "Fiat") - FString DefaultPaymentMethod; - - /** - * The three letter code of the fiat currency your user will send/receive while buying/selling cryptocurrency. - * Users can change the fiat currency if this is passed. If the fiat currency is not supported by - * a specific product type (BUY/SELL) then the default widget will load with all the supported fiat - * currencies for that product type. - */ - UPROPERTY(EditDefaultsOnly, Category = "Fiat") - FString DefaultFiatCurrency; - - /** - * An integer amount representing how much the customer wants to spend/receive. - * Users can change the fiat amount if this is passed. - */ - UPROPERTY(EditDefaultsOnly, Category = "Fiat") - FString DefaultFiatAmount; - - /** - * The default cryptocurrency you would prefer the customer to buy/sell. - * If you pass this param, the currency will be selected by default, but the customer will - * still be able to select another cryptocurrency. Please ensure that the currency code passed by - * you is available for the specific product type (BUY/SELL). - * If you pass a value that is not supported by BUY/SELL, then the default widget will load. - */ - UPROPERTY(EditDefaultsOnly, Category = "Fiat") - FString DefaultCryptoCurrency; - - /** - * Crypto network that you would allow your customers to buy. - * You can get the supporting networks by opening http://global.transak.com and then go to - * cryptocurrencies select screen. Only the cryptocurrencies supported by this network for - * the specific product type (BUY/SELL) will be shown in the widget. - * If the network selected is not supported by a product type (BUY/SELL) then the default widget will - * all supported networks will be shown. - */ - UPROPERTY(EditDefaultsOnly, Category = "Blockchain") - FString Network; - - /** - * A comma-separated list of payment methods you want to disable and hide from the customers. - * Refer here to the list of supported params for the payment method. - */ - UPROPERTY(EditDefaultsOnly, Category = "Fiat") - TArray DisablePaymentMethods; - - /** - * When true, then the email address will be auto-filled, but the screen will not be skipped. - * User can edit their email address, basic data like first name & the address. - * This parameter will be ignored if email or userData are not passed. - */ - UPROPERTY(EditDefaultsOnly, Category = "User") - bool bIsAutoFillUserData = true; - - /** - * When true, the customer will not be able to change the destination address of - * where the cryptocurrency is sent to. - */ - UPROPERTY(EditDefaultsOnly, Category = "Fiat") - bool bDisableWalletAddressForm = true; - - /** - * A comma-separated list of cryptoCurrencies that you would allow your customers to buy/sell. - * Only these crypto currencies will be shown in the widget. This will be a string of comma - * separated values each of which will represent a valid cryptoCurrency code. - * Please ensure that the crypto currency codes passed in the list are available for the specific - * product type (BUY/SELL). If even one of the crypto currency codes in the list is supported by - * the specific product type (BUY/SELL), then it will be honored, otherwise the default widget will - * load for the product type for which none of the crypto currency codes are supported. - */ - UPROPERTY(EditDefaultsOnly, Category = "Fiat") - TArray CryptoCurrencyList; - - /** - * The theme color code for the widget main color. It is used for buttons, - */ - UPROPERTY(EditDefaultsOnly, Category = "Theme") - FLinearColor ThemeColor; -}; diff --git a/Source/ImmutableMarketplace/Public/Swap/ImmutableSwapQueryParams.h b/Source/ImmutableMarketplace/Public/Swap/ImmutableSwapQueryParams.h new file mode 100644 index 0000000..0941e49 --- /dev/null +++ b/Source/ImmutableMarketplace/Public/Swap/ImmutableSwapQueryParams.h @@ -0,0 +1,21 @@ +#pragma once + +#include "ImmutableSwapQueryParams.generated.h" + +/** + * Represents the query parameters for generating a swap URL. + */ +USTRUCT(BlueprintType) +struct IMMUTABLEMARKETPLACE_API FImmutableSwapQueryParams +{ + GENERATED_BODY() + +public: + /** The address of the token being swapped from (default is null). */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Immutable|Marketplace") + FString FromTokenAddress; + + /** The address of the token being swapped to (default is null). */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Immutable|Marketplace") + FString ToTokenAddress; +}; \ No newline at end of file From 21b27f531d775694de28d91611cc04b49d102f89 Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Thu, 30 Jan 2025 09:22:46 +1000 Subject: [PATCH 02/35] fix: ensure queryparams are set to their correct default values #3552 --- .../Public/Bridge/ImmutableBridgeQueryParams.h | 8 ++++---- .../Public/OnRamp/ImmutableOnRampQueryParams.h | 9 +++++---- .../Public/Swap/ImmutableSwapQueryParams.h | 4 ++-- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/Source/ImmutableMarketplace/Public/Bridge/ImmutableBridgeQueryParams.h b/Source/ImmutableMarketplace/Public/Bridge/ImmutableBridgeQueryParams.h index e8f1f4f..8b773e6 100644 --- a/Source/ImmutableMarketplace/Public/Bridge/ImmutableBridgeQueryParams.h +++ b/Source/ImmutableMarketplace/Public/Bridge/ImmutableBridgeQueryParams.h @@ -11,19 +11,19 @@ struct IMMUTABLEMARKETPLACE_API FImmutableBridgeQueryParams GENERATED_BODY() public: - /** The ID of the source blockchain (default is null). */ + /** The ID of the source blockchain (default: ""). */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Immutable|Marketplace") FString FromChainID; - /** The address of the token being moved from (default is null). */ + /** The address of the token being moved from (default: ""). */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Immutable|Marketplace") FString FromTokenAddress; - /** The ID of the destination blockchain (default is null). */ + /** The ID of the destination blockchain (default: ""). */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Immutable|Marketplace") FString ToChainID; - /** The address of the token being moved to (default is null). */ + /** The address of the token being moved to (default: ""). */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Immutable|Marketplace") FString ToTokenAddress; }; \ No newline at end of file diff --git a/Source/ImmutableMarketplace/Public/OnRamp/ImmutableOnRampQueryParams.h b/Source/ImmutableMarketplace/Public/OnRamp/ImmutableOnRampQueryParams.h index 4b33b89..f4ca0b1 100644 --- a/Source/ImmutableMarketplace/Public/OnRamp/ImmutableOnRampQueryParams.h +++ b/Source/ImmutableMarketplace/Public/OnRamp/ImmutableOnRampQueryParams.h @@ -10,19 +10,20 @@ struct IMMUTABLEMARKETPLACE_API FImmutableOnRampQueryParams { GENERATED_BODY() +public: /** The cryptocurrency to purchase (default: "IMX"). */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Immutable|Marketplace") - FString DefaultCryptoCurrency; + FString DefaultCryptoCurrency = TEXT("IMX"); /** The amount of fiat currency to spend when purchasing cryptocurrency (default: "50"). */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Immutable|Marketplace") - FString DefaultFiatAmount; + FString DefaultFiatAmount = TEXT("50"); /** The fiat currency to use (default: "USD"). */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Immutable|Marketplace") - FString DefaultFiatCurrency; + FString DefaultFiatCurrency = TEXT("USD"); /** A comma-separated list of available cryptocurrencies for purchase (default: "imx,eth,usdc"). */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Immutable|Marketplace") - FString CryptoCurrencyList; + FString CryptoCurrencyList = TEXT("imx,eth,usdc"); }; \ No newline at end of file diff --git a/Source/ImmutableMarketplace/Public/Swap/ImmutableSwapQueryParams.h b/Source/ImmutableMarketplace/Public/Swap/ImmutableSwapQueryParams.h index 0941e49..1e45d9a 100644 --- a/Source/ImmutableMarketplace/Public/Swap/ImmutableSwapQueryParams.h +++ b/Source/ImmutableMarketplace/Public/Swap/ImmutableSwapQueryParams.h @@ -11,11 +11,11 @@ struct IMMUTABLEMARKETPLACE_API FImmutableSwapQueryParams GENERATED_BODY() public: - /** The address of the token being swapped from (default is null). */ + /** The address of the token being swapped from (default: ""). */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Immutable|Marketplace") FString FromTokenAddress; - /** The address of the token being swapped to (default is null). */ + /** The address of the token being swapped to (default: ""). */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Immutable|Marketplace") FString ToTokenAddress; }; \ No newline at end of file From e8222ba6ad3cecf16287c4836889c064818786aa Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Fri, 31 Jan 2025 08:09:35 +1000 Subject: [PATCH 03/35] fix: inconsistent naming for for on ramp widget (#3555) --- .../ImmutableMarketplaceOnRampWidget.cpp} | 16 ++++++++-------- .../ImmutableMarketplaceOnRampWidget.h} | 6 +++--- 2 files changed, 11 insertions(+), 11 deletions(-) rename Source/ImmutableMarketplace/Private/{OnRampWebBrowserWidget.cpp => OnRamp/ImmutableMarketplaceOnRampWidget.cpp} (76%) rename Source/ImmutableMarketplace/Public/{OnRampWebBrowserWidget.h => OnRamp/ImmutableMarketplaceOnRampWidget.h} (89%) diff --git a/Source/ImmutableMarketplace/Private/OnRampWebBrowserWidget.cpp b/Source/ImmutableMarketplace/Private/OnRamp/ImmutableMarketplaceOnRampWidget.cpp similarity index 76% rename from Source/ImmutableMarketplace/Private/OnRampWebBrowserWidget.cpp rename to Source/ImmutableMarketplace/Private/OnRamp/ImmutableMarketplaceOnRampWidget.cpp index 47a6d83..a2063ec 100644 --- a/Source/ImmutableMarketplace/Private/OnRampWebBrowserWidget.cpp +++ b/Source/ImmutableMarketplace/Private/OnRamp/ImmutableMarketplaceOnRampWidget.cpp @@ -1,4 +1,4 @@ -#include "OnRampWebBrowserWidget.h" +#include "OnRamp/ImmutableMarketplaceOnRampWidget.h" #include "PlatformHttp.h" @@ -14,7 +14,7 @@ DEFINE_LOG_CATEGORY(LogImmutableOnRampWidget); -UOnRampWidget::UOnRampWidget(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) +UImmutableMarketplaceOnRampWidget::UImmutableMarketplaceOnRampWidget(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { QueryParams.DefaultCryptoCurrency = TEXT("IMX"); QueryParams.DefaultFiatAmount = TEXT("50"); @@ -22,12 +22,12 @@ UOnRampWidget::UOnRampWidget(const FObjectInitializer& ObjectInitializer) : Supe QueryParams.CryptoCurrencyList = TEXT("imx,eth,usdc"); } -bool UOnRampWidget::IsReady() const +bool UImmutableMarketplaceOnRampWidget::IsReady() const { return bIsReady; } -void UOnRampWidget::Load(const FString& WalletAddress, const FString& Email) +void UImmutableMarketplaceOnRampWidget::Load(const FString& WalletAddress, const FString& Email) { if (!WebBrowserWidget.IsValid()) { @@ -36,14 +36,14 @@ void UOnRampWidget::Load(const FString& WalletAddress, const FString& Email) const FString OnRampLink = UImmutableMarketplaceLinkFactory::GenerateOnRampLink(Environment, Email, WalletAddress, QueryParams, ExtraQueryParams); - CallAndRegister_OnWhenReady(UOnRampWidget::FOnWhenReady::FDelegate::CreateWeakLambda(this, [this, OnRampLink]() + CallAndRegister_OnWhenReady(UImmutableMarketplaceOnRampWidget::FOnWhenReady::FDelegate::CreateWeakLambda(this, [this, OnRampLink]() { WebBrowserWidget->LoadURL(OnRampLink); OnWhenReady.RemoveAll(this); })); } -FDelegateHandle UOnRampWidget::CallAndRegister_OnWhenReady(FOnWhenReady::FDelegate Delegate) +FDelegateHandle UImmutableMarketplaceOnRampWidget::CallAndRegister_OnWhenReady(FOnWhenReady::FDelegate Delegate) { if (bIsReady) { @@ -53,7 +53,7 @@ FDelegateHandle UOnRampWidget::CallAndRegister_OnWhenReady(FOnWhenReady::FDelega return OnWhenReady.Add(Delegate); } -TSharedRef UOnRampWidget::RebuildWidget() +TSharedRef UImmutableMarketplaceOnRampWidget::RebuildWidget() { if (IsDesignTime()) { @@ -85,7 +85,7 @@ TSharedRef UOnRampWidget::RebuildWidget() } } -void UOnRampWidget::HandleOnUrlChanged(const FText& Text) +void UImmutableMarketplaceOnRampWidget::HandleOnUrlChanged(const FText& Text) { if (Text.EqualToCaseIgnored(FText::FromString(InitialURL))) { diff --git a/Source/ImmutableMarketplace/Public/OnRampWebBrowserWidget.h b/Source/ImmutableMarketplace/Public/OnRamp/ImmutableMarketplaceOnRampWidget.h similarity index 89% rename from Source/ImmutableMarketplace/Public/OnRampWebBrowserWidget.h rename to Source/ImmutableMarketplace/Public/OnRamp/ImmutableMarketplaceOnRampWidget.h index 717529a..267ef5b 100644 --- a/Source/ImmutableMarketplace/Public/OnRampWebBrowserWidget.h +++ b/Source/ImmutableMarketplace/Public/OnRamp/ImmutableMarketplaceOnRampWidget.h @@ -5,7 +5,7 @@ #include "ImmutableEnums.h" #include "OnRamp/ImmutableOnRampQueryParams.h" -#include "OnRampWebBrowserWidget.generated.h" +#include "ImmutableMarketplaceOnRampWidget.generated.h" DECLARE_LOG_CATEGORY_EXTERN(LogImmutableOnRampWidget, Log, All); @@ -21,7 +21,7 @@ class SBluWebBrowser; * A custom web browser widget for Immutable On Ramp funds transactions. */ UCLASS() -class IMMUTABLEMARKETPLACE_API UOnRampWidget : public UWidget +class IMMUTABLEMARKETPLACE_API UImmutableMarketplaceOnRampWidget : public UWidget { GENERATED_BODY() @@ -29,7 +29,7 @@ class IMMUTABLEMARKETPLACE_API UOnRampWidget : public UWidget DECLARE_MULTICAST_DELEGATE(FOnWhenReady); public: - UOnRampWidget(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get()); + UImmutableMarketplaceOnRampWidget(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get()); /** * Check if the web browser widget is ready to be loaded. From 016fec332d4a12784e4d19d7be4af0ddb16fc5bb Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Mon, 3 Feb 2025 10:21:32 +1000 Subject: [PATCH 04/35] fix: errors after onrampwidget got renamed (#3558) --- .../ImtblAuthenticatedWidget4_26.uasset | Bin 602058 -> 600183 bytes .../ImtblOnRampWidget4_26.uasset | Bin 43790 -> 2471 bytes .../Marketplace/ImtblOnRampWidget4_26.uasset | Bin 0 -> 46070 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Content/BlueprintSampleContent/Marketplace/ImtblOnRampWidget4_26.uasset diff --git a/Content/BlueprintSampleContent/ImtblAuthenticatedWidget4_26.uasset b/Content/BlueprintSampleContent/ImtblAuthenticatedWidget4_26.uasset index 1b92d45baf70a7ddee5fab3fe9463441ede4b5a7..b50091ee0b7d3feefd126a9973ca90b8c91b6268 100644 GIT binary patch delta 44001 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 TP~!f*Pr!DAd;h?I7dQPseO?na diff --git a/Content/BlueprintSampleContent/ImtblOnRampWidget4_26.uasset b/Content/BlueprintSampleContent/ImtblOnRampWidget4_26.uasset index f4c8375ca798b02704ac51def00fb59176d0c7b2..b5c53b6e167430472535560002c00c514d5d5440 100644 GIT binary patch literal 2471 zcmcImO-vI}5Pkxp@~ij*Y9w$G1M;&?sp5g8^oI~A7zmLI)TMpm!gkwiABvKw37TM{ z2ZI+68iOQy@L-IFL}MZ*9*7?FYU0J z43*xQ3x~reQwhmPAsTIh_qWrJrl#v|hB7}0qt@rnibJqx+D6D`SeyL{)f9KYy9%_6 zVXYBt!cjpmnXMM5(^>7b3s#dL)Hv#@oep!A{fK5@1}|x71g|ZyBL5DL1e$>rpMrEk z3Ii|95ALToUaQT&x-gkBIF{pA$2&V*mmj|=oXvcB1rg#o2q2B@BPnG5*$=W4xU#Z# zhqFjt9{&)ol?m?{41Stw*{ME2o+2Hf_GqGEy zm34AI4XBdB+C*PKrZ&IAsKP*jb;~VED{P*SygiheN&fYVMb@N@U834YSwI#&)aao3 zTsE)^4{GzMQh-(3{3>m4>F%W-Mt(Px*Jee@+FkX;()qn8Z~30XD>1)H9(FZ+hER!3 z7K1^;&JNtbLfYvmv0r9xcWe-Dlf`W#??-!oVya{1r0Uqr#{xr6Zt&}pfg3qG`{BXRkp99sSPvww!_UF0a^iOJbhsVY!EQmy z)fdedb|CuaI?#+7VRn!Z568xJU@NRk^>!#!}A*LXJj4xVD7LM3lJ>Mb&PvHvLcW2WC(E?_F^#z5{`%v z^t7S%9D|;*1lB$fku21 favpC^c7(zEm+(U<`T%UxXdYWNn#Y!%fKRmlFC0g? literal 43790 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 diff --git a/Content/BlueprintSampleContent/Marketplace/ImtblOnRampWidget4_26.uasset b/Content/BlueprintSampleContent/Marketplace/ImtblOnRampWidget4_26.uasset new file mode 100644 index 0000000000000000000000000000000000000000..612d9d3053e9b8320cb21ef3e3d0ea6e80d1551f GIT binary patch literal 46070 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 anhuOgIA{2{A#}jtV1!m`yDu8K`TqfzRvd`{ literal 0 HcmV?d00001 From 1d7c92f70175a4a5ce546bdf3e2d63b185ed7127 Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Wed, 5 Feb 2025 09:57:39 +1000 Subject: [PATCH 05/35] chore: convert spaces to tabs for indentation --- .../template/cpp-ue4/Build.cs.mustache | 24 +++++++-------- .../template/cpp-ue4/api-header.mustache | 12 ++++---- .../cpp-ue4/api-operations-header.mustache | 10 +++---- .../template/cpp-ue4/helpers-header.mustache | 10 +++---- .../cpp-ue4/model-base-header.mustache | 10 +++---- .../cpp-ue4/model-base-source.mustache | 30 +++++++++---------- .../template/cpp-ue4/model-header.mustache | 10 +++---- .../template/cpp-ue4/model-source.mustache | 4 +-- 8 files changed, 55 insertions(+), 55 deletions(-) diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/Build.cs.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/Build.cs.mustache index bfbee11..448b369 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/Build.cs.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/Build.cs.mustache @@ -5,16 +5,16 @@ using UnrealBuildTool; public class {{unrealModuleName}} : ModuleRules { - public {{unrealModuleName}}(ReadOnlyTargetRules Target) : base(Target) - { - PublicDependencyModuleNames.AddRange( - new string[] - { - "Core", - "HTTP", - "Json", - } - ); - PCHUsage = PCHUsageMode.NoPCHs; - } +public {{unrealModuleName}}(ReadOnlyTargetRules Target) : base(Target) +{ + PublicDependencyModuleNames.AddRange( + new string[] + { + "Core", + "HTTP", + "Json", + } + ); + PCHUsage = PCHUsageMode.NoPCHs; +} } \ No newline at end of file diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache index 4f2bec0..6ce74cb 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache @@ -32,14 +32,14 @@ public: {{#operations}}{{#operation}}class {{operationIdCamelCase}}Request; class {{operationIdCamelCase}}Response; {{/operation}}{{/operations}} - {{#operations}}{{#operation}}DECLARE_DELEGATE_OneParam(F{{operationIdCamelCase}}Delegate, const {{operationIdCamelCase}}Response&); - {{/operation}}{{/operations}} - {{#operations}}{{#operation}}{{#description}}/* {{{.}}} */ + {{#operations}}{{#operation}}DECLARE_DELEGATE_OneParam(F{{operationIdCamelCase}}Delegate, const {{operationIdCamelCase}}Response&); + {{/operation}}{{/operations}} + {{#operations}}{{#operation}}{{#description}}/* {{{.}}} */ {{/description}}FHttpRequestPtr {{operationIdCamelCase}}(const {{operationIdCamelCase}}Request& Request, const F{{operationIdCamelCase}}Delegate& Delegate = F{{operationIdCamelCase}}Delegate()) const; - {{/operation}}{{/operations}} + {{/operation}}{{/operations}} private: - {{#operations}}{{#operation}}void On{{operationIdCamelCase}}Response(FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSucceeded, F{{operationIdCamelCase}}Delegate Delegate) const; - {{/operation}}{{/operations}} + {{#operations}}{{#operation}}void On{{operationIdCamelCase}}Response(FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSucceeded, F{{operationIdCamelCase}}Delegate Delegate) const; + {{/operation}}{{/operations}} FHttpRequestRef CreateHttpRequest(const Request& Request) const; bool IsValid() const; void HandleResponse(FHttpResponsePtr HttpResponse, bool bSucceeded, Response& InOutResponse) const; diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache index 99b57ea..d61db03 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache @@ -21,7 +21,7 @@ namespace {{this}} class {{dllapi}} {{classname}}::{{operationIdCamelCase}}Request : public Request { public: - virtual ~{{operationIdCamelCase}}Request() {} + virtual ~{{operationIdCamelCase}}Request() {} void SetupHttpRequest(const FHttpRequestRef& HttpRequest) const final; FString ComputePath() const final; @@ -33,7 +33,7 @@ public: {{#enumVars}} {{name}}, {{/enumVars}} - }; + }; {{/allowableValues}} static FString EnumToString(const {{{enumName}}}& EnumValue); @@ -45,19 +45,19 @@ public: {{#description}}/* {{{.}}} */ {{/description}}{{^required}}TOptional<{{/required}}{{{dataType}}}{{^required}}>{{/required}} {{paramName}}{{#required}}{{#defaultValue}} = {{{.}}}{{/defaultValue}}{{/required}}; {{/isEnum}} - {{/allParams}} + {{/allParams}} }; class {{dllapi}} {{classname}}::{{operationIdCamelCase}}Response : public Response { public: - virtual ~{{operationIdCamelCase}}Response() {} + virtual ~{{operationIdCamelCase}}Response() {} {{#responses.0}} void SetHttpResponseCode(EHttpResponseCodes::Type InHttpResponseCode) final; {{/responses.0}} bool FromJson(const TSharedPtr& JsonValue) final; - {{#returnType}}{{{.}}} Content;{{/returnType}} + {{#returnType}}{{{.}}} Content;{{/returnType}} }; {{/operation}} diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache index 6a90362..5b1cae8 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache @@ -26,11 +26,11 @@ public: explicit HttpFileInput(const FString& InFilePath); // This will automatically set the content type if not already set - void SetFilePath(const TCHAR* InFilePath); + void SetFilePath(const TCHAR* InFilePath); void SetFilePath(const FString& InFilePath); - // Optional if it can be deduced from the FilePath - void SetContentType(const TCHAR* ContentType); + // Optional if it can be deduced from the FilePath + void SetContentType(const TCHAR* ContentType); HttpFileInput& operator=(const HttpFileInput& Other) = default; HttpFileInput& operator=(const FString& InFilePath) { SetFilePath(*InFilePath); return*this; } @@ -43,8 +43,8 @@ public: FString GetFilename() const; private: - FString FilePath; - FString ContentType; + FString FilePath; + FString ContentType; }; ////////////////////////////////////////////////////////////////////////// diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache index e4fdbd1..7fdcee2 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache @@ -40,11 +40,11 @@ struct {{dllapi}} HttpRetryParams const FRetryDomainsPtr& InRetryDomains = FRetryDomainsPtr() ); - FRetryLimitCountSetting RetryLimitCountOverride; - FRetryTimeoutRelativeSecondsSetting RetryTimeoutRelativeSecondsOverride; - FRetryResponseCodes RetryResponseCodes; - FRetryVerbs RetryVerbs; - FRetryDomainsPtr RetryDomains; + FRetryLimitCountSetting RetryLimitCountOverride; + FRetryTimeoutRelativeSecondsSetting RetryTimeoutRelativeSecondsOverride; + FRetryResponseCodes RetryResponseCodes; + FRetryVerbs RetryVerbs; + FRetryDomainsPtr RetryDomains; }; class {{dllapi}} Model diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-source.mustache index 1a551ca..151a3f9 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-source.mustache @@ -13,26 +13,26 @@ bool HttpRetryManager::Tick(float DeltaTime) } HttpRetryParams::HttpRetryParams(const FRetryLimitCountSetting& InRetryLimitCountOverride /*= FRetryLimitCountSetting()*/, - const FRetryTimeoutRelativeSecondsSetting& InRetryTimeoutRelativeSecondsOverride /*= FRetryTimeoutRelativeSecondsSetting()*/, - const FRetryResponseCodes& InRetryResponseCodes /*= FRetryResponseCodes()*/, - const FRetryVerbs& InRetryVerbs /*= FRetryVerbs()*/, - const FRetryDomainsPtr& InRetryDomains /*= FRetryDomainsPtr() */) - : RetryLimitCountOverride(InRetryLimitCountOverride) - , RetryTimeoutRelativeSecondsOverride(InRetryTimeoutRelativeSecondsOverride) - , RetryResponseCodes(InRetryResponseCodes) - , RetryVerbs(InRetryVerbs) - , RetryDomains(InRetryDomains) + const FRetryTimeoutRelativeSecondsSetting& InRetryTimeoutRelativeSecondsOverride /*= FRetryTimeoutRelativeSecondsSetting()*/, + const FRetryResponseCodes& InRetryResponseCodes /*= FRetryResponseCodes()*/, + const FRetryVerbs& InRetryVerbs /*= FRetryVerbs()*/, + const FRetryDomainsPtr& InRetryDomains /*= FRetryDomainsPtr() */) + : RetryLimitCountOverride(InRetryLimitCountOverride) + , RetryTimeoutRelativeSecondsOverride(InRetryTimeoutRelativeSecondsOverride) + , RetryResponseCodes(InRetryResponseCodes) + , RetryVerbs(InRetryVerbs) + , RetryDomains(InRetryDomains) { } void Response::SetHttpResponseCode(EHttpResponseCodes::Type InHttpResponseCode) { - ResponseCode = InHttpResponseCode; - SetSuccessful(EHttpResponseCodes::IsOk(InHttpResponseCode)); - if(InHttpResponseCode == EHttpResponseCodes::RequestTimeout) - { - SetResponseString(TEXT("Request Timeout")); - } + ResponseCode = InHttpResponseCode; + SetSuccessful(EHttpResponseCodes::IsOk(InHttpResponseCode)); + if(InHttpResponseCode == EHttpResponseCodes::RequestTimeout) + { + SetResponseString(TEXT("Request Timeout")); + } } {{#cppNamespaceDeclarations}} diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache index e54a069..010b243 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache @@ -30,7 +30,7 @@ namespace {{this}} class {{dllapi}} {{classname}} : public Model { public: - virtual ~{{classname}}() {} + virtual ~{{classname}}() {} bool FromJson(const TSharedPtr& JsonValue) final; void WriteJson(JsonWriter& Writer) const final; @@ -42,7 +42,7 @@ public: {{#enumVars}} {{name}}, {{/enumVars}} - }; + }; Values Value{{#defaultValue}} = {{{.}}}{{/defaultValue}}; {{/allowableValues}} @@ -54,7 +54,7 @@ public: FString Value{{#defaultValue}} = {{{.}}}{{/defaultValue}}; {{/isEnum}} {{/isString}} - {{#vars}} + {{#vars}} {{#isEnum}} {{#allowableValues}} enum class {{{enumName}}} @@ -62,7 +62,7 @@ public: {{#enumVars}} {{name}}, {{/enumVars}} - }; + }; {{/allowableValues}} static FString EnumToString(const {{{enumName}}}& EnumValue); @@ -76,7 +76,7 @@ public: {{/description}}{{^required}}TOptional<{{/required}}{{{datatype}}}{{^required}}>{{/required}} {{name}}{{#required}}{{#defaultValue}} = {{{.}}}{{/defaultValue}}{{/required}}; {{/oneOf}} {{/isEnum}} - {{/vars}} + {{/vars}} {{#oneOf}} {{#-first}} TVariant<{{#oneOf}}{{{.}}}{{^-last}}, {{/-last}}{{/oneOf}}> OneOf; diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache index 7168085..058f84a 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache @@ -145,7 +145,7 @@ void {{classname}}::WriteJson(JsonWriter& Writer) const {{^oneOf}} {{^isString}} Writer->WriteObjectStart(); - {{#vars}} + {{#vars}} {{#required}} Writer->WriteIdentifierPrefix(TEXT("{{baseName}}")); WriteJsonValue(Writer, {{name}}); {{/required}} @@ -155,7 +155,7 @@ void {{classname}}::WriteJson(JsonWriter& Writer) const Writer->WriteIdentifierPrefix(TEXT("{{baseName}}")); WriteJsonValue(Writer, {{name}}.GetValue()); } {{/required}} - {{/vars}} + {{/vars}} Writer->WriteObjectEnd(); {{/isString}} {{/oneOf}} From 585585c3d017638f7588f904b93ed2bef17d9cea Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Wed, 5 Feb 2025 09:59:09 +1000 Subject: [PATCH 06/35] chore: new line at end of file --- .../openapi-generator/template/cpp-ue4/api-header.mustache | 2 +- .../template/cpp-ue4/api-operations-header.mustache | 2 +- .../template/cpp-ue4/api-operations-source.mustache | 2 +- .../openapi-generator/template/cpp-ue4/api-source.mustache | 2 +- .../openapi-generator/template/cpp-ue4/helpers-header.mustache | 2 +- .../openapi-generator/template/cpp-ue4/licenseInfo.mustache | 2 +- .../template/cpp-ue4/model-base-header.mustache | 2 +- .../openapi-generator/template/cpp-ue4/model-header.mustache | 2 +- .../openapi-generator/template/cpp-ue4/model-source.mustache | 2 +- .../openapi-generator/template/cpp-ue4/module-header.mustache | 2 +- .../openapi-generator/template/cpp-ue4/module-source.mustache | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache index 6ce74cb..cc266f3 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache @@ -52,4 +52,4 @@ private: {{#cppNamespaceDeclarations}} } -{{/cppNamespaceDeclarations}} +{{/cppNamespaceDeclarations}} \ No newline at end of file diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache index d61db03..5ff320d 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache @@ -64,4 +64,4 @@ public: {{/operations}} {{#cppNamespaceDeclarations}} } -{{/cppNamespaceDeclarations}} +{{/cppNamespaceDeclarations}} \ No newline at end of file diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache index e58a460..4c4e372 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache @@ -327,4 +327,4 @@ bool {{classname}}::{{operationIdCamelCase}}Response::FromJson(const TSharedPtr< {{/operation}}{{/operations}} {{#cppNamespaceDeclarations}} } -{{/cppNamespaceDeclarations}} +{{/cppNamespaceDeclarations}} \ No newline at end of file diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache index d6091e4..e7e2f24 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache @@ -157,4 +157,4 @@ void {{classname}}::On{{operationIdCamelCase}}Response(FHttpRequestPtr HttpReque {{/operations}} {{#cppNamespaceDeclarations}} } -{{/cppNamespaceDeclarations}} +{{/cppNamespaceDeclarations}} \ No newline at end of file diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache index 5b1cae8..da230d1 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache @@ -498,4 +498,4 @@ inline bool TryGetJsonValue(const TSharedPtr& JsonObject, const FSt {{#cppNamespaceDeclarations}} } -{{/cppNamespaceDeclarations}} +{{/cppNamespaceDeclarations}} \ No newline at end of file diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/licenseInfo.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/licenseInfo.mustache index b0182ee..d8deb7d 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/licenseInfo.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/licenseInfo.mustache @@ -8,4 +8,4 @@ * NOTE: This class is auto generated by OpenAPI Generator * https://github.com/OpenAPITools/openapi-generator * Do not edit the class manually. - */ + */ \ No newline at end of file diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache index 7fdcee2..5bf3fad 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache @@ -97,4 +97,4 @@ private: {{#cppNamespaceDeclarations}} } -{{/cppNamespaceDeclarations}} +{{/cppNamespaceDeclarations}} \ No newline at end of file diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache index 010b243..3989b90 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache @@ -88,4 +88,4 @@ public: {{/models}} {{#cppNamespaceDeclarations}} } -{{/cppNamespaceDeclarations}} +{{/cppNamespaceDeclarations}} \ No newline at end of file diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache index 058f84a..f8f4bcc 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache @@ -204,4 +204,4 @@ bool {{classname}}::FromJson(const TSharedPtr& JsonValue) {{/models}} {{#cppNamespaceDeclarations}} } -{{/cppNamespaceDeclarations}} +{{/cppNamespaceDeclarations}} \ No newline at end of file diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/module-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/module-header.mustache index f27de89..c9b54e9 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/module-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/module-header.mustache @@ -12,4 +12,4 @@ class {{dllapi}} {{unrealModuleName}}Module : public IModuleInterface public: void StartupModule() final; void ShutdownModule() final; -}; +}; \ No newline at end of file diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/module-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/module-source.mustache index e89bb28..79ed045 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/module-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/module-source.mustache @@ -10,4 +10,4 @@ void {{unrealModuleName}}Module::StartupModule() void {{unrealModuleName}}Module::ShutdownModule() { -} +} \ No newline at end of file From 0b0199992bdd9b1828d53f05232e1862d8e2dc16 Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Wed, 5 Feb 2025 10:07:05 +1000 Subject: [PATCH 07/35] chore: apply formatting --- .../template/cpp-ue4/Build.cs.mustache | 16 ++++++++-------- .../template/cpp-ue4/api-header.mustache | 1 + .../cpp-ue4/api-operations-header.mustache | 1 + .../cpp-ue4/api-operations-source.mustache | 1 + .../template/cpp-ue4/api-source.mustache | 1 + .../template/cpp-ue4/helpers-header.mustache | 1 + .../template/cpp-ue4/helpers-source.mustache | 1 + .../template/cpp-ue4/model-base-header.mustache | 1 + .../template/cpp-ue4/model-base-source.mustache | 8 ++++++-- .../template/cpp-ue4/model-header.mustache | 1 + .../template/cpp-ue4/model-source.mustache | 1 + .../template/cpp-ue4/module-header.mustache | 1 + .../template/cpp-ue4/module-source.mustache | 2 ++ 13 files changed, 26 insertions(+), 10 deletions(-) diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/Build.cs.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/Build.cs.mustache index 448b369..0ebe570 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/Build.cs.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/Build.cs.mustache @@ -1,20 +1,20 @@ {{>licenseInfo}} + using System; using System.IO; using UnrealBuildTool; public class {{unrealModuleName}} : ModuleRules { -public {{unrealModuleName}}(ReadOnlyTargetRules Target) : base(Target) -{ - PublicDependencyModuleNames.AddRange( - new string[] + public {{unrealModuleName}}(ReadOnlyTargetRules Target) : base(Target) + { + PCHUsage = PCHUsageMode.NoPCHs; + + PublicDependencyModuleNames.AddRange(new string[] { "Core", "HTTP", "Json", - } - ); - PCHUsage = PCHUsageMode.NoPCHs; -} + }); + } } \ No newline at end of file diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache index cc266f3..cf06d25 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache @@ -1,4 +1,5 @@ {{>licenseInfo}} + #pragma once #include "CoreMinimal.h" diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache index 5ff320d..edff381 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache @@ -1,4 +1,5 @@ {{>licenseInfo}} + #pragma once #include "{{modelNamePrefix}}BaseModel.h" diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache index 4c4e372..a39d87f 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache @@ -1,4 +1,5 @@ {{>licenseInfo}} + #include "{{classname}}Operations.h" #include "{{unrealModuleName}}Module.h" diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache index e7e2f24..63432f3 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache @@ -1,4 +1,5 @@ {{>licenseInfo}} + #include "{{classname}}.h" #include "{{classname}}Operations.h" diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache index da230d1..b397d1e 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache @@ -1,4 +1,5 @@ {{>licenseInfo}} + #pragma once #include "{{modelNamePrefix}}BaseModel.h" diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-source.mustache index fdb6ade..a777d0a 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-source.mustache @@ -1,4 +1,5 @@ {{>licenseInfo}} + #include "{{modelNamePrefix}}Helpers.h" #include "{{unrealModuleName}}Module.h" diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache index 5bf3fad..49148ee 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache @@ -1,4 +1,5 @@ {{>licenseInfo}} + #pragma once #include "Interfaces/IHttpRequest.h" diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-source.mustache index 151a3f9..a043e9c 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-source.mustache @@ -1,4 +1,5 @@ {{>licenseInfo}} + #include "{{modelNamePrefix}}BaseModel.h" {{#cppNamespaceDeclarations}} @@ -12,11 +13,14 @@ bool HttpRetryManager::Tick(float DeltaTime) return true; } -HttpRetryParams::HttpRetryParams(const FRetryLimitCountSetting& InRetryLimitCountOverride /*= FRetryLimitCountSetting()*/, +HttpRetryParams::HttpRetryParams +( + const FRetryLimitCountSetting& InRetryLimitCountOverride /*= FRetryLimitCountSetting()*/, const FRetryTimeoutRelativeSecondsSetting& InRetryTimeoutRelativeSecondsOverride /*= FRetryTimeoutRelativeSecondsSetting()*/, const FRetryResponseCodes& InRetryResponseCodes /*= FRetryResponseCodes()*/, const FRetryVerbs& InRetryVerbs /*= FRetryVerbs()*/, - const FRetryDomainsPtr& InRetryDomains /*= FRetryDomainsPtr() */) + const FRetryDomainsPtr& InRetryDomains /*= FRetryDomainsPtr() */ +) : RetryLimitCountOverride(InRetryLimitCountOverride) , RetryTimeoutRelativeSecondsOverride(InRetryTimeoutRelativeSecondsOverride) , RetryResponseCodes(InRetryResponseCodes) diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache index 3989b90..8a583fc 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache @@ -1,4 +1,5 @@ {{>licenseInfo}} + #pragma once {{#models}} diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache index f8f4bcc..785c784 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache @@ -1,4 +1,5 @@ {{>licenseInfo}} + #include "{{classname}}.h" #include "{{unrealModuleName}}Module.h" diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/module-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/module-header.mustache index c9b54e9..afdebea 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/module-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/module-header.mustache @@ -1,4 +1,5 @@ {{>licenseInfo}} + #pragma once #include "Modules/ModuleInterface.h" diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/module-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/module-source.mustache index 79ed045..a6d78e3 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/module-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/module-source.mustache @@ -1,7 +1,9 @@ {{>licenseInfo}} + #include "{{unrealModuleName}}Module.h" IMPLEMENT_MODULE({{unrealModuleName}}Module, {{unrealModuleName}}); + DEFINE_LOG_CATEGORY(Log{{unrealModuleName}}); void {{unrealModuleName}}Module::StartupModule() From 94292991a6896ad4158af117b0014495a21412d9 Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Wed, 5 Feb 2025 10:25:29 +1000 Subject: [PATCH 08/35] chore: remove namespaces --- .../template/cpp-ue4/api-header.mustache | 11 +---------- .../template/cpp-ue4/api-operations-header.mustache | 10 +--------- .../template/cpp-ue4/api-operations-source.mustache | 9 +-------- .../template/cpp-ue4/api-source.mustache | 10 +--------- .../template/cpp-ue4/helpers-header.mustache | 11 +---------- .../template/cpp-ue4/helpers-source.mustache | 11 +---------- .../template/cpp-ue4/model-base-header.mustache | 11 +---------- .../template/cpp-ue4/model-base-source.mustache | 11 +---------- .../template/cpp-ue4/model-header.mustache | 9 +-------- .../template/cpp-ue4/model-source.mustache | 9 +-------- 10 files changed, 10 insertions(+), 92 deletions(-) diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache index cf06d25..c5e8bdd 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache @@ -5,11 +5,6 @@ #include "CoreMinimal.h" #include "{{modelNamePrefix}}BaseModel.h" -{{#cppNamespaceDeclarations}} -namespace {{this}} -{ -{{/cppNamespaceDeclarations}} - class {{dllapi}} {{classname}} { public: @@ -49,8 +44,4 @@ private: TMap AdditionalHeaderParams; mutable FHttpRetrySystem::FManager* RetryManager = nullptr; mutable TUniquePtr DefaultRetryManager; -}; - -{{#cppNamespaceDeclarations}} -} -{{/cppNamespaceDeclarations}} \ No newline at end of file +}; \ No newline at end of file diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache index edff381..4875416 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache @@ -8,11 +8,6 @@ {{#imports}}{{{import}}} {{/imports}} -{{#cppNamespaceDeclarations}} -namespace {{this}} -{ -{{/cppNamespaceDeclarations}} - {{#operations}} {{#operation}} /* {{summary}} @@ -62,7 +57,4 @@ public: }; {{/operation}} -{{/operations}} -{{#cppNamespaceDeclarations}} -} -{{/cppNamespaceDeclarations}} \ No newline at end of file +{{/operations}} \ No newline at end of file diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache index a39d87f..909dc94 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache @@ -10,10 +10,6 @@ #include "HttpModule.h" #include "PlatformHttp.h" -{{#cppNamespaceDeclarations}} -namespace {{this}} -{ -{{/cppNamespaceDeclarations}} {{#operations}}{{#operation}} {{#allParams}} {{#isEnum}} @@ -325,7 +321,4 @@ bool {{classname}}::{{operationIdCamelCase}}Response::FromJson(const TSharedPtr< return true; {{/returnType}} } -{{/operation}}{{/operations}} -{{#cppNamespaceDeclarations}} -} -{{/cppNamespaceDeclarations}} \ No newline at end of file +{{/operation}}{{/operations}} \ No newline at end of file diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache index 63432f3..6550745 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache @@ -8,11 +8,6 @@ #include "HttpModule.h" #include "Serialization/JsonSerializer.h" -{{#cppNamespaceDeclarations}} -namespace {{this}} -{ -{{/cppNamespaceDeclarations}} - {{classname}}::{{classname}}() : Url(TEXT("{{basePath}}")) { @@ -155,7 +150,4 @@ void {{classname}}::On{{operationIdCamelCase}}Response(FHttpRequestPtr HttpReque } {{/operation}} -{{/operations}} -{{#cppNamespaceDeclarations}} -} -{{/cppNamespaceDeclarations}} \ No newline at end of file +{{/operations}} \ No newline at end of file diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache index b397d1e..a5b2578 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache @@ -11,11 +11,6 @@ class IHttpRequest; -{{#cppNamespaceDeclarations}} -namespace {{this}} -{ -{{/cppNamespaceDeclarations}} - typedef TSharedRef> JsonWriter; ////////////////////////////////////////////////////////////////////////// @@ -495,8 +490,4 @@ inline bool TryGetJsonValue(const TSharedPtr& JsonObject, const FSt // Absence of optional value is not a parsing error. // Nullable is handled like optional. return true; -} - -{{#cppNamespaceDeclarations}} -} -{{/cppNamespaceDeclarations}} \ No newline at end of file +} \ No newline at end of file diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-source.mustache index a777d0a..87ad1f7 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-source.mustache @@ -9,11 +9,6 @@ #include "Misc/FileHelper.h" #include "Misc/Paths.h" -{{#cppNamespaceDeclarations}} -namespace {{this}} -{ -{{/cppNamespaceDeclarations}} - HttpFileInput::HttpFileInput(const TCHAR* InFilePath) { SetFilePath(InFilePath); @@ -220,8 +215,4 @@ bool ParseDateTime(const FString& DateTimeString, FDateTime& OutDateTime) return true; return FDateTime::Parse(DateTimeString, OutDateTime); -} - -{{#cppNamespaceDeclarations}} -} -{{/cppNamespaceDeclarations}} \ No newline at end of file +} \ No newline at end of file diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache index 49148ee..b521125 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache @@ -10,11 +10,6 @@ #include "Containers/Ticker.h" #include "Runtime/Launch/Resources/Version.h" -{{#cppNamespaceDeclarations}} -namespace {{this}} -{ -{{/cppNamespaceDeclarations}} - typedef TSharedRef> JsonWriter; using namespace FHttpRetrySystem; @@ -94,8 +89,4 @@ private: EHttpResponseCodes::Type ResponseCode; FString ResponseString; FHttpResponsePtr HttpResponse; -}; - -{{#cppNamespaceDeclarations}} -} -{{/cppNamespaceDeclarations}} \ No newline at end of file +}; \ No newline at end of file diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-source.mustache index a043e9c..851e993 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-source.mustache @@ -2,11 +2,6 @@ #include "{{modelNamePrefix}}BaseModel.h" -{{#cppNamespaceDeclarations}} -namespace {{this}} -{ -{{/cppNamespaceDeclarations}} - bool HttpRetryManager::Tick(float DeltaTime) { FManager::Update(); @@ -37,8 +32,4 @@ void Response::SetHttpResponseCode(EHttpResponseCodes::Type InHttpResponseCode) { SetResponseString(TEXT("Request Timeout")); } -} - -{{#cppNamespaceDeclarations}} -} -{{/cppNamespaceDeclarations}} \ No newline at end of file +} \ No newline at end of file diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache index 8a583fc..0f1f636 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache @@ -16,10 +16,6 @@ {{#imports}}{{{import}}} {{/imports}} -{{#cppNamespaceDeclarations}} -namespace {{this}} -{ -{{/cppNamespaceDeclarations}} {{#models}} {{#model}} @@ -86,7 +82,4 @@ public: }; {{/model}} -{{/models}} -{{#cppNamespaceDeclarations}} -} -{{/cppNamespaceDeclarations}} \ No newline at end of file +{{/models}} \ No newline at end of file diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache index 785c784..6ed7f3c 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache @@ -7,10 +7,6 @@ #include "Templates/SharedPointer.h" -{{#cppNamespaceDeclarations}} -namespace {{this}} -{ -{{/cppNamespaceDeclarations}} {{#models}}{{#model}} {{#isEnum}} inline FString ToString(const {{classname}}::Values& Value) @@ -202,7 +198,4 @@ bool {{classname}}::FromJson(const TSharedPtr& JsonValue) } {{/model}} -{{/models}} -{{#cppNamespaceDeclarations}} -} -{{/cppNamespaceDeclarations}} \ No newline at end of file +{{/models}} \ No newline at end of file From 8d5194af403acd58cf7e0f2ac9f659c5376f26ca Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Wed, 5 Feb 2025 13:40:27 +1000 Subject: [PATCH 09/35] chore: add prefix to request --- .../openapi-generator/template/cpp-ue4/api-header.mustache | 6 +++--- .../template/cpp-ue4/api-operations-header.mustache | 2 +- .../openapi-generator/template/cpp-ue4/api-source.mustache | 2 +- .../template/cpp-ue4/model-base-header.mustache | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache index c5e8bdd..7b718c3 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache @@ -12,7 +12,7 @@ public: ~{{classname}}(); /* Sets the URL Endpoint. - * Note: several fallback endpoints can be configured in request retry policies, see Request::SetShouldRetry */ + * Note: several fallback endpoints can be configured in request retry policies, see F{{unrealModuleName}}Request::SetShouldRetry */ void SetURL(const FString& Url); /* Adds global header params to all requests */ @@ -21,7 +21,7 @@ public: /* Sets the retry manager to the user-defined retry manager. User must manage the lifetime of the retry manager. * If no retry manager is specified and a request needs retries, a default retry manager will be used. - * See also: Request::SetShouldRetry */ + * See also: F{{unrealModuleName}}Request::SetShouldRetry */ void SetHttpRetryManager(FHttpRetrySystem::FManager& RetryManager); FHttpRetrySystem::FManager& GetHttpRetryManager(); @@ -36,7 +36,7 @@ public: private: {{#operations}}{{#operation}}void On{{operationIdCamelCase}}Response(FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSucceeded, F{{operationIdCamelCase}}Delegate Delegate) const; {{/operation}}{{/operations}} - FHttpRequestRef CreateHttpRequest(const Request& Request) const; + FHttpRequestRef CreateHttpRequest(const F{{unrealModuleName}}Request& Request) const; bool IsValid() const; void HandleResponse(FHttpResponsePtr HttpResponse, bool bSucceeded, Response& InOutResponse) const; diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache index 4875416..bc4a7c6 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache @@ -14,7 +14,7 @@ {{#notes}} * * {{.}}{{/notes}} */ -class {{dllapi}} {{classname}}::{{operationIdCamelCase}}Request : public Request +class {{dllapi}} {{classname}}::{{operationIdCamelCase}}Request : public F{{unrealModuleName}}Request { public: virtual ~{{operationIdCamelCase}}Request() {} diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache index 6550745..8234b55 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache @@ -56,7 +56,7 @@ FHttpRetrySystem::FManager& {{classname}}::GetHttpRetryManager() return *RetryManager; } -FHttpRequestRef {{classname}}::CreateHttpRequest(const Request& Request) const +FHttpRequestRef {{classname}}::CreateHttpRequest(const F{{unrealModuleName}}Request& Request) const { if (!Request.GetRetryParams().IsSet()) { diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache index b521125..f6385e2 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache @@ -51,10 +51,10 @@ public: virtual bool FromJson(const TSharedPtr& JsonValue) = 0; }; -class {{dllapi}} Request +class {{dllapi}} F{{unrealModuleName}}Request { public: - virtual ~Request() {} + virtual ~F{{unrealModuleName}}Request() {} virtual void SetupHttpRequest(const FHttpRequestRef& HttpRequest) const = 0; virtual FString ComputePath() const = 0; From 757883f95f089799ee17ad6d7542983b4cb5e2f3 Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Wed, 5 Feb 2025 13:47:50 +1000 Subject: [PATCH 10/35] chore: add prefix to model --- .../template/cpp-ue4/helpers-header.mustache | 10 +++++----- .../template/cpp-ue4/model-base-header.mustache | 4 ++-- .../template/cpp-ue4/model-header.mustache | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache index a5b2578..92eebfa 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache @@ -104,7 +104,7 @@ inline auto ToString(const T& EnumModelValue) return T::EnumToString(EnumModelValue.Value); } -inline FString ToString(const Model& Value) +inline FString ToString(const F{{unrealModuleName}}Model& Value) { FString String; JsonWriter Writer = TJsonWriterFactory<>::Create(&String); @@ -260,12 +260,12 @@ inline void WriteJsonValue(JsonWriter& Writer, const FGuid& Value) Writer->WriteValue(Value.ToString(EGuidFormats::DigitsWithHyphens)); } -inline void WriteJsonValue(JsonWriter& Writer, const Model& Value) +inline void WriteJsonValue(JsonWriter& Writer, const F{{unrealModuleName}}Model& Value) { Value.WriteJson(Writer); } -template::value, int>::type = 0> +template::value, int>::type = 0> inline void WriteJsonValue(JsonWriter& Writer, const T& Value) { Writer->WriteValue(Value); @@ -384,12 +384,12 @@ inline bool TryGetJsonValue(const TSharedPtr& JsonValue, TArray& JsonValue, Model& Value) +inline bool TryGetJsonValue(const TSharedPtr& JsonValue, F{{unrealModuleName}}Model& Value) { return Value.FromJson(JsonValue); } -template::value, int>::type = 0> +template::value, int>::type = 0> inline bool TryGetJsonValue(const TSharedPtr& JsonValue, T& Value) { T TmpValue; diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache index f6385e2..580f5d3 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache @@ -43,10 +43,10 @@ struct {{dllapi}} HttpRetryParams FRetryDomainsPtr RetryDomains; }; -class {{dllapi}} Model +class {{dllapi}} F{{unrealModuleName}}Model { public: - virtual ~Model() {} + virtual ~F{{unrealModuleName}}Model() {} virtual void WriteJson(JsonWriter& Writer) const = 0; virtual bool FromJson(const TSharedPtr& JsonValue) = 0; }; diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache index 0f1f636..7d87cc7 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache @@ -24,7 +24,7 @@ * * {{description}} */ -class {{dllapi}} {{classname}} : public Model +class {{dllapi}} {{classname}} : public F{{unrealModuleName}}Model { public: virtual ~{{classname}}() {} From 0e23aac676d9c5bb665ad18bb30599bb26123cd3 Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Wed, 5 Feb 2025 13:52:13 +1000 Subject: [PATCH 11/35] chore: add prefix to response --- .../openapi-generator/template/cpp-ue4/api-header.mustache | 2 +- .../template/cpp-ue4/api-operations-header.mustache | 2 +- .../template/cpp-ue4/api-operations-source.mustache | 2 +- .../openapi-generator/template/cpp-ue4/api-source.mustache | 2 +- .../template/cpp-ue4/model-base-header.mustache | 4 ++-- .../template/cpp-ue4/model-base-source.mustache | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache index 7b718c3..6217e11 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache @@ -38,7 +38,7 @@ private: {{/operation}}{{/operations}} FHttpRequestRef CreateHttpRequest(const F{{unrealModuleName}}Request& Request) const; bool IsValid() const; - void HandleResponse(FHttpResponsePtr HttpResponse, bool bSucceeded, Response& InOutResponse) const; + void HandleResponse(FHttpResponsePtr HttpResponse, bool bSucceeded, F{{unrealModuleName}}Response& InOutResponse) const; FString Url; TMap AdditionalHeaderParams; diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache index bc4a7c6..2f65209 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache @@ -44,7 +44,7 @@ public: {{/allParams}} }; -class {{dllapi}} {{classname}}::{{operationIdCamelCase}}Response : public Response +class {{dllapi}} {{classname}}::{{operationIdCamelCase}}Response : public F{{unrealModuleName}}Response { public: virtual ~{{operationIdCamelCase}}Response() {} diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache index 909dc94..3bad56b 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache @@ -297,7 +297,7 @@ void {{classname}}::{{operationIdCamelCase}}Request::SetupHttpRequest(const FHtt {{#responses.0}} void {{classname}}::{{operationIdCamelCase}}Response::SetHttpResponseCode(EHttpResponseCodes::Type InHttpResponseCode) { - Response::SetHttpResponseCode(InHttpResponseCode); + F{{unrealModuleName}}Response::SetHttpResponseCode(InHttpResponseCode); switch ((int)InHttpResponseCode) { {{#responses}} diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache index 8234b55..bca6dd4 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache @@ -76,7 +76,7 @@ FHttpRequestRef {{classname}}::CreateHttpRequest(const F{{unrealModuleName}}Requ } } -void {{classname}}::HandleResponse(FHttpResponsePtr HttpResponse, bool bSucceeded, Response& InOutResponse) const +void {{classname}}::HandleResponse(FHttpResponsePtr HttpResponse, bool bSucceeded, F{{unrealModuleName}}Response& InOutResponse) const { InOutResponse.SetHttpResponse(HttpResponse); InOutResponse.SetSuccessful(bSucceeded); diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache index 580f5d3..15eebcf 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache @@ -66,10 +66,10 @@ private: TOptional RetryParams; }; -class {{dllapi}} Response +class {{dllapi}} F{{unrealModuleName}}Response { public: - virtual ~Response() {} + virtual ~F{{unrealModuleName}}Response() {} virtual bool FromJson(const TSharedPtr& JsonValue) = 0; void SetSuccessful(bool InSuccessful) { Successful = InSuccessful; } diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-source.mustache index 851e993..5b34a33 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-source.mustache @@ -24,7 +24,7 @@ HttpRetryParams::HttpRetryParams { } -void Response::SetHttpResponseCode(EHttpResponseCodes::Type InHttpResponseCode) +void F{{unrealModuleName}}Response::SetHttpResponseCode(EHttpResponseCodes::Type InHttpResponseCode) { ResponseCode = InHttpResponseCode; SetSuccessful(EHttpResponseCodes::IsOk(InHttpResponseCode)); From cdf5cb9bf4cfbc162e7bab6e89a67373455e10ad Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Wed, 5 Feb 2025 13:54:11 +1000 Subject: [PATCH 12/35] chore: add prefix to http retry params --- .../template/cpp-ue4/api-source.mustache | 2 +- .../template/cpp-ue4/model-base-header.mustache | 10 +++++----- .../template/cpp-ue4/model-base-source.mustache | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache index bca6dd4..b871e08 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache @@ -71,7 +71,7 @@ FHttpRequestRef {{classname}}::CreateHttpRequest(const F{{unrealModuleName}}Requ RetryManager = DefaultRetryManager.Get(); } - const HttpRetryParams& Params = Request.GetRetryParams().GetValue(); + const F{{unrealModuleName}}HttpRetryParams& Params = Request.GetRetryParams().GetValue(); return RetryManager->CreateRequest(Params.RetryLimitCountOverride, Params.RetryTimeoutRelativeSecondsOverride, Params.RetryResponseCodes, Params.RetryVerbs, Params.RetryDomains); } } diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache index 15eebcf..68d87bf 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache @@ -26,9 +26,9 @@ struct {{dllapi}} HttpRetryManager bool Tick(float DeltaTime) final; }; -struct {{dllapi}} HttpRetryParams +struct {{dllapi}} F{{unrealModuleName}}HttpRetryParams { - HttpRetryParams( + F{{unrealModuleName}}HttpRetryParams( const FRetryLimitCountSetting& InRetryLimitCountOverride = FRetryLimitCountSetting(), const FRetryTimeoutRelativeSecondsSetting& InRetryTimeoutRelativeSecondsOverride = FRetryTimeoutRelativeSecondsSetting(), const FRetryResponseCodes& InRetryResponseCodes = FRetryResponseCodes(), @@ -59,11 +59,11 @@ public: virtual FString ComputePath() const = 0; /* Enables retry and optionally sets a retry policy for this request */ - void SetShouldRetry(const HttpRetryParams& Params = HttpRetryParams()) { RetryParams = Params; } - const TOptional& GetRetryParams() const { return RetryParams; } + void SetShouldRetry(const F{{unrealModuleName}}HttpRetryParams& Params = F{{unrealModuleName}}HttpRetryParams()) { RetryParams = Params; } + const TOptional& GetRetryParams() const { return RetryParams; } private: - TOptional RetryParams; + TOptional RetryParams; }; class {{dllapi}} F{{unrealModuleName}}Response diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-source.mustache index 5b34a33..b156d1e 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-source.mustache @@ -8,7 +8,7 @@ bool HttpRetryManager::Tick(float DeltaTime) return true; } -HttpRetryParams::HttpRetryParams +F{{unrealModuleName}}HttpRetryParams::F{{unrealModuleName}}HttpRetryParams ( const FRetryLimitCountSetting& InRetryLimitCountOverride /*= FRetryLimitCountSetting()*/, const FRetryTimeoutRelativeSecondsSetting& InRetryTimeoutRelativeSecondsOverride /*= FRetryTimeoutRelativeSecondsSetting()*/, From 0e32d5c392eff1db166e685ced62da7723b2f245 Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Wed, 5 Feb 2025 13:57:03 +1000 Subject: [PATCH 13/35] chore: add prefix to http retry manager --- .../openapi-generator/template/cpp-ue4/api-header.mustache | 2 +- .../openapi-generator/template/cpp-ue4/api-source.mustache | 2 +- .../template/cpp-ue4/model-base-header.mustache | 2 +- .../template/cpp-ue4/model-base-source.mustache | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache index 6217e11..9b5fe54 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache @@ -43,5 +43,5 @@ private: FString Url; TMap AdditionalHeaderParams; mutable FHttpRetrySystem::FManager* RetryManager = nullptr; - mutable TUniquePtr DefaultRetryManager; + mutable TUniquePtr DefaultRetryManager; }; \ No newline at end of file diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache index b871e08..5ca62e4 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache @@ -67,7 +67,7 @@ FHttpRequestRef {{classname}}::CreateHttpRequest(const F{{unrealModuleName}}Requ if (!RetryManager) { // Create default retry manager if none was specified - DefaultRetryManager = MakeUnique(6, 60); + DefaultRetryManager = MakeUnique(6, 60); RetryManager = DefaultRetryManager.Get(); } diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache index 68d87bf..21ccfca 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache @@ -13,7 +13,7 @@ typedef TSharedRef> JsonWriter; using namespace FHttpRetrySystem; -struct {{dllapi}} HttpRetryManager +struct {{dllapi}} F{{unrealModuleName}}HttpRetryManager : public FManager #if ENGINE_MAJOR_VERSION <= 4 , public FTickerObjectBase diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-source.mustache index b156d1e..be9333d 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-source.mustache @@ -2,7 +2,7 @@ #include "{{modelNamePrefix}}BaseModel.h" -bool HttpRetryManager::Tick(float DeltaTime) +bool F{{unrealModuleName}}HttpRetryManager::Tick(float DeltaTime) { FManager::Update(); return true; From d815601011daaaf281e7f59048bcb528bc53e1dd Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Wed, 5 Feb 2025 14:04:25 +1000 Subject: [PATCH 14/35] chore: add prefix to http file input --- .../template/cpp-ue4/helpers-header.mustache | 14 +++++++------- .../template/cpp-ue4/helpers-source.mustache | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache index 92eebfa..e62ab6a 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache @@ -15,11 +15,11 @@ typedef TSharedRef> JsonWriter; ////////////////////////////////////////////////////////////////////////// -class {{dllapi}} HttpFileInput +class {{dllapi}} F{{unrealModuleName}}HttpFileInput { public: - explicit HttpFileInput(const TCHAR* InFilePath); - explicit HttpFileInput(const FString& InFilePath); + explicit F{{unrealModuleName}}HttpFileInput(const TCHAR* InFilePath); + explicit F{{unrealModuleName}}HttpFileInput(const FString& InFilePath); // This will automatically set the content type if not already set void SetFilePath(const TCHAR* InFilePath); @@ -28,9 +28,9 @@ public: // Optional if it can be deduced from the FilePath void SetContentType(const TCHAR* ContentType); - HttpFileInput& operator=(const HttpFileInput& Other) = default; - HttpFileInput& operator=(const FString& InFilePath) { SetFilePath(*InFilePath); return*this; } - HttpFileInput& operator=(const TCHAR* InFilePath) { SetFilePath(InFilePath); return*this; } + F{{unrealModuleName}}HttpFileInput& operator=(const F{{unrealModuleName}}HttpFileInput& Other) = default; + F{{unrealModuleName}}HttpFileInput& operator=(const FString& InFilePath) { SetFilePath(*InFilePath); return*this; } + F{{unrealModuleName}}HttpFileInput& operator=(const TCHAR* InFilePath) { SetFilePath(InFilePath); return*this; } const FString& GetFilePath() const { return FilePath; } const FString& GetContentType() const { return ContentType; } @@ -54,7 +54,7 @@ public: void AddStringPart(const TCHAR* Name, const TCHAR* Data); void AddJsonPart(const TCHAR* Name, const FString& JsonString); void AddBinaryPart(const TCHAR* Name, const TArray& ByteArray); - void AddFilePart(const TCHAR* Name, const HttpFileInput& File); + void AddFilePart(const TCHAR* Name, const F{{unrealModuleName}}HttpFileInput& File); private: void AppendString(const TCHAR* Str); diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-source.mustache index 87ad1f7..b41e4af 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-source.mustache @@ -9,17 +9,17 @@ #include "Misc/FileHelper.h" #include "Misc/Paths.h" -HttpFileInput::HttpFileInput(const TCHAR* InFilePath) +F{{unrealModuleName}}HttpFileInput::F{{unrealModuleName}}HttpFileInput(const TCHAR* InFilePath) { SetFilePath(InFilePath); } -HttpFileInput::HttpFileInput(const FString& InFilePath) +F{{unrealModuleName}}HttpFileInput::F{{unrealModuleName}}HttpFileInput(const FString& InFilePath) { SetFilePath(InFilePath); } -void HttpFileInput::SetFilePath(const TCHAR* InFilePath) +void F{{unrealModuleName}}HttpFileInput::SetFilePath(const TCHAR* InFilePath) { FilePath = InFilePath; if(ContentType.IsEmpty()) @@ -28,17 +28,17 @@ void HttpFileInput::SetFilePath(const TCHAR* InFilePath) } } -void HttpFileInput::SetFilePath(const FString& InFilePath) +void F{{unrealModuleName}}HttpFileInput::SetFilePath(const FString& InFilePath) { SetFilePath(*InFilePath); } -void HttpFileInput::SetContentType(const TCHAR* InContentType) +void F{{unrealModuleName}}HttpFileInput::SetContentType(const TCHAR* InContentType) { ContentType = InContentType; } -FString HttpFileInput::GetFilename() const +FString F{{unrealModuleName}}HttpFileInput::GetFilename() const { return FPaths::GetCleanFilename(FilePath); } @@ -145,7 +145,7 @@ void HttpMultipartFormData::AddBinaryPart(const TCHAR* Name, const TArray AppendString(Newline); } -void HttpMultipartFormData::AddFilePart(const TCHAR* Name, const HttpFileInput& File) +void HttpMultipartFormData::AddFilePart(const TCHAR* Name, const F{{unrealModuleName}}HttpFileInput& File) { TArray FileContents; if (!FFileHelper::LoadFileToArray(FileContents, *File.GetFilePath())) From 9f4c1e923c7b4334fd63d1613bd792117cccfe87 Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Wed, 5 Feb 2025 14:06:28 +1000 Subject: [PATCH 15/35] chore: add prefix to http multipart form data --- .../cpp-ue4/api-operations-source.mustache | 2 +- .../template/cpp-ue4/helpers-header.mustache | 2 +- .../template/cpp-ue4/helpers-source.mustache | 20 +++++++++---------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache index 3bad56b..cc9228d 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache @@ -206,7 +206,7 @@ void {{classname}}::{{operationIdCamelCase}}Request::SetupHttpRequest(const FHtt else if (Consumes.Contains(TEXT("multipart/form-data"))) { {{#formParams.0}} - HttpMultipartFormData FormData; + F{{unrealModuleName}}HttpMultipartFormData FormData; {{#formParams}} {{#isContainer}} UE_LOG(Log{{unrealModuleName}}, Error, TEXT("Form parameter ({{baseName}}) was ignored, Collections are not supported in multipart form")); diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache index e62ab6a..9ef40dd 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache @@ -45,7 +45,7 @@ private: ////////////////////////////////////////////////////////////////////////// -class HttpMultipartFormData +class F{{unrealModuleName}}HttpMultipartFormData { public: void SetBoundary(const TCHAR* InBoundary); diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-source.mustache index b41e4af..9a7f795 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-source.mustache @@ -45,16 +45,16 @@ FString F{{unrealModuleName}}HttpFileInput::GetFilename() const ////////////////////////////////////////////////////////////////////////// -const TCHAR* HttpMultipartFormData::Delimiter = TEXT("--"); -const TCHAR* HttpMultipartFormData::Newline = TEXT("\r\n"); +const TCHAR* F{{unrealModuleName}}HttpMultipartFormData::Delimiter = TEXT("--"); +const TCHAR* F{{unrealModuleName}}HttpMultipartFormData::Newline = TEXT("\r\n"); -void HttpMultipartFormData::SetBoundary(const TCHAR* InBoundary) +void F{{unrealModuleName}}HttpMultipartFormData::SetBoundary(const TCHAR* InBoundary) { checkf(Boundary.IsEmpty(), TEXT("Boundary must be set before usage")); Boundary = InBoundary; } -const FString& HttpMultipartFormData::GetBoundary() const +const FString& F{{unrealModuleName}}HttpMultipartFormData::GetBoundary() const { if (Boundary.IsEmpty()) { @@ -66,7 +66,7 @@ const FString& HttpMultipartFormData::GetBoundary() const return Boundary; } -void HttpMultipartFormData::SetupHttpRequest(const FHttpRequestRef& HttpRequest) +void F{{unrealModuleName}}HttpMultipartFormData::SetupHttpRequest(const FHttpRequestRef& HttpRequest) { if(HttpRequest->GetVerb() != TEXT("POST")) { @@ -82,7 +82,7 @@ void HttpMultipartFormData::SetupHttpRequest(const FHttpRequestRef& HttpRequest) HttpRequest->SetContent(FormData); } -void HttpMultipartFormData::AddStringPart(const TCHAR* Name, const TCHAR* Data) +void F{{unrealModuleName}}HttpMultipartFormData::AddStringPart(const TCHAR* Name, const TCHAR* Data) { // Add boundary AppendString(Delimiter); @@ -103,7 +103,7 @@ void HttpMultipartFormData::AddStringPart(const TCHAR* Name, const TCHAR* Data) AppendString(Newline); } -void HttpMultipartFormData::AddJsonPart(const TCHAR* Name, const FString& JsonString) +void F{{unrealModuleName}}HttpMultipartFormData::AddJsonPart(const TCHAR* Name, const FString& JsonString) { // Add boundary AppendString(Delimiter); @@ -124,7 +124,7 @@ void HttpMultipartFormData::AddJsonPart(const TCHAR* Name, const FString& JsonSt AppendString(Newline); } -void HttpMultipartFormData::AddBinaryPart(const TCHAR* Name, const TArray& ByteArray) +void F{{unrealModuleName}}HttpMultipartFormData::AddBinaryPart(const TCHAR* Name, const TArray& ByteArray) { // Add boundary AppendString(Delimiter); @@ -145,7 +145,7 @@ void HttpMultipartFormData::AddBinaryPart(const TCHAR* Name, const TArray AppendString(Newline); } -void HttpMultipartFormData::AddFilePart(const TCHAR* Name, const F{{unrealModuleName}}HttpFileInput& File) +void F{{unrealModuleName}}HttpMultipartFormData::AddFilePart(const TCHAR* Name, const F{{unrealModuleName}}HttpFileInput& File) { TArray FileContents; if (!FFileHelper::LoadFileToArray(FileContents, *File.GetFilePath())) @@ -173,7 +173,7 @@ void HttpMultipartFormData::AddFilePart(const TCHAR* Name, const F{{unrealModule AppendString(Newline); } -void HttpMultipartFormData::AppendString(const TCHAR* Str) +void F{{unrealModuleName}}HttpMultipartFormData::AppendString(const TCHAR* Str) { FTCHARToUTF8 utf8Str(Str); FormData.Append((uint8*)utf8Str.Get(), utf8Str.Length()); From 69056395783f86e72767b4ecc09fb935594aabc2 Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Wed, 5 Feb 2025 23:13:19 +1000 Subject: [PATCH 16/35] chore: add f prefix to class --- .../template/cpp-ue4/api-header.mustache | 6 +- .../cpp-ue4/api-operations-header.mustache | 8 +- .../cpp-ue4/api-operations-source.mustache | 28 +++---- .../template/cpp-ue4/api-source.mustache | 30 ++++---- .../template/cpp-ue4/model-header.mustache | 10 +-- .../template/cpp-ue4/model-source.mustache | 76 +++++++++---------- 6 files changed, 77 insertions(+), 81 deletions(-) diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache index 9b5fe54..7e3146d 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache @@ -5,11 +5,11 @@ #include "CoreMinimal.h" #include "{{modelNamePrefix}}BaseModel.h" -class {{dllapi}} {{classname}} +class {{dllapi}} F{{classname}} { public: - {{classname}}(); - ~{{classname}}(); + F{{classname}}(); + ~F{{classname}}(); /* Sets the URL Endpoint. * Note: several fallback endpoints can be configured in request retry policies, see F{{unrealModuleName}}Request::SetShouldRetry */ diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache index 2f65209..6acfc68 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache @@ -14,7 +14,7 @@ {{#notes}} * * {{.}}{{/notes}} */ -class {{dllapi}} {{classname}}::{{operationIdCamelCase}}Request : public F{{unrealModuleName}}Request +class {{dllapi}} F{{classname}}::{{operationIdCamelCase}}Request : public F{{unrealModuleName}}Request { public: virtual ~{{operationIdCamelCase}}Request() {} @@ -39,12 +39,12 @@ public: {{/isEnum}} {{^isEnum}} {{#description}}/* {{{.}}} */ - {{/description}}{{^required}}TOptional<{{/required}}{{{dataType}}}{{^required}}>{{/required}} {{paramName}}{{#required}}{{#defaultValue}} = {{{.}}}{{/defaultValue}}{{/required}}; + {{/description}}{{^required}}TOptional<{{/required}}{{^isContainer}}{{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}}{{^required}}>{{/required}}{{/isContainer}}{{#isContainer}}{{#content}}{{#application/json}}{{#schema}}{{baseType}}{{#isPrimitiveType}}<{{/isPrimitiveType}}{{^isPrimitiveType}}{{^required}}>{{/required}}{{/isContainer}} {{paramName}}{{#required}}{{#defaultValue}} = {{{.}}}{{/defaultValue}}{{/required}}; {{/isEnum}} {{/allParams}} }; -class {{dllapi}} {{classname}}::{{operationIdCamelCase}}Response : public F{{unrealModuleName}}Response +class {{dllapi}} F{{classname}}::{{operationIdCamelCase}}Response : public F{{unrealModuleName}}Response { public: virtual ~{{operationIdCamelCase}}Response() {} @@ -53,7 +53,7 @@ public: {{/responses.0}} bool FromJson(const TSharedPtr& JsonValue) final; - {{#returnType}}{{{.}}} Content;{{/returnType}} + {{#returnProperty}}{{#isContainer}}{{baseType}}<{{^isPrimitiveType}}F{{/isPrimitiveType}}{{complexType}}>{{/isContainer}}{{^isContainer}}{{^isPrimitiveType}}F{{/isPrimitiveType}}{{baseType}}{{/isContainer}} Content;{{/returnProperty}} }; {{/operation}} diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache index cc9228d..3251fd3 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache @@ -13,31 +13,31 @@ {{#operations}}{{#operation}} {{#allParams}} {{#isEnum}} -inline FString ToString(const {{classname}}::{{operationIdCamelCase}}Request::{{{enumName}}}& Value) +inline FString ToString(const F{{classname}}::{{operationIdCamelCase}}Request::{{{enumName}}}& Value) { {{#allowableValues}} switch (Value) { {{#enumVars}} - case {{classname}}::{{operationIdCamelCase}}Request::{{{enumName}}}::{{name}}: + case F{{classname}}::{{operationIdCamelCase}}Request::{{{enumName}}}::{{name}}: return TEXT("{{{value}}}"); {{/enumVars}} } {{/allowableValues}} - UE_LOG(Log{{unrealModuleName}}, Error, TEXT("Invalid {{classname}}::{{operationIdCamelCase}}Request::{{{enumName}}} Value (%d)"), (int)Value); + UE_LOG(Log{{unrealModuleName}}, Error, TEXT("Invalid F{{classname}}::{{operationIdCamelCase}}Request::{{{enumName}}} Value (%d)"), (int)Value); return TEXT(""); } -FString {{classname}}::{{operationIdCamelCase}}Request::EnumToString(const {{classname}}::{{operationIdCamelCase}}Request::{{{enumName}}}& EnumValue) +FString F{{classname}}::{{operationIdCamelCase}}Request::EnumToString(const F{{classname}}::{{operationIdCamelCase}}Request::{{{enumName}}}& EnumValue) { return ToString(EnumValue); } -inline bool FromString(const FString& EnumAsString, {{classname}}::{{operationIdCamelCase}}Request::{{{enumName}}}& Value) +inline bool FromString(const FString& EnumAsString, F{{classname}}::{{operationIdCamelCase}}Request::{{{enumName}}}& Value) { - static TMap StringToEnum = { {{#allowableValues}}{{#enumVars}} - { TEXT("{{{value}}}"), {{classname}}::{{operationIdCamelCase}}Request::{{{enumName}}}::{{name}} },{{/enumVars}}{{/allowableValues}} }; + static TMap StringToEnum = { {{#allowableValues}}{{#enumVars}} + { TEXT("{{{value}}}"), F{{classname}}::{{operationIdCamelCase}}Request::{{{enumName}}}::{{name}} },{{/enumVars}}{{/allowableValues}} }; const auto Found = StringToEnum.Find(EnumAsString); if(Found) @@ -46,17 +46,17 @@ inline bool FromString(const FString& EnumAsString, {{classname}}::{{operationId return Found != nullptr; } -bool {{classname}}::{{operationIdCamelCase}}Request::EnumFromString(const FString& EnumAsString, {{classname}}::{{operationIdCamelCase}}Request::{{{enumName}}}& EnumValue) +bool F{{classname}}::{{operationIdCamelCase}}Request::EnumFromString(const FString& EnumAsString, F{{classname}}::{{operationIdCamelCase}}Request::{{{enumName}}}& EnumValue) { return FromString(EnumAsString, EnumValue); } -inline void WriteJsonValue(JsonWriter& Writer, const {{classname}}::{{operationIdCamelCase}}Request::{{{enumName}}}& Value) +inline void WriteJsonValue(JsonWriter& Writer, const F{{classname}}::{{operationIdCamelCase}}Request::{{{enumName}}}& Value) { WriteJsonValue(Writer, ToString(Value)); } -inline bool TryGetJsonValue(const TSharedPtr& JsonValue, {{classname}}::{{operationIdCamelCase}}Request::{{{enumName}}}& Value) +inline bool TryGetJsonValue(const TSharedPtr& JsonValue, F{{classname}}::{{operationIdCamelCase}}Request::{{{enumName}}}& Value) { {{#allowableValues}} FString TmpValue; @@ -71,7 +71,7 @@ inline bool TryGetJsonValue(const TSharedPtr& JsonValue, {{classname {{/isEnum}} {{/allParams}} -FString {{classname}}::{{operationIdCamelCase}}Request::ComputePath() const +FString F{{classname}}::{{operationIdCamelCase}}Request::ComputePath() const { {{^pathParams.0}} FString Path(TEXT("{{{path}}}")); @@ -126,7 +126,7 @@ FString {{classname}}::{{operationIdCamelCase}}Request::ComputePath() const return Path; } -void {{classname}}::{{operationIdCamelCase}}Request::SetupHttpRequest(const FHttpRequestRef& HttpRequest) const +void F{{classname}}::{{operationIdCamelCase}}Request::SetupHttpRequest(const FHttpRequestRef& HttpRequest) const { static const TArray Consumes = { {{#consumes}}TEXT("{{{mediaType}}}"){{^-last}}, {{/-last}}{{/consumes}} }; //static const TArray Produces = { {{#produces}}TEXT("{{{mediaType}}}"){{^-last}}, {{/-last}}{{/produces}} }; @@ -295,7 +295,7 @@ void {{classname}}::{{operationIdCamelCase}}Request::SetupHttpRequest(const FHtt } {{#responses.0}} -void {{classname}}::{{operationIdCamelCase}}Response::SetHttpResponseCode(EHttpResponseCodes::Type InHttpResponseCode) +void F{{classname}}::{{operationIdCamelCase}}Response::SetHttpResponseCode(EHttpResponseCodes::Type InHttpResponseCode) { F{{unrealModuleName}}Response::SetHttpResponseCode(InHttpResponseCode); switch ((int)InHttpResponseCode) @@ -312,7 +312,7 @@ void {{classname}}::{{operationIdCamelCase}}Response::SetHttpResponseCode(EHttpR } {{/responses.0}} -bool {{classname}}::{{operationIdCamelCase}}Response::FromJson(const TSharedPtr& JsonValue) +bool F{{classname}}::{{operationIdCamelCase}}Response::FromJson(const TSharedPtr& JsonValue) { {{#returnType}} return TryGetJsonValue(JsonValue, Content); diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache index 5ca62e4..c4c54d7 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache @@ -8,40 +8,40 @@ #include "HttpModule.h" #include "Serialization/JsonSerializer.h" -{{classname}}::{{classname}}() +F{{classname}}::F{{classname}}() : Url(TEXT("{{basePath}}")) { } -{{classname}}::~{{classname}}() {} +F{{classname}}::~F{{classname}}() {} -void {{classname}}::SetURL(const FString& InUrl) +void F{{classname}}::SetURL(const FString& InUrl) { Url = InUrl; } -void {{classname}}::AddHeaderParam(const FString& Key, const FString& Value) +void F{{classname}}::AddHeaderParam(const FString& Key, const FString& Value) { AdditionalHeaderParams.Add(Key, Value); } -void {{classname}}::ClearHeaderParams() +void F{{classname}}::ClearHeaderParams() { AdditionalHeaderParams.Reset(); } -bool {{classname}}::IsValid() const +bool F{{classname}}::IsValid() const { if (Url.IsEmpty()) { - UE_LOG(Log{{unrealModuleName}}, Error, TEXT("{{classname}}: Endpoint Url is not set, request cannot be performed")); + UE_LOG(Log{{unrealModuleName}}, Error, TEXT("F{{classname}}: Endpoint Url is not set, request cannot be performed")); return false; } return true; } -void {{classname}}::SetHttpRetryManager(FHttpRetrySystem::FManager& InRetryManager) +void F{{classname}}::SetHttpRetryManager(FHttpRetrySystem::FManager& InRetryManager) { if (RetryManager != &InRetryManager) { @@ -50,13 +50,13 @@ void {{classname}}::SetHttpRetryManager(FHttpRetrySystem::FManager& InRetryManag } } -FHttpRetrySystem::FManager& {{classname}}::GetHttpRetryManager() +FHttpRetrySystem::FManager& F{{classname}}::GetHttpRetryManager() { - checkf(RetryManager, TEXT("{{classname}}: RetryManager is null. You may have meant to set it with SetHttpRetryManager first, or you may not be using a custom RetryManager at all.")) + checkf(RetryManager, TEXT("F{{classname}}: RetryManager is null. You may have meant to set it with SetHttpRetryManager first, or you may not be using a custom RetryManager at all.")) return *RetryManager; } -FHttpRequestRef {{classname}}::CreateHttpRequest(const F{{unrealModuleName}}Request& Request) const +FHttpRequestRef F{{classname}}::CreateHttpRequest(const F{{unrealModuleName}}Request& Request) const { if (!Request.GetRetryParams().IsSet()) { @@ -76,7 +76,7 @@ FHttpRequestRef {{classname}}::CreateHttpRequest(const F{{unrealModuleName}}Requ } } -void {{classname}}::HandleResponse(FHttpResponsePtr HttpResponse, bool bSucceeded, F{{unrealModuleName}}Response& InOutResponse) const +void F{{classname}}::HandleResponse(FHttpResponsePtr HttpResponse, bool bSucceeded, F{{unrealModuleName}}Response& InOutResponse) const { InOutResponse.SetHttpResponse(HttpResponse); InOutResponse.SetSuccessful(bSucceeded); @@ -122,7 +122,7 @@ void {{classname}}::HandleResponse(FHttpResponsePtr HttpResponse, bool bSucceede {{#operations}} {{#operation}} -FHttpRequestPtr {{classname}}::{{operationIdCamelCase}}(const {{operationIdCamelCase}}Request& Request, const F{{operationIdCamelCase}}Delegate& Delegate /*= F{{operationIdCamelCase}}Delegate()*/) const +FHttpRequestPtr F{{classname}}::{{operationIdCamelCase}}(const {{operationIdCamelCase}}Request& Request, const F{{operationIdCamelCase}}Delegate& Delegate /*= F{{operationIdCamelCase}}Delegate()*/) const { if (!IsValid()) return nullptr; @@ -137,12 +137,12 @@ FHttpRequestPtr {{classname}}::{{operationIdCamelCase}}(const {{operationIdCamel Request.SetupHttpRequest(HttpRequest); - HttpRequest->OnProcessRequestComplete().BindRaw(this, &{{classname}}::On{{operationIdCamelCase}}Response, Delegate); + HttpRequest->OnProcessRequestComplete().BindRaw(this, &F{{classname}}::On{{operationIdCamelCase}}Response, Delegate); HttpRequest->ProcessRequest(); return HttpRequest; } -void {{classname}}::On{{operationIdCamelCase}}Response(FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSucceeded, F{{operationIdCamelCase}}Delegate Delegate) const +void F{{classname}}::On{{operationIdCamelCase}}Response(FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSucceeded, F{{operationIdCamelCase}}Delegate Delegate) const { {{operationIdCamelCase}}Response Response; HandleResponse(HttpResponse, bSucceeded, Response); diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache index 7d87cc7..1117685 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache @@ -20,14 +20,14 @@ {{#model}} /* - * {{classname}} + * F{{classname}} * * {{description}} */ -class {{dllapi}} {{classname}} : public F{{unrealModuleName}}Model +class {{dllapi}} F{{classname}} : public F{{unrealModuleName}}Model { public: - virtual ~{{classname}}() {} + virtual ~F{{classname}}() {} bool FromJson(const TSharedPtr& JsonValue) final; void WriteJson(JsonWriter& Writer) const final; @@ -70,13 +70,13 @@ public: {{^isEnum}} {{^oneOf}} {{#description}}/* {{{.}}} */ - {{/description}}{{^required}}TOptional<{{/required}}{{{datatype}}}{{^required}}>{{/required}} {{name}}{{#required}}{{#defaultValue}} = {{{.}}}{{/defaultValue}}{{/required}}; + {{/description}}{{^required}}TOptional<{{/required}}{{#isPrimitiveType}}{{{datatype}}}{{/isPrimitiveType}}{{^isPrimitiveType}}{{#isContainer}}{{{baseType}}}{{/isContainer}}{{^isContainer}}F{{{datatype}}}{{/isContainer}}{{/isPrimitiveType}}{{^required}}>{{/required}} {{name}}{{#required}}{{#defaultValue}} = {{{.}}}{{/defaultValue}}{{/required}}; {{/oneOf}} {{/isEnum}} {{/vars}} {{#oneOf}} {{#-first}} - TVariant<{{#oneOf}}{{{.}}}{{^-last}}, {{/-last}}{{/oneOf}}> OneOf; + TVariant<{{#composedSchemas}}{{#oneOf}}{{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}}{{^-last}}, {{/-last}}{{/oneOf}}{{/composedSchemas}}> OneOf; {{/-first}} {{/oneOf}} }; diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache index 6ed7f3c..ada0e5e 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache @@ -9,31 +9,31 @@ {{#models}}{{#model}} {{#isEnum}} -inline FString ToString(const {{classname}}::Values& Value) +inline FString ToString(const F{{classname}}::Values& Value) { {{#allowableValues}} switch (Value) { {{#enumVars}} - case {{classname}}::Values::{{name}}: + case F{{classname}}::Values::{{name}}: return TEXT("{{{value}}}"); {{/enumVars}} } {{/allowableValues}} - UE_LOG(Log{{unrealModuleName}}, Error, TEXT("Invalid {{classname}}::Values Value (%d)"), (int)Value); + UE_LOG(Log{{unrealModuleName}}, Error, TEXT("Invalid F{{classname}}::Values Value (%d)"), (int)Value); return TEXT(""); } -FString {{classname}}::EnumToString(const {{classname}}::Values& EnumValue) +FString F{{classname}}::EnumToString(const F{{classname}}::Values& EnumValue) { return ToString(EnumValue); } -inline bool FromString(const FString& EnumAsString, {{classname}}::Values& Value) +inline bool FromString(const FString& EnumAsString, F{{classname}}::Values& Value) { - static TMap StringToEnum = { {{#allowableValues}}{{#enumVars}} - { TEXT("{{{value}}}"), {{classname}}::Values::{{name}} },{{/enumVars}}{{/allowableValues}} }; + static TMap StringToEnum = { {{#allowableValues}}{{#enumVars}} + { TEXT("{{{value}}}"), F{{classname}}::Values::{{name}} },{{/enumVars}}{{/allowableValues}} }; const auto Found = StringToEnum.Find(EnumAsString); if(Found) @@ -42,17 +42,17 @@ inline bool FromString(const FString& EnumAsString, {{classname}}::Values& Value return Found != nullptr; } -bool {{classname}}::EnumFromString(const FString& EnumAsString, {{classname}}::Values& EnumValue) +bool F{{classname}}::EnumFromString(const FString& EnumAsString, F{{classname}}::Values& EnumValue) { return FromString(EnumAsString, EnumValue); } -inline void WriteJsonValue(JsonWriter& Writer, const {{classname}}::Values& Value) +inline void WriteJsonValue(JsonWriter& Writer, const F{{classname}}::Values& Value) { WriteJsonValue(Writer, ToString(Value)); } -inline bool TryGetJsonValue(const TSharedPtr& JsonValue, {{classname}}::Values& Value) +inline bool TryGetJsonValue(const TSharedPtr& JsonValue, F{{classname}}::Values& Value) { {{#allowableValues}} FString TmpValue; @@ -69,31 +69,31 @@ inline bool TryGetJsonValue(const TSharedPtr& JsonValue, {{classname {{#hasEnums}} {{#vars}} {{#isEnum}} -inline FString ToString(const {{classname}}::{{{enumName}}}& Value) +inline FString ToString(const F{{classname}}::{{{enumName}}}& Value) { {{#allowableValues}} switch (Value) { {{#enumVars}} - case {{classname}}::{{{enumName}}}::{{name}}: + case F{{classname}}::{{{enumName}}}::{{name}}: return TEXT("{{{value}}}"); {{/enumVars}} } {{/allowableValues}} - UE_LOG(Log{{unrealModuleName}}, Error, TEXT("Invalid {{classname}}::{{{enumName}}} Value (%d)"), (int)Value); + UE_LOG(Log{{unrealModuleName}}, Error, TEXT("Invalid F{{classname}}::{{{enumName}}} Value (%d)"), (int)Value); return TEXT(""); } -FString {{classname}}::EnumToString(const {{classname}}::{{{enumName}}}& EnumValue) +FString F{{classname}}::EnumToString(const F{{classname}}::{{{enumName}}}& EnumValue) { return ToString(EnumValue); } -inline bool FromString(const FString& EnumAsString, {{classname}}::{{{enumName}}}& Value) +inline bool FromString(const FString& EnumAsString, F{{classname}}::{{{enumName}}}& Value) { - static TMap StringToEnum = { {{#allowableValues}}{{#enumVars}} - { TEXT("{{{value}}}"), {{classname}}::{{{enumName}}}::{{name}} },{{/enumVars}}{{/allowableValues}} }; + static TMap StringToEnum = { {{#allowableValues}}{{#enumVars}} + { TEXT("{{{value}}}"), F{{classname}}::{{{enumName}}}::{{name}} },{{/enumVars}}{{/allowableValues}} }; const auto Found = StringToEnum.Find(EnumAsString); if(Found) @@ -102,17 +102,17 @@ inline bool FromString(const FString& EnumAsString, {{classname}}::{{{enumName}} return Found != nullptr; } -bool {{classname}}::EnumFromString(const FString& EnumAsString, {{classname}}::{{{enumName}}}& EnumValue) +bool F{{classname}}::EnumFromString(const FString& EnumAsString, F{{classname}}::{{{enumName}}}& EnumValue) { return FromString(EnumAsString, EnumValue); } -inline void WriteJsonValue(JsonWriter& Writer, const {{classname}}::{{{enumName}}}& Value) +inline void WriteJsonValue(JsonWriter& Writer, const F{{classname}}::{{{enumName}}}& Value) { WriteJsonValue(Writer, ToString(Value)); } -inline bool TryGetJsonValue(const TSharedPtr& JsonValue, {{classname}}::{{{enumName}}}& Value) +inline bool TryGetJsonValue(const TSharedPtr& JsonValue, F{{classname}}::{{{enumName}}}& Value) { {{#allowableValues}} FString TmpValue; @@ -128,49 +128,45 @@ inline bool TryGetJsonValue(const TSharedPtr& JsonValue, {{classname {{/isEnum}} {{/vars}} {{/hasEnums}} -void {{classname}}::WriteJson(JsonWriter& Writer) const +void F{{classname}}::WriteJson(JsonWriter& Writer) const { - {{#isString}} - WriteJsonValue(Writer, Value); - {{/isString}} - {{#oneOf}} - {{^-first}}else {{/-first}}if (const {{.}}* {{#lambda.pascalcase}}{{.}}{{/lambda.pascalcase}}Value = OneOf.TryGet<{{.}}>()) + {{#isString}}WriteJsonValue(Writer, Value);{{/isString}}{{#composedSchemas}}{{#oneOf}}{{^-first}} + else {{/-first}}if (const {{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}}* {{#lambda.pascalcase}}{{dataType}}{{/lambda.pascalcase}}Value = OneOf.TryGet<{{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}}>()) { - WriteJsonValue(Writer, *{{#lambda.pascalcase}}{{.}}{{/lambda.pascalcase}}Value); - } - {{/oneOf}} - {{^oneOf}} - {{^isString}} - Writer->WriteObjectStart(); + WriteJsonValue(Writer, *{{#lambda.pascalcase}}{{dataType}}{{/lambda.pascalcase}}Value); + }{{/oneOf}}{{/composedSchemas}}{{^oneOf}}{{^isString}}Writer->WriteObjectStart(); + {{#vars}} {{#required}} Writer->WriteIdentifierPrefix(TEXT("{{baseName}}")); WriteJsonValue(Writer, {{name}}); {{/required}} {{^required}} + if ({{name}}.IsSet()) { Writer->WriteIdentifierPrefix(TEXT("{{baseName}}")); WriteJsonValue(Writer, {{name}}.GetValue()); } {{/required}} {{/vars}} - Writer->WriteObjectEnd(); - {{/isString}} - {{/oneOf}} + + Writer->WriteObjectEnd();{{/isString}}{{/oneOf}} } -bool {{classname}}::FromJson(const TSharedPtr& JsonValue) +bool F{{classname}}::FromJson(const TSharedPtr& JsonValue) { {{#isString}} return TryGetJsonValue(JsonValue, Value); {{/isString}} - {{#oneOf}} - {{.}} {{#lambda.pascalcase}}{{.}}{{/lambda.pascalcase}}Value; - if (const bool bIs{{#lambda.pascalcase}}{{.}}{{/lambda.pascalcase}} = TryGetJsonValue(JsonValue, {{#lambda.pascalcase}}{{.}}{{/lambda.pascalcase}}Value)) + {{#composedSchemas}}{{#oneOf}}{{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}} {{#lambda.pascalcase}}{{dataType}}{{/lambda.pascalcase}}Value; + if (const bool bIs{{#lambda.pascalcase}}{{dataType}}{{/lambda.pascalcase}} = TryGetJsonValue(JsonValue, {{#lambda.pascalcase}}{{dataType}}{{/lambda.pascalcase}}Value)) { - OneOf.Set<{{.}}>({{#lambda.pascalcase}}{{.}}{{/lambda.pascalcase}}Value); + OneOf.Set<{{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}}>({{#lambda.pascalcase}}{{dataType}}{{/lambda.pascalcase}}Value); return true; } + {{/oneOf}}{{/composedSchemas}} + + {{#oneOf}} {{#-last}} return false; {{/-last}} From e55fab87cbbe80aa67b323e854dbdaa12e31bb24 Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Wed, 5 Feb 2025 23:29:22 +1000 Subject: [PATCH 17/35] chore: fix formatting for fromjson --- .../template/cpp-ue4/model-source.mustache | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache index ada0e5e..a66f4cb 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache @@ -154,28 +154,18 @@ void F{{classname}}::WriteJson(JsonWriter& Writer) const bool F{{classname}}::FromJson(const TSharedPtr& JsonValue) { - {{#isString}} - return TryGetJsonValue(JsonValue, Value); - {{/isString}} - {{#composedSchemas}}{{#oneOf}}{{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}} {{#lambda.pascalcase}}{{dataType}}{{/lambda.pascalcase}}Value; + {{#isString}}return TryGetJsonValue(JsonValue, Value);{{/isString}}{{#composedSchemas}}{{#oneOf}}{{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}} {{#lambda.pascalcase}}{{dataType}}{{/lambda.pascalcase}}Value; if (const bool bIs{{#lambda.pascalcase}}{{dataType}}{{/lambda.pascalcase}} = TryGetJsonValue(JsonValue, {{#lambda.pascalcase}}{{dataType}}{{/lambda.pascalcase}}Value)) { OneOf.Set<{{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}}>({{#lambda.pascalcase}}{{dataType}}{{/lambda.pascalcase}}Value); return true; } - {{/oneOf}}{{/composedSchemas}} - - {{#oneOf}} - {{#-last}} - return false; - {{/-last}} - {{/oneOf}} - {{^oneOf}} - {{^isString}} - const TSharedPtr* Object; + {{/oneOf}}{{/composedSchemas}}{{#oneOf}}{{#-last}}return false;{{/-last}}{{/oneOf}}{{^oneOf}}{{^isString}}const TSharedPtr* Object; if (!JsonValue->TryGetObject(Object)) + { return false; + } bool ParseSuccess = true; From da2477dcdc1c3905adef1b9f0344c6adda4bfece Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Thu, 6 Feb 2025 22:01:31 +1000 Subject: [PATCH 18/35] chore: refactor enum to uenum --- .../template/cpp-ue4/Build.cs.mustache | 1 + .../cpp-ue4/api-operations-header.mustache | 29 +++-- .../cpp-ue4/api-operations-source.mustache | 62 +++------ .../template/cpp-ue4/helpers-header.mustache | 6 +- .../template/cpp-ue4/model-header.mustache | 66 +++++----- .../template/cpp-ue4/model-source.mustache | 122 +++--------------- 6 files changed, 95 insertions(+), 191 deletions(-) diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/Build.cs.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/Build.cs.mustache index 0ebe570..90d9cfa 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/Build.cs.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/Build.cs.mustache @@ -13,6 +13,7 @@ public class {{unrealModuleName}} : ModuleRules PublicDependencyModuleNames.AddRange(new string[] { "Core", + "CoreUObject", "HTTP", "Json", }); diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache index 6acfc68..f021438 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache @@ -2,6 +2,8 @@ #pragma once +#include "UObject/ObjectMacros.h" + #include "{{modelNamePrefix}}BaseModel.h" #include "{{classname}}.h" @@ -10,6 +12,20 @@ {{#operations}} {{#operation}} +{{#allParams}} +{{#isEnum}} +{{#allowableValues}} +UENUM(BlueprintType) +enum class E{{classname}}_{{operationIdCamelCase}}Request_{{paramName}} : uint8 +{ + {{#enumVars}} + {{name}} UMETA(DisplayName = "{{value}}"){{^-last}},{{/-last}} + {{/enumVars}} +}; + +{{/allowableValues}} +{{/isEnum}} +{{/allParams}} /* {{summary}} {{#notes}} * * {{.}}{{/notes}} @@ -23,19 +39,8 @@ public: {{#allParams}} {{#isEnum}} - {{#allowableValues}} - enum class {{{enumName}}} - { - {{#enumVars}} - {{name}}, - {{/enumVars}} - }; - {{/allowableValues}} - - static FString EnumToString(const {{{enumName}}}& EnumValue); - static bool EnumFromString(const FString& EnumAsString, {{{enumName}}}& EnumValue); {{#description}}/* {{{.}}} */ - {{/description}}{{^required}}TOptional<{{/required}}{{{datatypeWithEnum}}}{{^required}}>{{/required}} {{paramName}}{{#required}}{{#defaultValue}} = {{{.}}}{{/defaultValue}}{{/required}}; + {{/description}}{{^required}}TOptional<{{/required}}E{{classname}}_{{operationIdCamelCase}}Request_{{paramName}}{{^required}}>{{/required}} {{paramName}}{{#required}}{{#defaultValue}} = {{{.}}}{{/defaultValue}}{{/required}}; {{/isEnum}} {{^isEnum}} {{#description}}/* {{{.}}} */ diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache index 3251fd3..f4f1fca 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache @@ -2,6 +2,8 @@ #include "{{classname}}Operations.h" +#include "UObject/Class.h" + #include "{{unrealModuleName}}Module.h" #include "{{modelNamePrefix}}Helpers.h" @@ -13,58 +15,20 @@ {{#operations}}{{#operation}} {{#allParams}} {{#isEnum}} -inline FString ToString(const F{{classname}}::{{operationIdCamelCase}}Request::{{{enumName}}}& Value) -{ - {{#allowableValues}} - switch (Value) - { - {{#enumVars}} - case F{{classname}}::{{operationIdCamelCase}}Request::{{{enumName}}}::{{name}}: - return TEXT("{{{value}}}"); - {{/enumVars}} - } - {{/allowableValues}} - - UE_LOG(Log{{unrealModuleName}}, Error, TEXT("Invalid F{{classname}}::{{operationIdCamelCase}}Request::{{{enumName}}} Value (%d)"), (int)Value); - return TEXT(""); -} - -FString F{{classname}}::{{operationIdCamelCase}}Request::EnumToString(const F{{classname}}::{{operationIdCamelCase}}Request::{{{enumName}}}& EnumValue) -{ - return ToString(EnumValue); -} - -inline bool FromString(const FString& EnumAsString, F{{classname}}::{{operationIdCamelCase}}Request::{{{enumName}}}& Value) +inline void WriteJsonValue(JsonWriter& Writer, E{{classname}}_{{operationIdCamelCase}}Request_{{paramName}} Value) { - static TMap StringToEnum = { {{#allowableValues}}{{#enumVars}} - { TEXT("{{{value}}}"), F{{classname}}::{{operationIdCamelCase}}Request::{{{enumName}}}::{{name}} },{{/enumVars}}{{/allowableValues}} }; - - const auto Found = StringToEnum.Find(EnumAsString); - if(Found) - Value = *Found; - - return Found != nullptr; -} - -bool F{{classname}}::{{operationIdCamelCase}}Request::EnumFromString(const FString& EnumAsString, F{{classname}}::{{operationIdCamelCase}}Request::{{{enumName}}}& EnumValue) -{ - return FromString(EnumAsString, EnumValue); -} - -inline void WriteJsonValue(JsonWriter& Writer, const F{{classname}}::{{operationIdCamelCase}}Request::{{{enumName}}}& Value) -{ - WriteJsonValue(Writer, ToString(Value)); + WriteJsonValue(Writer, StaticEnum()->GetNameStringByValue(static_cast(Value))); } -inline bool TryGetJsonValue(const TSharedPtr& JsonValue, F{{classname}}::{{operationIdCamelCase}}Request::{{{enumName}}}& Value) +inline bool TryGetJsonValue(const TSharedPtr& JsonValue, E{{classname}}_{{operationIdCamelCase}}Request_{{paramName}} Value) { {{#allowableValues}} - FString TmpValue; - if (JsonValue->TryGetString(TmpValue)) + FString EnumNameString; + if (JsonValue->TryGetString(EnumNameString)) { - if(FromString(TmpValue, Value)) - return true; + return StaticEnum()->GetIndexByNameString(EnumNameString) != INDEX_NONE; } + {{/allowableValues}} return false; } @@ -101,10 +65,18 @@ FString F{{classname}}::{{operationIdCamelCase}}Request::ComputePath() const {{/required}} {{^required}} {{^collectionFormat}} + {{#isEnum}} + if({{paramName}}.IsSet()) + { + QueryParams.Add(FString(TEXT("{{baseName}}=")) + StaticEnum()->GetNameStringByValue(static_cast({{paramName}}.GetValue()))); + } + {{/isEnum}} + {{^isEnum}} if({{paramName}}.IsSet()) { QueryParams.Add(FString(TEXT("{{baseName}}=")) + ToUrlString({{paramName}}.GetValue())); } + {{/isEnum}} {{/collectionFormat}} {{#collectionFormat}} if({{paramName}}.IsSet()) diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache index 9ef40dd..ad60326 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache @@ -478,14 +478,14 @@ inline bool TryGetJsonValue(const TSharedPtr& JsonObject, const FSt const TSharedPtr JsonValue = JsonObject->TryGetField(Key); if (JsonValue.IsValid() && !JsonValue->IsNull()) { - T Value; + T Value = {}; if (TryGetJsonValue(JsonValue, Value)) { OptionalValue = Value; return true; } - else - return false; + + return false; } // Absence of optional value is not a parsing error. // Nullable is handled like optional. diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache index 1117685..f00a513 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache @@ -2,22 +2,49 @@ #pragma once +#include "UObject/ObjectMacros.h" {{#models}} - {{#model}} - {{#oneOf}} - {{#-first}} +{{#model}} +{{#oneOf}} +{{#-first}} #include "Misc/TVariant.h" - - {{/-first}} - {{/oneOf}} - {{/model}} +{{/-first}} +{{/oneOf}} +{{/model}} {{/models}} + #include "{{modelNamePrefix}}BaseModel.h" {{#imports}}{{{import}}} {{/imports}} {{#models}} {{#model}} +{{#isString}} +{{#isEnum}} +{{#allowableValues}} +UENUM(BlueprintType) +enum class E{{classname}}_{{name}}_Values : uint8 +{ + {{#enumVars}} + {{name}} UMETA(DisplayName = "{{value}}"){{^-last}},{{/-last}} + {{/enumVars}} +}; +{{/allowableValues}} +{{/isEnum}} +{{/isString}} +{{#vars}} +{{#isEnum}} +{{#allowableValues}} +UENUM(BlueprintType) +enum class E{{classname}}_{{name}} : uint8 +{ + {{#enumVars}} + {{name}} UMETA(DisplayName = "{{value}}"){{^-last}},{{/-last}} + {{/enumVars}} +}; + {{/allowableValues}} +{{/isEnum}} +{{/vars}} /* * F{{classname}} @@ -34,18 +61,8 @@ public: {{#isString}} {{#isEnum}} {{#allowableValues}} - enum class Values - { - {{#enumVars}} - {{name}}, - {{/enumVars}} - }; - - Values Value{{#defaultValue}} = {{{.}}}{{/defaultValue}}; + E{{classname}}_{{name}}_Values Value{{#defaultValue}} = {{{.}}}{{/defaultValue}}; {{/allowableValues}} - - static FString EnumToString(const Values& EnumValue); - static bool EnumFromString(const FString& EnumAsString, Values& EnumValue); {{/isEnum}} {{^isEnum}} FString Value{{#defaultValue}} = {{{.}}}{{/defaultValue}}; @@ -53,19 +70,8 @@ public: {{/isString}} {{#vars}} {{#isEnum}} - {{#allowableValues}} - enum class {{{enumName}}} - { - {{#enumVars}} - {{name}}, - {{/enumVars}} - }; - {{/allowableValues}} - - static FString EnumToString(const {{{enumName}}}& EnumValue); - static bool EnumFromString(const FString& EnumAsString, {{{enumName}}}& EnumValue); {{#description}}/* {{{.}}} */ - {{/description}}{{^required}}TOptional<{{/required}}{{{datatypeWithEnum}}}{{^required}}>{{/required}} {{name}}{{#required}}{{#defaultValue}} = {{{.}}}{{/defaultValue}}{{/required}}; + {{/description}}{{^required}}TOptional<{{/required}}E{{classname}}_{{name}}{{^required}}>{{/required}} {{name}}{{#required}}{{#defaultValue}} = {{{.}}}{{/defaultValue}}{{/required}}; {{/isEnum}} {{^isEnum}} {{^oneOf}} diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache index a66f4cb..c944d82 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache @@ -1,66 +1,29 @@ {{>licenseInfo}} #include "{{classname}}.h" +{{#models}}{{#model}}{{#isEnum}} +#include "UObject/Class.h"{{/isEnum}}{{#hasEnums}}#include "UObject/Class.h"{{/hasEnums}}{{/model}}{{/models}} +#include "Templates/SharedPointer.h" -#include "{{unrealModuleName}}Module.h" #include "{{modelNamePrefix}}Helpers.h" -#include "Templates/SharedPointer.h" - -{{#models}}{{#model}} +{{#models}} +{{#model}} {{#isEnum}} -inline FString ToString(const F{{classname}}::Values& Value) -{ - {{#allowableValues}} - switch (Value) - { - {{#enumVars}} - case F{{classname}}::Values::{{name}}: - return TEXT("{{{value}}}"); - {{/enumVars}} - } - {{/allowableValues}} - - UE_LOG(Log{{unrealModuleName}}, Error, TEXT("Invalid F{{classname}}::Values Value (%d)"), (int)Value); - return TEXT(""); -} - -FString F{{classname}}::EnumToString(const F{{classname}}::Values& EnumValue) +inline void WriteJsonValue(JsonWriter& Writer, E{{classname}}_{{name}}_Values Value) { - return ToString(EnumValue); + WriteJsonValue(Writer, StaticEnum()->GetNameStringByValue(static_cast(Value))); } -inline bool FromString(const FString& EnumAsString, F{{classname}}::Values& Value) -{ - static TMap StringToEnum = { {{#allowableValues}}{{#enumVars}} - { TEXT("{{{value}}}"), F{{classname}}::Values::{{name}} },{{/enumVars}}{{/allowableValues}} }; - - const auto Found = StringToEnum.Find(EnumAsString); - if(Found) - Value = *Found; - - return Found != nullptr; -} - -bool F{{classname}}::EnumFromString(const FString& EnumAsString, F{{classname}}::Values& EnumValue) -{ - return FromString(EnumAsString, EnumValue); -} - -inline void WriteJsonValue(JsonWriter& Writer, const F{{classname}}::Values& Value) -{ - WriteJsonValue(Writer, ToString(Value)); -} - -inline bool TryGetJsonValue(const TSharedPtr& JsonValue, F{{classname}}::Values& Value) +inline bool TryGetJsonValue(const TSharedPtr& JsonValue, E{{classname}}_{{name}}_Values Value) { {{#allowableValues}} - FString TmpValue; - if (JsonValue->TryGetString(TmpValue)) + FString EnumNameString; + if (JsonValue->TryGetString(EnumNameString)) { - if(FromString(TmpValue, Value)) - return true; + return StaticEnum()->GetIndexByNameString(EnumNameString) != INDEX_NONE; } + {{/allowableValues}} return false; } @@ -69,58 +32,20 @@ inline bool TryGetJsonValue(const TSharedPtr& JsonValue, F{{classnam {{#hasEnums}} {{#vars}} {{#isEnum}} -inline FString ToString(const F{{classname}}::{{{enumName}}}& Value) +inline void WriteJsonValue(JsonWriter& Writer, E{{classname}}_{{name}} Value) { - {{#allowableValues}} - switch (Value) - { - {{#enumVars}} - case F{{classname}}::{{{enumName}}}::{{name}}: - return TEXT("{{{value}}}"); - {{/enumVars}} - } - {{/allowableValues}} - - UE_LOG(Log{{unrealModuleName}}, Error, TEXT("Invalid F{{classname}}::{{{enumName}}} Value (%d)"), (int)Value); - return TEXT(""); -} - -FString F{{classname}}::EnumToString(const F{{classname}}::{{{enumName}}}& EnumValue) -{ - return ToString(EnumValue); -} - -inline bool FromString(const FString& EnumAsString, F{{classname}}::{{{enumName}}}& Value) -{ - static TMap StringToEnum = { {{#allowableValues}}{{#enumVars}} - { TEXT("{{{value}}}"), F{{classname}}::{{{enumName}}}::{{name}} },{{/enumVars}}{{/allowableValues}} }; - - const auto Found = StringToEnum.Find(EnumAsString); - if(Found) - Value = *Found; - - return Found != nullptr; -} - -bool F{{classname}}::EnumFromString(const FString& EnumAsString, F{{classname}}::{{{enumName}}}& EnumValue) -{ - return FromString(EnumAsString, EnumValue); + WriteJsonValue(Writer, StaticEnum()->GetNameStringByValue(static_cast(Value))); } -inline void WriteJsonValue(JsonWriter& Writer, const F{{classname}}::{{{enumName}}}& Value) -{ - WriteJsonValue(Writer, ToString(Value)); -} - -inline bool TryGetJsonValue(const TSharedPtr& JsonValue, F{{classname}}::{{{enumName}}}& Value) +inline bool TryGetJsonValue(const TSharedPtr& JsonValue, E{{classname}}_{{name}} Value) { {{#allowableValues}} - FString TmpValue; - if (JsonValue->TryGetString(TmpValue)) + FString EnumNameString; + if (JsonValue->TryGetString(EnumNameString)) { - if(FromString(TmpValue, Value)) - return true; + return StaticEnum()->GetIndexByNameString(EnumNameString) != INDEX_NONE; } + {{/allowableValues}} return false; } @@ -178,10 +103,5 @@ bool F{{classname}}::FromJson(const TSharedPtr& JsonValue) {{/required}} {{/vars}} - return ParseSuccess; - {{/isString}} - {{/oneOf}} -} - -{{/model}} -{{/models}} \ No newline at end of file + return ParseSuccess;{{/isString}}{{/oneOf}} +}{{/model}}{{/models}} \ No newline at end of file From aef42d252252bd11f034d925c584100a2b3b4cb6 Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Thu, 6 Feb 2025 22:09:12 +1000 Subject: [PATCH 19/35] chore: add override to destructor and move them into source file --- .../template/cpp-ue4/api-operations-header.mustache | 4 ++-- .../template/cpp-ue4/api-operations-source.mustache | 8 ++++++++ .../template/cpp-ue4/model-header.mustache | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache index f021438..7efdd06 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache @@ -33,7 +33,7 @@ enum class E{{classname}}_{{operationIdCamelCase}}Request_{{paramName}} : uint8 class {{dllapi}} F{{classname}}::{{operationIdCamelCase}}Request : public F{{unrealModuleName}}Request { public: - virtual ~{{operationIdCamelCase}}Request() {} + virtual ~{{operationIdCamelCase}}Request() override; void SetupHttpRequest(const FHttpRequestRef& HttpRequest) const final; FString ComputePath() const final; @@ -52,7 +52,7 @@ public: class {{dllapi}} F{{classname}}::{{operationIdCamelCase}}Response : public F{{unrealModuleName}}Response { public: - virtual ~{{operationIdCamelCase}}Response() {} + virtual ~{{operationIdCamelCase}}Response() override; {{#responses.0}} void SetHttpResponseCode(EHttpResponseCodes::Type InHttpResponseCode) final; {{/responses.0}} diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache index f4f1fca..5f2722c 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache @@ -98,6 +98,10 @@ FString F{{classname}}::{{operationIdCamelCase}}Request::ComputePath() const return Path; } +F{{classname}}::{{operationIdCamelCase}}Request::~{{operationIdCamelCase}}Request() +{ +} + void F{{classname}}::{{operationIdCamelCase}}Request::SetupHttpRequest(const FHttpRequestRef& HttpRequest) const { static const TArray Consumes = { {{#consumes}}TEXT("{{{mediaType}}}"){{^-last}}, {{/-last}}{{/consumes}} }; @@ -266,6 +270,10 @@ void F{{classname}}::{{operationIdCamelCase}}Request::SetupHttpRequest(const FHt {{/isBodyAllowed}} } +F{{classname}}::{{operationIdCamelCase}}Response::~{{operationIdCamelCase}}Response() +{ +} + {{#responses.0}} void F{{classname}}::{{operationIdCamelCase}}Response::SetHttpResponseCode(EHttpResponseCodes::Type InHttpResponseCode) { diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache index f00a513..7dc0933 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache @@ -54,7 +54,7 @@ enum class E{{classname}}_{{name}} : uint8 class {{dllapi}} F{{classname}} : public F{{unrealModuleName}}Model { public: - virtual ~F{{classname}}() {} + virtual ~F{{classname}}() override {} bool FromJson(const TSharedPtr& JsonValue) final; void WriteJson(JsonWriter& Writer) const final; From 587daba4063fcc566aa23179348fece26d9074ee Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Thu, 6 Feb 2025 22:15:23 +1000 Subject: [PATCH 20/35] chore: add virtual and override --- .../template/cpp-ue4/api-operations-header.mustache | 8 ++++---- .../template/cpp-ue4/model-base-header.mustache | 2 +- .../template/cpp-ue4/model-header.mustache | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache index 7efdd06..100a5df 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache @@ -34,8 +34,8 @@ class {{dllapi}} F{{classname}}::{{operationIdCamelCase}}Request : public F{{unr { public: virtual ~{{operationIdCamelCase}}Request() override; - void SetupHttpRequest(const FHttpRequestRef& HttpRequest) const final; - FString ComputePath() const final; + virtual void SetupHttpRequest(const FHttpRequestRef& HttpRequest) const override final; + virtual FString ComputePath() const override final; {{#allParams}} {{#isEnum}} @@ -54,9 +54,9 @@ class {{dllapi}} F{{classname}}::{{operationIdCamelCase}}Response : public F{{un public: virtual ~{{operationIdCamelCase}}Response() override; {{#responses.0}} - void SetHttpResponseCode(EHttpResponseCodes::Type InHttpResponseCode) final; + virtual void SetHttpResponseCode(EHttpResponseCodes::Type InHttpResponseCode) override final; {{/responses.0}} - bool FromJson(const TSharedPtr& JsonValue) final; + virtual bool FromJson(const TSharedPtr& JsonValue) override final; {{#returnProperty}}{{#isContainer}}{{baseType}}<{{^isPrimitiveType}}F{{/isPrimitiveType}}{{complexType}}>{{/isContainer}}{{^isContainer}}{{^isPrimitiveType}}F{{/isPrimitiveType}}{{baseType}}{{/isContainer}} Content;{{/returnProperty}} }; diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache index 21ccfca..c932211 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache @@ -23,7 +23,7 @@ struct {{dllapi}} F{{unrealModuleName}}HttpRetryManager { using FManager::FManager; - bool Tick(float DeltaTime) final; + virtual bool Tick(float DeltaTime) override final; }; struct {{dllapi}} F{{unrealModuleName}}HttpRetryParams diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache index 7dc0933..3fac862 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache @@ -55,8 +55,8 @@ class {{dllapi}} F{{classname}} : public F{{unrealModuleName}}Model { public: virtual ~F{{classname}}() override {} - bool FromJson(const TSharedPtr& JsonValue) final; - void WriteJson(JsonWriter& Writer) const final; + virtual bool FromJson(const TSharedPtr& JsonValue) override final; + virtual void WriteJson(JsonWriter& Writer) const override final; {{#isString}} {{#isEnum}} From 368a2659a2d994acd1de340fa873d51cbb605ed9 Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Thu, 6 Feb 2025 22:28:47 +1000 Subject: [PATCH 21/35] chore: add spacing to member variables --- .../template/cpp-ue4/api-operations-header.mustache | 3 ++- .../openapi-generator/template/cpp-ue4/model-header.mustache | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache index 100a5df..d9e4bdc 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache @@ -36,13 +36,14 @@ public: virtual ~{{operationIdCamelCase}}Request() override; virtual void SetupHttpRequest(const FHttpRequestRef& HttpRequest) const override final; virtual FString ComputePath() const override final; - {{#allParams}} {{#isEnum}} + {{#description}}/* {{{.}}} */ {{/description}}{{^required}}TOptional<{{/required}}E{{classname}}_{{operationIdCamelCase}}Request_{{paramName}}{{^required}}>{{/required}} {{paramName}}{{#required}}{{#defaultValue}} = {{{.}}}{{/defaultValue}}{{/required}}; {{/isEnum}} {{^isEnum}} + {{#description}}/* {{{.}}} */ {{/description}}{{^required}}TOptional<{{/required}}{{^isContainer}}{{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}}{{^required}}>{{/required}}{{/isContainer}}{{#isContainer}}{{#content}}{{#application/json}}{{#schema}}{{baseType}}{{#isPrimitiveType}}<{{/isPrimitiveType}}{{^isPrimitiveType}}{{^required}}>{{/required}}{{/isContainer}} {{paramName}}{{#required}}{{#defaultValue}} = {{{.}}}{{/defaultValue}}{{/required}}; {{/isEnum}} diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache index 3fac862..1bbeb04 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache @@ -57,7 +57,6 @@ public: virtual ~F{{classname}}() override {} virtual bool FromJson(const TSharedPtr& JsonValue) override final; virtual void WriteJson(JsonWriter& Writer) const override final; - {{#isString}} {{#isEnum}} {{#allowableValues}} @@ -70,11 +69,13 @@ public: {{/isString}} {{#vars}} {{#isEnum}} + {{#description}}/* {{{.}}} */ {{/description}}{{^required}}TOptional<{{/required}}E{{classname}}_{{name}}{{^required}}>{{/required}} {{name}}{{#required}}{{#defaultValue}} = {{{.}}}{{/defaultValue}}{{/required}}; {{/isEnum}} {{^isEnum}} {{^oneOf}} + {{#description}}/* {{{.}}} */ {{/description}}{{^required}}TOptional<{{/required}}{{#isPrimitiveType}}{{{datatype}}}{{/isPrimitiveType}}{{^isPrimitiveType}}{{#isContainer}}{{{baseType}}}{{/isContainer}}{{^isContainer}}F{{{datatype}}}{{/isContainer}}{{/isPrimitiveType}}{{^required}}>{{/required}} {{name}}{{#required}}{{#defaultValue}} = {{{.}}}{{/defaultValue}}{{/required}}; {{/oneOf}} From 95b030b39ad56e6333086ffd1bcd21b73883b66a Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Fri, 7 Feb 2025 12:37:40 +1000 Subject: [PATCH 22/35] fix: compile errors for 5.1 and greater (#3570) --- .../Private/OnRamp/ImmutableMarketplaceOnRampWidget.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/ImmutableMarketplace/Private/OnRamp/ImmutableMarketplaceOnRampWidget.cpp b/Source/ImmutableMarketplace/Private/OnRamp/ImmutableMarketplaceOnRampWidget.cpp index a2063ec..7428960 100644 --- a/Source/ImmutableMarketplace/Private/OnRamp/ImmutableMarketplaceOnRampWidget.cpp +++ b/Source/ImmutableMarketplace/Private/OnRamp/ImmutableMarketplaceOnRampWidget.cpp @@ -96,12 +96,12 @@ void UImmutableMarketplaceOnRampWidget::HandleOnUrlChanged(const FText& Text) } #if (ENGINE_MAJOR_VERSION >= 5 && ENGINE_MINOR_VERSION >= 1) -void UOnRampWidget::HandleOnConsoleMessage(const FString& Message, const FString& Source, int32 Line, EWebBrowserConsoleLogSeverity Severity) +void UImmutableMarketplaceOnRampWidget::HandleOnConsoleMessage(const FString& Message, const FString& Source, int32 Line, EWebBrowserConsoleLogSeverity Severity) { UE_LOG(LogImmutableOnRampWidget, Log, TEXT("Web Browser console message: %s, Source: %s, Line: %d"), *Message, *Source, Line); } -bool UOnRampWidget::HandleOnBeforePopup(FString URL, FString Frame) +bool UImmutableMarketplaceOnRampWidget::HandleOnBeforePopup(FString URL, FString Frame) { return false; } From 1d86218ed17eefe0809aa4b52726fa6dab2ec548 Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Fri, 7 Feb 2025 12:41:33 +1000 Subject: [PATCH 23/35] chore: apply formatting --- .../cpp-ue4/model-base-header.mustache | 3 ++ .../template/cpp-ue4/model-header.mustache | 30 ++++++++++++------- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache index c932211..582ae52 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache @@ -47,6 +47,7 @@ class {{dllapi}} F{{unrealModuleName}}Model { public: virtual ~F{{unrealModuleName}}Model() {} + virtual void WriteJson(JsonWriter& Writer) const = 0; virtual bool FromJson(const TSharedPtr& JsonValue) = 0; }; @@ -55,6 +56,7 @@ class {{dllapi}} F{{unrealModuleName}}Request { public: virtual ~F{{unrealModuleName}}Request() {} + virtual void SetupHttpRequest(const FHttpRequestRef& HttpRequest) const = 0; virtual FString ComputePath() const = 0; @@ -70,6 +72,7 @@ class {{dllapi}} F{{unrealModuleName}}Response { public: virtual ~F{{unrealModuleName}}Response() {} + virtual bool FromJson(const TSharedPtr& JsonValue) = 0; void SetSuccessful(bool InSuccessful) { Successful = InSuccessful; } diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache index 1bbeb04..1ed33d8 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache @@ -14,14 +14,15 @@ {{/models}} #include "{{modelNamePrefix}}BaseModel.h" -{{#imports}}{{{import}}} +{{#imports}} +{{{import}}} {{/imports}} - {{#models}} {{#model}} {{#isString}} {{#isEnum}} {{#allowableValues}} + UENUM(BlueprintType) enum class E{{classname}}_{{name}}_Values : uint8 { @@ -35,6 +36,7 @@ enum class E{{classname}}_{{name}}_Values : uint8 {{#vars}} {{#isEnum}} {{#allowableValues}} + UENUM(BlueprintType) enum class E{{classname}}_{{name}} : uint8 { @@ -42,7 +44,7 @@ enum class E{{classname}}_{{name}} : uint8 {{name}} UMETA(DisplayName = "{{value}}"){{^-last}},{{/-last}} {{/enumVars}} }; - {{/allowableValues}} +{{/allowableValues}} {{/isEnum}} {{/vars}} @@ -55,12 +57,16 @@ class {{dllapi}} F{{classname}} : public F{{unrealModuleName}}Model { public: virtual ~F{{classname}}() override {} + virtual bool FromJson(const TSharedPtr& JsonValue) override final; virtual void WriteJson(JsonWriter& Writer) const override final; + +public: {{#isString}} + {{#description}}/* {{{.}}} */ + {{/description}} {{#isEnum}} - {{#allowableValues}} - E{{classname}}_{{name}}_Values Value{{#defaultValue}} = {{{.}}}{{/defaultValue}}; + {{#allowableValues}}E{{classname}}_{{name}}_Values Value{{#defaultValue}} = {{{.}}}{{/defaultValue}}; {{/allowableValues}} {{/isEnum}} {{^isEnum}} @@ -69,24 +75,28 @@ public: {{/isString}} {{#vars}} {{#isEnum}} + {{^-first}} + {{/-first}} {{#description}}/* {{{.}}} */ {{/description}}{{^required}}TOptional<{{/required}}E{{classname}}_{{name}}{{^required}}>{{/required}} {{name}}{{#required}}{{#defaultValue}} = {{{.}}}{{/defaultValue}}{{/required}}; {{/isEnum}} {{^isEnum}} {{^oneOf}} + {{^-first}} + {{/-first}} {{#description}}/* {{{.}}} */ {{/description}}{{^required}}TOptional<{{/required}}{{#isPrimitiveType}}{{{datatype}}}{{/isPrimitiveType}}{{^isPrimitiveType}}{{#isContainer}}{{{baseType}}}{{/isContainer}}{{^isContainer}}F{{{datatype}}}{{/isContainer}}{{/isPrimitiveType}}{{^required}}>{{/required}} {{name}}{{#required}}{{#defaultValue}} = {{{.}}}{{/defaultValue}}{{/required}}; {{/oneOf}} {{/isEnum}} {{/vars}} {{#oneOf}} + {{/oneOf}} + {{#oneOf}} {{#-first}} - TVariant<{{#composedSchemas}}{{#oneOf}}{{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}}{{^-last}}, {{/-last}}{{/oneOf}}{{/composedSchemas}}> OneOf; + {{#description}}/* {{{.}}} */ + {{/description}}TVariant<{{#composedSchemas}}{{#oneOf}}{{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}}{{^-last}}, {{/-last}}{{/oneOf}}{{/composedSchemas}}> OneOf; {{/-first}} {{/oneOf}} -}; - -{{/model}} -{{/models}} \ No newline at end of file +};{{/model}}{{/models}} \ No newline at end of file From a68d0b2ebab5aefcac23b902976382c8411aa0bc Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Mon, 10 Feb 2025 13:37:30 +1000 Subject: [PATCH 24/35] feat: add config json --- .../openapi-generator/batch-files/generate.bat | 5 +++-- .../openapi-generator/batch-files/generate.sh | 5 +++-- .../ImmutablezkEVMAPI/openapi-generator/config/cpp-ue4.json | 5 +++++ 3 files changed, 11 insertions(+), 4 deletions(-) create mode 100644 Source/ImmutablezkEVMAPI/openapi-generator/config/cpp-ue4.json diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/batch-files/generate.bat b/Source/ImmutablezkEVMAPI/openapi-generator/batch-files/generate.bat index ae9e07b..0ce6905 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/batch-files/generate.bat +++ b/Source/ImmutablezkEVMAPI/openapi-generator/batch-files/generate.bat @@ -4,10 +4,11 @@ set OPENAPI_GENERATOR_CLI=openapi-generator-cli set GENERATOR=-g cpp-ue4 set TEMPLATE=-t ../template/cpp-ue4 +set CONFIG=-c ../config/cpp-ue4.json set INPUT=-i https://imx-openapiv3-mr-sandbox.s3.us-east-2.amazonaws.com/openapi.json set OUTPUT=-o ../.. -set ADDITIONAL_PROPERTIES=--additional-properties=modelNamePrefix="API",cppNamespace=ImmutablezkEVMAPI,unrealModuleName=ImmutablezkEVMAPI +set ADDITIONAL_PROPERTIES=--additional-properties= -%OPENAPI_GENERATOR_CLI% generate %GENERATOR% %TEMPLATE% %INPUT% %OUTPUT% %ADDITIONAL_PROPERTIES% +%OPENAPI_GENERATOR_CLI% generate %GENERATOR% %TEMPLATE% %CONFIG% %INPUT% %OUTPUT% %ADDITIONAL_PROPERTIES% pause \ No newline at end of file diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/batch-files/generate.sh b/Source/ImmutablezkEVMAPI/openapi-generator/batch-files/generate.sh index 2610544..e3c429d 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/batch-files/generate.sh +++ b/Source/ImmutablezkEVMAPI/openapi-generator/batch-files/generate.sh @@ -4,8 +4,9 @@ OPENAPI_GENERATOR_CLI=openapi-generator-cli GENERATOR="-g cpp-ue4" TEMPLATE="-t ../template/cpp-ue4" +CONFIG="-c ../config/cpp-ue4.json" INPUT="-i https://imx-openapiv3-mr-sandbox.s3.us-east-2.amazonaws.com/openapi.json" OUTPUT="-o ../.." -ADDITIONAL_PROPERTIES="--additional-properties=modelNamePrefix=API,cppNamespace=ImmutablezkEVMAPI,unrealModuleName=ImmutablezkEVMAPI" +ADDITIONAL_PROPERTIES="--additional-properties=" -$OPENAPI_GENERATOR_CLI generate "$GENERATOR" "$TEMPLATE" "$INPUT" "$OUTPUT" "$ADDITIONAL_PROPERTIES" \ No newline at end of file +$OPENAPI_GENERATOR_CLI generate "$GENERATOR" "$TEMPLATE" "$CONFIG" "$INPUT" "$OUTPUT" "$ADDITIONAL_PROPERTIES" \ No newline at end of file diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/config/cpp-ue4.json b/Source/ImmutablezkEVMAPI/openapi-generator/config/cpp-ue4.json new file mode 100644 index 0000000..be71b3d --- /dev/null +++ b/Source/ImmutablezkEVMAPI/openapi-generator/config/cpp-ue4.json @@ -0,0 +1,5 @@ +{ + "modelNamePrefix" : "API", + "cppNamespace" : "ImmutablezkEVMAPI", + "unrealModuleName" : "ImmutablezkEVMAPI" +} \ No newline at end of file From c53ae21d4211bf43fcd81ed3a1015e242868a02e Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Mon, 10 Feb 2025 14:04:12 +1000 Subject: [PATCH 25/35] chore: apply formatting --- .../template/cpp-ue4/api-header.mustache | 51 +++++--- .../template/cpp-ue4/api-source.mustache | 114 +++++++++--------- 2 files changed, 96 insertions(+), 69 deletions(-) diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache index 7e3146d..50bb212 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache @@ -3,40 +3,61 @@ #pragma once #include "CoreMinimal.h" + #include "{{modelNamePrefix}}BaseModel.h" class {{dllapi}} F{{classname}} { +public: + {{#operations}} + {{#operation}} + class {{operationIdCamelCase}}Request; + class {{operationIdCamelCase}}Response; + + {{/operation}} + {{/operations}} + {{#operations}} + {{#operation}} + DECLARE_DELEGATE_OneParam(F{{operationIdCamelCase}}Delegate, const {{operationIdCamelCase}}Response&); + {{/operation}} + {{/operations}} + public: F{{classname}}(); ~F{{classname}}(); + FHttpRetrySystem::FManager& GetHttpRetryManager(); + + /* Sets the retry manager to the user-defined retry manager. User must manage the lifetime of the retry manager. + * If no retry manager is specified and a request needs retries, a default retry manager will be used. + * See also: F{{unrealModuleName}}Request::SetShouldRetry */ + void SetHttpRetryManager(FHttpRetrySystem::FManager& RetryManager); + /* Sets the URL Endpoint. * Note: several fallback endpoints can be configured in request retry policies, see F{{unrealModuleName}}Request::SetShouldRetry */ void SetURL(const FString& Url); /* Adds global header params to all requests */ void AddHeaderParam(const FString& Key, const FString& Value); - void ClearHeaderParams(); - /* Sets the retry manager to the user-defined retry manager. User must manage the lifetime of the retry manager. - * If no retry manager is specified and a request needs retries, a default retry manager will be used. - * See also: F{{unrealModuleName}}Request::SetShouldRetry */ - void SetHttpRetryManager(FHttpRetrySystem::FManager& RetryManager); - FHttpRetrySystem::FManager& GetHttpRetryManager(); + void ClearHeaderParams(); - {{#operations}}{{#operation}}class {{operationIdCamelCase}}Request; - class {{operationIdCamelCase}}Response; - {{/operation}}{{/operations}} - {{#operations}}{{#operation}}DECLARE_DELEGATE_OneParam(F{{operationIdCamelCase}}Delegate, const {{operationIdCamelCase}}Response&); - {{/operation}}{{/operations}} - {{#operations}}{{#operation}}{{#description}}/* {{{.}}} */ + {{#operations}} + {{#operation}} + {{#description}}/* {{{.}}} */ {{/description}}FHttpRequestPtr {{operationIdCamelCase}}(const {{operationIdCamelCase}}Request& Request, const F{{operationIdCamelCase}}Delegate& Delegate = F{{operationIdCamelCase}}Delegate()) const; - {{/operation}}{{/operations}} + {{/operation}} + {{/operations}} + private: - {{#operations}}{{#operation}}void On{{operationIdCamelCase}}Response(FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSucceeded, F{{operationIdCamelCase}}Delegate Delegate) const; - {{/operation}}{{/operations}} + {{#operations}} + {{#operation}} + void On{{operationIdCamelCase}}Response(FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSucceeded, F{{operationIdCamelCase}}Delegate Delegate) const; + {{/operation}} + {{/operations}} + FHttpRequestRef CreateHttpRequest(const F{{unrealModuleName}}Request& Request) const; + bool IsValid() const; void HandleResponse(FHttpResponsePtr HttpResponse, bool bSucceeded, F{{unrealModuleName}}Response& InOutResponse) const; diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache index c4c54d7..a9a4747 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache @@ -2,18 +2,35 @@ #include "{{classname}}.h" -#include "{{classname}}Operations.h" -#include "{{unrealModuleName}}Module.h" - #include "HttpModule.h" #include "Serialization/JsonSerializer.h" +#include "{{classname}}Operations.h" +#include "{{unrealModuleName}}Module.h" + F{{classname}}::F{{classname}}() -: Url(TEXT("{{basePath}}")) + : Url(TEXT("{{basePath}}")) +{ +} + +F{{classname}}::~F{{classname}}() +{ +} + +FHttpRetrySystem::FManager& F{{classname}}::GetHttpRetryManager() { + checkf(RetryManager, TEXT("F{{classname}}: RetryManager is null. You may have meant to set it with SetHttpRetryManager first, or you may not be using a custom RetryManager at all.")) + return *RetryManager; } -F{{classname}}::~F{{classname}}() {} +void F{{classname}}::SetHttpRetryManager(FHttpRetrySystem::FManager& InRetryManager) +{ + if (RetryManager != &InRetryManager) + { + DefaultRetryManager.Reset(); + RetryManager = &InRetryManager; + } +} void F{{classname}}::SetURL(const FString& InUrl) { @@ -30,32 +47,42 @@ void F{{classname}}::ClearHeaderParams() AdditionalHeaderParams.Reset(); } -bool F{{classname}}::IsValid() const +{{#operations}} +{{#operation}} +FHttpRequestPtr F{{classname}}::{{operationIdCamelCase}}(const {{operationIdCamelCase}}Request& Request, const F{{operationIdCamelCase}}Delegate& Delegate /*= F{{operationIdCamelCase}}Delegate()*/) const { - if (Url.IsEmpty()) - { - UE_LOG(Log{{unrealModuleName}}, Error, TEXT("F{{classname}}: Endpoint Url is not set, request cannot be performed")); - return false; - } + if (!IsValid()) + return nullptr; - return true; -} + FHttpRequestRef HttpRequest = CreateHttpRequest(Request); + HttpRequest->SetURL(*(Url + Request.ComputePath())); -void F{{classname}}::SetHttpRetryManager(FHttpRetrySystem::FManager& InRetryManager) -{ - if (RetryManager != &InRetryManager) + for(const auto& It : AdditionalHeaderParams) { - DefaultRetryManager.Reset(); - RetryManager = &InRetryManager; + HttpRequest->SetHeader(It.Key, It.Value); } + + Request.SetupHttpRequest(HttpRequest); + + HttpRequest->OnProcessRequestComplete().BindRaw(this, &F{{classname}}::On{{operationIdCamelCase}}Response, Delegate); + HttpRequest->ProcessRequest(); + return HttpRequest; } +{{^-last}} -FHttpRetrySystem::FManager& F{{classname}}::GetHttpRetryManager() +{{/-last}} +{{/operation}}{{/operations}} +{{#operations}} +{{#operation}} +void F{{classname}}::On{{operationIdCamelCase}}Response(FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSucceeded, F{{operationIdCamelCase}}Delegate Delegate) const { - checkf(RetryManager, TEXT("F{{classname}}: RetryManager is null. You may have meant to set it with SetHttpRetryManager first, or you may not be using a custom RetryManager at all.")) - return *RetryManager; + {{operationIdCamelCase}}Response Response; + HandleResponse(HttpResponse, bSucceeded, Response); + Delegate.ExecuteIfBound(Response); } +{{^-last}} +{{/-last}}{{/operation}}{{/operations}} FHttpRequestRef F{{classname}}::CreateHttpRequest(const F{{unrealModuleName}}Request& Request) const { if (!Request.GetRetryParams().IsSet()) @@ -76,6 +103,17 @@ FHttpRequestRef F{{classname}}::CreateHttpRequest(const F{{unrealModuleName}}Req } } +bool F{{classname}}::IsValid() const +{ + if (Url.IsEmpty()) + { + UE_LOG(Log{{unrealModuleName}}, Error, TEXT("F{{classname}}: Endpoint Url is not set, request cannot be performed")); + return false; + } + + return true; +} + void F{{classname}}::HandleResponse(FHttpResponsePtr HttpResponse, bool bSucceeded, F{{unrealModuleName}}Response& InOutResponse) const { InOutResponse.SetHttpResponse(HttpResponse); @@ -118,36 +156,4 @@ void F{{classname}}::HandleResponse(FHttpResponsePtr HttpResponse, bool bSucceed // By default, assume we failed to establish connection InOutResponse.SetHttpResponseCode(EHttpResponseCodes::RequestTimeout); -} - -{{#operations}} -{{#operation}} -FHttpRequestPtr F{{classname}}::{{operationIdCamelCase}}(const {{operationIdCamelCase}}Request& Request, const F{{operationIdCamelCase}}Delegate& Delegate /*= F{{operationIdCamelCase}}Delegate()*/) const -{ - if (!IsValid()) - return nullptr; - - FHttpRequestRef HttpRequest = CreateHttpRequest(Request); - HttpRequest->SetURL(*(Url + Request.ComputePath())); - - for(const auto& It : AdditionalHeaderParams) - { - HttpRequest->SetHeader(It.Key, It.Value); - } - - Request.SetupHttpRequest(HttpRequest); - - HttpRequest->OnProcessRequestComplete().BindRaw(this, &F{{classname}}::On{{operationIdCamelCase}}Response, Delegate); - HttpRequest->ProcessRequest(); - return HttpRequest; -} - -void F{{classname}}::On{{operationIdCamelCase}}Response(FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSucceeded, F{{operationIdCamelCase}}Delegate Delegate) const -{ - {{operationIdCamelCase}}Response Response; - HandleResponse(HttpResponse, bSucceeded, Response); - Delegate.ExecuteIfBound(Response); -} - -{{/operation}} -{{/operations}} \ No newline at end of file +} \ No newline at end of file From a5ad11dce77aa3a63ae8f1c9a537f2b412f831d8 Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Mon, 10 Feb 2025 14:12:25 +1000 Subject: [PATCH 26/35] chore: add f prefix to class --- .../template/cpp-ue4/api-header.mustache | 8 ++++---- .../template/cpp-ue4/api-operations-header.mustache | 8 ++++---- .../template/cpp-ue4/api-operations-source.mustache | 12 ++++++------ .../template/cpp-ue4/api-source.mustache | 4 ++-- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache index 50bb212..b33a584 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache @@ -11,14 +11,14 @@ class {{dllapi}} F{{classname}} public: {{#operations}} {{#operation}} - class {{operationIdCamelCase}}Request; - class {{operationIdCamelCase}}Response; + class F{{operationIdCamelCase}}Request; + class F{{operationIdCamelCase}}Response; {{/operation}} {{/operations}} {{#operations}} {{#operation}} - DECLARE_DELEGATE_OneParam(F{{operationIdCamelCase}}Delegate, const {{operationIdCamelCase}}Response&); + DECLARE_DELEGATE_OneParam(F{{operationIdCamelCase}}Delegate, const F{{operationIdCamelCase}}Response&); {{/operation}} {{/operations}} @@ -45,7 +45,7 @@ public: {{#operations}} {{#operation}} {{#description}}/* {{{.}}} */ - {{/description}}FHttpRequestPtr {{operationIdCamelCase}}(const {{operationIdCamelCase}}Request& Request, const F{{operationIdCamelCase}}Delegate& Delegate = F{{operationIdCamelCase}}Delegate()) const; + {{/description}}FHttpRequestPtr {{operationIdCamelCase}}(const F{{operationIdCamelCase}}Request& Request, const F{{operationIdCamelCase}}Delegate& Delegate = F{{operationIdCamelCase}}Delegate()) const; {{/operation}} {{/operations}} diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache index d9e4bdc..f9c88a3 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache @@ -30,10 +30,10 @@ enum class E{{classname}}_{{operationIdCamelCase}}Request_{{paramName}} : uint8 {{#notes}} * * {{.}}{{/notes}} */ -class {{dllapi}} F{{classname}}::{{operationIdCamelCase}}Request : public F{{unrealModuleName}}Request +class {{dllapi}} F{{classname}}::F{{operationIdCamelCase}}Request : public F{{unrealModuleName}}Request { public: - virtual ~{{operationIdCamelCase}}Request() override; + virtual ~F{{operationIdCamelCase}}Request() override; virtual void SetupHttpRequest(const FHttpRequestRef& HttpRequest) const override final; virtual FString ComputePath() const override final; {{#allParams}} @@ -50,10 +50,10 @@ public: {{/allParams}} }; -class {{dllapi}} F{{classname}}::{{operationIdCamelCase}}Response : public F{{unrealModuleName}}Response +class {{dllapi}} F{{classname}}::F{{operationIdCamelCase}}Response : public F{{unrealModuleName}}Response { public: - virtual ~{{operationIdCamelCase}}Response() override; + virtual ~F{{operationIdCamelCase}}Response() override; {{#responses.0}} virtual void SetHttpResponseCode(EHttpResponseCodes::Type InHttpResponseCode) override final; {{/responses.0}} diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache index 5f2722c..c3bebd8 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache @@ -35,7 +35,7 @@ inline bool TryGetJsonValue(const TSharedPtr& JsonValue, E{{classnam {{/isEnum}} {{/allParams}} -FString F{{classname}}::{{operationIdCamelCase}}Request::ComputePath() const +FString F{{classname}}::F{{operationIdCamelCase}}Request::ComputePath() const { {{^pathParams.0}} FString Path(TEXT("{{{path}}}")); @@ -98,11 +98,11 @@ FString F{{classname}}::{{operationIdCamelCase}}Request::ComputePath() const return Path; } -F{{classname}}::{{operationIdCamelCase}}Request::~{{operationIdCamelCase}}Request() +F{{classname}}::F{{operationIdCamelCase}}Request::~F{{operationIdCamelCase}}Request() { } -void F{{classname}}::{{operationIdCamelCase}}Request::SetupHttpRequest(const FHttpRequestRef& HttpRequest) const +void F{{classname}}::F{{operationIdCamelCase}}Request::SetupHttpRequest(const FHttpRequestRef& HttpRequest) const { static const TArray Consumes = { {{#consumes}}TEXT("{{{mediaType}}}"){{^-last}}, {{/-last}}{{/consumes}} }; //static const TArray Produces = { {{#produces}}TEXT("{{{mediaType}}}"){{^-last}}, {{/-last}}{{/produces}} }; @@ -270,12 +270,12 @@ void F{{classname}}::{{operationIdCamelCase}}Request::SetupHttpRequest(const FHt {{/isBodyAllowed}} } -F{{classname}}::{{operationIdCamelCase}}Response::~{{operationIdCamelCase}}Response() +F{{classname}}::F{{operationIdCamelCase}}Response::~F{{operationIdCamelCase}}Response() { } {{#responses.0}} -void F{{classname}}::{{operationIdCamelCase}}Response::SetHttpResponseCode(EHttpResponseCodes::Type InHttpResponseCode) +void F{{classname}}::F{{operationIdCamelCase}}Response::SetHttpResponseCode(EHttpResponseCodes::Type InHttpResponseCode) { F{{unrealModuleName}}Response::SetHttpResponseCode(InHttpResponseCode); switch ((int)InHttpResponseCode) @@ -292,7 +292,7 @@ void F{{classname}}::{{operationIdCamelCase}}Response::SetHttpResponseCode(EHttp } {{/responses.0}} -bool F{{classname}}::{{operationIdCamelCase}}Response::FromJson(const TSharedPtr& JsonValue) +bool F{{classname}}::F{{operationIdCamelCase}}Response::FromJson(const TSharedPtr& JsonValue) { {{#returnType}} return TryGetJsonValue(JsonValue, Content); diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache index a9a4747..44acae6 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-source.mustache @@ -49,7 +49,7 @@ void F{{classname}}::ClearHeaderParams() {{#operations}} {{#operation}} -FHttpRequestPtr F{{classname}}::{{operationIdCamelCase}}(const {{operationIdCamelCase}}Request& Request, const F{{operationIdCamelCase}}Delegate& Delegate /*= F{{operationIdCamelCase}}Delegate()*/) const +FHttpRequestPtr F{{classname}}::{{operationIdCamelCase}}(const F{{operationIdCamelCase}}Request& Request, const F{{operationIdCamelCase}}Delegate& Delegate /*= F{{operationIdCamelCase}}Delegate()*/) const { if (!IsValid()) return nullptr; @@ -76,7 +76,7 @@ FHttpRequestPtr F{{classname}}::{{operationIdCamelCase}}(const {{operationIdCame {{#operation}} void F{{classname}}::On{{operationIdCamelCase}}Response(FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSucceeded, F{{operationIdCamelCase}}Delegate Delegate) const { - {{operationIdCamelCase}}Response Response; + F{{operationIdCamelCase}}Response Response; HandleResponse(HttpResponse, bSucceeded, Response); Delegate.ExecuteIfBound(Response); } From 41c978bced6bc7ff2b18aa3a5fccb38f5f225d11 Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Mon, 10 Feb 2025 14:23:56 +1000 Subject: [PATCH 27/35] chore: apply formatting --- .../template/cpp-ue4/api-operations-source.mustache | 8 +++----- .../template/cpp-ue4/model-source.mustache | 10 +++++++--- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache index c3bebd8..c4d1a35 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache @@ -8,14 +8,12 @@ #include "{{modelNamePrefix}}Helpers.h" #include "Dom/JsonObject.h" -#include "Templates/SharedPointer.h" #include "HttpModule.h" #include "PlatformHttp.h" +#include "Templates/SharedPointer.h" -{{#operations}}{{#operation}} -{{#allParams}} -{{#isEnum}} -inline void WriteJsonValue(JsonWriter& Writer, E{{classname}}_{{operationIdCamelCase}}Request_{{paramName}} Value) +{{#operations}} +{{#operation}}{{#allParams}}{{#isEnum}}inline void WriteJsonValue(JsonWriter& Writer, E{{classname}}_{{operationIdCamelCase}}Request_{{paramName}} Value) { WriteJsonValue(Writer, StaticEnum()->GetNameStringByValue(static_cast(Value))); } diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache index c944d82..278344d 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache @@ -1,10 +1,14 @@ {{>licenseInfo}} #include "{{classname}}.h" -{{#models}}{{#model}}{{#isEnum}} -#include "UObject/Class.h"{{/isEnum}}{{#hasEnums}}#include "UObject/Class.h"{{/hasEnums}}{{/model}}{{/models}} -#include "Templates/SharedPointer.h" +#include "Templates/SharedPointer.h" +{{#models}} +{{#model}} +{{#hasEnums}} +#include "UObject/Class.h" +{{/hasEnums}}{{/model}} +{{/models}} #include "{{modelNamePrefix}}Helpers.h" {{#models}} From 1ebea03a2086e91b3d2e96badeb5f877b8f82f71 Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Mon, 10 Feb 2025 14:24:29 +1000 Subject: [PATCH 28/35] chore: remove unused includes --- .../template/cpp-ue4/api-operations-source.mustache | 2 -- 1 file changed, 2 deletions(-) diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache index c4d1a35..9b24bde 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache @@ -7,9 +7,7 @@ #include "{{unrealModuleName}}Module.h" #include "{{modelNamePrefix}}Helpers.h" -#include "Dom/JsonObject.h" #include "HttpModule.h" -#include "PlatformHttp.h" #include "Templates/SharedPointer.h" {{#operations}} From e2d5c38b335a4aefbbc3b0e78c1ca5e112bcf497 Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Mon, 10 Feb 2025 14:25:53 +1000 Subject: [PATCH 29/35] chore: replace private with protected --- .../openapi-generator/template/cpp-ue4/api-header.mustache | 3 ++- .../template/cpp-ue4/helpers-header.mustache | 5 +++-- .../template/cpp-ue4/model-base-header.mustache | 4 ++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache index b33a584..89ece03 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-header.mustache @@ -49,7 +49,7 @@ public: {{/operation}} {{/operations}} -private: +protected: {{#operations}} {{#operation}} void On{{operationIdCamelCase}}Response(FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSucceeded, F{{operationIdCamelCase}}Delegate Delegate) const; @@ -61,6 +61,7 @@ private: bool IsValid() const; void HandleResponse(FHttpResponsePtr HttpResponse, bool bSucceeded, F{{unrealModuleName}}Response& InOutResponse) const; +protected: FString Url; TMap AdditionalHeaderParams; mutable FHttpRetrySystem::FManager* RetryManager = nullptr; diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache index ad60326..ea8691f 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache @@ -38,7 +38,7 @@ public: // Returns the filename with extension FString GetFilename() const; -private: +protected: FString FilePath; FString ContentType; }; @@ -56,10 +56,11 @@ public: void AddBinaryPart(const TCHAR* Name, const TArray& ByteArray); void AddFilePart(const TCHAR* Name, const F{{unrealModuleName}}HttpFileInput& File); -private: +protected: void AppendString(const TCHAR* Str); const FString& GetBoundary() const; +protected: mutable FString Boundary; TArray FormData; diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache index 582ae52..c19980f 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-base-header.mustache @@ -64,7 +64,7 @@ public: void SetShouldRetry(const F{{unrealModuleName}}HttpRetryParams& Params = F{{unrealModuleName}}HttpRetryParams()) { RetryParams = Params; } const TOptional& GetRetryParams() const { return RetryParams; } -private: +protected: TOptional RetryParams; }; @@ -87,7 +87,7 @@ public: void SetHttpResponse(const FHttpResponsePtr& InHttpResponse) { HttpResponse = InHttpResponse; } const FHttpResponsePtr& GetHttpResponse() const { return HttpResponse; } -private: +protected: bool Successful; EHttpResponseCodes::Type ResponseCode; FString ResponseString; From 7ab78669afa4196d2e8f6a75ace1f34f28975d96 Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Mon, 10 Feb 2025 14:26:23 +1000 Subject: [PATCH 30/35] chore: apply formatting --- .../cpp-ue4/api-operations-header.mustache | 19 ++++++++++--------- .../template/cpp-ue4/helpers-header.mustache | 7 ++++--- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache index f9c88a3..4f39748 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache @@ -5,16 +5,16 @@ #include "UObject/ObjectMacros.h" #include "{{modelNamePrefix}}BaseModel.h" -#include "{{classname}}.h" +#include "{{classname}}.h" {{#imports}}{{{import}}} {{/imports}} - {{#operations}} {{#operation}} {{#allParams}} {{#isEnum}} {{#allowableValues}} + UENUM(BlueprintType) enum class E{{classname}}_{{operationIdCamelCase}}Request_{{paramName}} : uint8 { @@ -22,10 +22,10 @@ enum class E{{classname}}_{{operationIdCamelCase}}Request_{{paramName}} : uint8 {{name}} UMETA(DisplayName = "{{value}}"){{^-last}},{{/-last}} {{/enumVars}} }; - {{/allowableValues}} {{/isEnum}} {{/allParams}} + /* {{summary}} {{#notes}} * * {{.}}{{/notes}} @@ -34,11 +34,11 @@ class {{dllapi}} F{{classname}}::F{{operationIdCamelCase}}Request : public F{{un { public: virtual ~F{{operationIdCamelCase}}Request() override; + virtual void SetupHttpRequest(const FHttpRequestRef& HttpRequest) const override final; virtual FString ComputePath() const override final; - {{#allParams}} - {{#isEnum}} +public:{{#allParams}}{{#isEnum}} {{#description}}/* {{{.}}} */ {{/description}}{{^required}}TOptional<{{/required}}E{{classname}}_{{operationIdCamelCase}}Request_{{paramName}}{{^required}}>{{/required}} {{paramName}}{{#required}}{{#defaultValue}} = {{{.}}}{{/defaultValue}}{{/required}}; {{/isEnum}} @@ -55,12 +55,13 @@ class {{dllapi}} F{{classname}}::F{{operationIdCamelCase}}Response : public F{{u public: virtual ~F{{operationIdCamelCase}}Response() override; {{#responses.0}} + +public: virtual void SetHttpResponseCode(EHttpResponseCodes::Type InHttpResponseCode) override final; {{/responses.0}} virtual bool FromJson(const TSharedPtr& JsonValue) override final; +public: {{#returnProperty}}{{#isContainer}}{{baseType}}<{{^isPrimitiveType}}F{{/isPrimitiveType}}{{complexType}}>{{/isContainer}}{{^isContainer}}{{^isPrimitiveType}}F{{/isPrimitiveType}}{{baseType}}{{/isContainer}} Content;{{/returnProperty}} -}; - -{{/operation}} -{{/operations}} \ No newline at end of file +};{{^-last}} +{{/-last}}{{/operation}}{{/operations}} \ No newline at end of file diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache index ea8691f..cde759f 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache @@ -47,6 +47,10 @@ protected: class F{{unrealModuleName}}HttpMultipartFormData { +protected: + static const TCHAR* Delimiter; + static const TCHAR* Newline; + public: void SetBoundary(const TCHAR* InBoundary); void SetupHttpRequest(const FHttpRequestRef& HttpRequest); @@ -63,9 +67,6 @@ protected: protected: mutable FString Boundary; TArray FormData; - - static const TCHAR* Delimiter; - static const TCHAR* Newline; }; ////////////////////////////////////////////////////////////////////////// From 5074916f9d8f9b08802134c74a0ce3bb1ce358ec Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Mon, 10 Feb 2025 15:23:06 +1000 Subject: [PATCH 31/35] chore: fix comments for class --- .../template/cpp-ue4/api-operations-header.mustache | 6 +++--- .../template/cpp-ue4/model-header.mustache | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache index 4f39748..c3c07cf 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache @@ -26,10 +26,10 @@ enum class E{{classname}}_{{operationIdCamelCase}}Request_{{paramName}} : uint8 {{/isEnum}} {{/allParams}} -/* {{summary}} +/* F{{classname}}::F{{operationIdCamelCase}}Request {{#notes}} * - * {{.}}{{/notes}} -*/ + * {{.}} +{{/notes}} */ class {{dllapi}} F{{classname}}::F{{operationIdCamelCase}}Request : public F{{unrealModuleName}}Request { public: diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache index 1ed33d8..8a4bc46 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache @@ -50,9 +50,9 @@ enum class E{{classname}}_{{name}} : uint8 /* * F{{classname}} - * - * {{description}} - */ +{{#description}} * + * {{.}} +{{/description}} */ class {{dllapi}} F{{classname}} : public F{{unrealModuleName}}Model { public: From 0c6462f860733aae80d4fcd876d3f1f83abec410 Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Mon, 10 Feb 2025 15:25:31 +1000 Subject: [PATCH 32/35] chore: move destructor to source file --- .../openapi-generator/template/cpp-ue4/model-header.mustache | 2 +- .../openapi-generator/template/cpp-ue4/model-source.mustache | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache index 8a4bc46..eb71d89 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache @@ -56,7 +56,7 @@ enum class E{{classname}}_{{name}} : uint8 class {{dllapi}} F{{classname}} : public F{{unrealModuleName}}Model { public: - virtual ~F{{classname}}() override {} + virtual ~F{{classname}}() override; virtual bool FromJson(const TSharedPtr& JsonValue) override final; virtual void WriteJson(JsonWriter& Writer) const override final; diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache index 278344d..b5bfb00 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache @@ -81,6 +81,10 @@ void F{{classname}}::WriteJson(JsonWriter& Writer) const Writer->WriteObjectEnd();{{/isString}}{{/oneOf}} } +F{{classname}}::~F{{classname}}() +{ +} + bool F{{classname}}::FromJson(const TSharedPtr& JsonValue) { {{#isString}}return TryGetJsonValue(JsonValue, Value);{{/isString}}{{#composedSchemas}}{{#oneOf}}{{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}} {{#lambda.pascalcase}}{{dataType}}{{/lambda.pascalcase}}Value; From 4f969729ff108be9bc5267b4e7fad1d27d0c5728 Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Mon, 10 Feb 2025 15:29:53 +1000 Subject: [PATCH 33/35] chore: apply formatting --- .../cpp-ue4/api-operations-header.mustache | 1 - .../cpp-ue4/api-operations-source.mustache | 150 +++++++-------- .../template/cpp-ue4/helpers-header.mustache | 177 +++++++++--------- .../template/cpp-ue4/model-source.mustache | 68 +++---- 4 files changed, 199 insertions(+), 197 deletions(-) diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache index c3c07cf..5114f70 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache @@ -56,7 +56,6 @@ public: virtual ~F{{operationIdCamelCase}}Response() override; {{#responses.0}} -public: virtual void SetHttpResponseCode(EHttpResponseCodes::Type InHttpResponseCode) override final; {{/responses.0}} virtual bool FromJson(const TSharedPtr& JsonValue) override final; diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache index 9b24bde..2a89a3c 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache @@ -2,19 +2,17 @@ #include "{{classname}}Operations.h" +#include "HttpModule.h" +#include "Templates/SharedPointer.h" #include "UObject/Class.h" #include "{{unrealModuleName}}Module.h" #include "{{modelNamePrefix}}Helpers.h" -#include "HttpModule.h" -#include "Templates/SharedPointer.h" - {{#operations}} -{{#operation}}{{#allParams}}{{#isEnum}}inline void WriteJsonValue(JsonWriter& Writer, E{{classname}}_{{operationIdCamelCase}}Request_{{paramName}} Value) -{ - WriteJsonValue(Writer, StaticEnum()->GetNameStringByValue(static_cast(Value))); -} +{{#operation}} +{{#allParams}} +{{#isEnum}} inline bool TryGetJsonValue(const TSharedPtr& JsonValue, E{{classname}}_{{operationIdCamelCase}}Request_{{paramName}} Value) { @@ -29,71 +27,13 @@ inline bool TryGetJsonValue(const TSharedPtr& JsonValue, E{{classnam return false; } -{{/isEnum}} -{{/allParams}} -FString F{{classname}}::F{{operationIdCamelCase}}Request::ComputePath() const +inline void WriteJsonValue(JsonWriter& Writer, E{{classname}}_{{operationIdCamelCase}}Request_{{paramName}} Value) { - {{^pathParams.0}} - FString Path(TEXT("{{{path}}}")); - {{/pathParams.0}} - {{#pathParams.0}} - TMap PathParams = { {{#pathParams}} - { TEXT("{{baseName}}"), FStringFormatArg(ToUrlString({{paramName}})) }{{^-last}},{{/-last}}{{/pathParams}} }; - - FString Path = FString::Format(TEXT("{{{path}}}"), PathParams); - - {{/pathParams.0}} - {{#queryParams.0}} - TArray QueryParams; - {{#queryParams}} - {{#required}} - {{^collectionFormat}} - QueryParams.Add(FString(TEXT("{{baseName}}=")) + ToUrlString({{paramName}})); - {{/collectionFormat}} - {{#collectionFormat}} - {{#isCollectionFormatMulti}} - QueryParams.Add(CollectionToUrlString_{{collectionFormat}}({{paramName}}, TEXT("{{baseName}}"))); - {{/isCollectionFormatMulti}} - {{^isCollectionFormatMulti}} - QueryParams.Add(FString(TEXT("{{baseName}}=")) + CollectionToUrlString_{{collectionFormat}}({{paramName}}, TEXT("{{baseName}}"))); - {{/isCollectionFormatMulti}} - {{/collectionFormat}} - {{/required}} - {{^required}} - {{^collectionFormat}} - {{#isEnum}} - if({{paramName}}.IsSet()) - { - QueryParams.Add(FString(TEXT("{{baseName}}=")) + StaticEnum()->GetNameStringByValue(static_cast({{paramName}}.GetValue()))); - } - {{/isEnum}} - {{^isEnum}} - if({{paramName}}.IsSet()) - { - QueryParams.Add(FString(TEXT("{{baseName}}=")) + ToUrlString({{paramName}}.GetValue())); - } - {{/isEnum}} - {{/collectionFormat}} - {{#collectionFormat}} - if({{paramName}}.IsSet()) - { - {{#isCollectionFormatMulti}} - QueryParams.Add(CollectionToUrlString_{{collectionFormat}}({{paramName}}.GetValue(), TEXT("{{baseName}}"))); - {{/isCollectionFormatMulti}} - {{^isCollectionFormatMulti}} - QueryParams.Add(FString(TEXT("{{baseName}}=")) + CollectionToUrlString_{{collectionFormat}}({{paramName}}.GetValue(), TEXT("{{baseName}}"))); - {{/isCollectionFormatMulti}} - } - {{/collectionFormat}} - {{/required}} - {{/queryParams}} - Path += TCHAR('?'); - Path += FString::Join(QueryParams, TEXT("&")); - - {{/queryParams.0}} - return Path; + WriteJsonValue(Writer, StaticEnum()->GetNameStringByValue(static_cast(Value))); } - +{{/isEnum}} +{{/allParams}}{{^-first}} +{{/-first}} F{{classname}}::F{{operationIdCamelCase}}Request::~F{{operationIdCamelCase}}Request() { } @@ -105,9 +45,9 @@ void F{{classname}}::F{{operationIdCamelCase}}Request::SetupHttpRequest(const FH HttpRequest->SetVerb(TEXT("{{httpMethod}}")); {{#headerParams.0}} - // Header parameters {{#headerParams}} + {{#required}} HttpRequest->SetHeader(TEXT("{{baseName}}"), {{paramName}}); {{/required}} @@ -119,8 +59,8 @@ void F{{classname}}::F{{operationIdCamelCase}}Request::SetupHttpRequest(const FH {{/required}} {{/headerParams}} {{/headerParams.0}} - {{#isBodyAllowed}} + // Default to Json Body request if (Consumes.Num() == 0 || Consumes.Contains(TEXT("application/json"))) { @@ -266,6 +206,69 @@ void F{{classname}}::F{{operationIdCamelCase}}Request::SetupHttpRequest(const FH {{/isBodyAllowed}} } +FString F{{classname}}::F{{operationIdCamelCase}}Request::ComputePath() const +{ + {{^pathParams.0}} + FString Path(TEXT("{{{path}}}")); + {{/pathParams.0}} + {{#pathParams.0}} + TMap PathParams = { {{#pathParams}} + { TEXT("{{baseName}}"), FStringFormatArg(ToUrlString({{paramName}})) }{{^-last}},{{/-last}}{{/pathParams}} }; + + FString Path = FString::Format(TEXT("{{{path}}}"), PathParams); + + {{/pathParams.0}} + {{#queryParams.0}} + TArray QueryParams; + {{#queryParams}} + {{#required}} + {{^collectionFormat}} + QueryParams.Add(FString(TEXT("{{baseName}}=")) + ToUrlString({{paramName}})); + {{/collectionFormat}} + {{#collectionFormat}} + {{#isCollectionFormatMulti}} + QueryParams.Add(CollectionToUrlString_{{collectionFormat}}({{paramName}}, TEXT("{{baseName}}"))); + {{/isCollectionFormatMulti}} + {{^isCollectionFormatMulti}} + QueryParams.Add(FString(TEXT("{{baseName}}=")) + CollectionToUrlString_{{collectionFormat}}({{paramName}}, TEXT("{{baseName}}"))); + {{/isCollectionFormatMulti}} + {{/collectionFormat}} + {{/required}} + {{^required}} + {{^collectionFormat}} + {{#isEnum}} + if({{paramName}}.IsSet()) + { + QueryParams.Add(FString(TEXT("{{baseName}}=")) + StaticEnum()->GetNameStringByValue(static_cast({{paramName}}.GetValue()))); + } + {{/isEnum}} + {{^isEnum}} + if({{paramName}}.IsSet()) + { + QueryParams.Add(FString(TEXT("{{baseName}}=")) + ToUrlString({{paramName}}.GetValue())); + } + {{/isEnum}} + {{/collectionFormat}} + {{#collectionFormat}} + if({{paramName}}.IsSet()) + { + {{#isCollectionFormatMulti}} + QueryParams.Add(CollectionToUrlString_{{collectionFormat}}({{paramName}}.GetValue(), TEXT("{{baseName}}"))); + {{/isCollectionFormatMulti}} + {{^isCollectionFormatMulti}} + QueryParams.Add(FString(TEXT("{{baseName}}=")) + CollectionToUrlString_{{collectionFormat}}({{paramName}}.GetValue(), TEXT("{{baseName}}"))); + {{/isCollectionFormatMulti}} + } + {{/collectionFormat}} + {{/required}} + {{/queryParams}} + Path += TCHAR('?'); + Path += FString::Join(QueryParams, TEXT("&")); + + {{/queryParams.0}} + return Path; +} + F{{classname}}::F{{operationIdCamelCase}}Response::~F{{operationIdCamelCase}}Response() { } @@ -297,4 +300,5 @@ bool F{{classname}}::F{{operationIdCamelCase}}Response::FromJson(const TSharedPt return true; {{/returnType}} } -{{/operation}}{{/operations}} \ No newline at end of file +{{/operation}} +{{/operations}} \ No newline at end of file diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache index cde759f..1154f83 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache @@ -195,7 +195,6 @@ inline FString CollectionToUrlString_multi(const TArray& Collection, const TC return Output; } - template inline FString CollectionToUrlString_multi(const TSet& Collection, const TCHAR* BaseName) { @@ -218,94 +217,6 @@ inline FString CollectionToUrlString_multi(const TSet& Collection, const TCHA } return Output; } - -////////////////////////////////////////////////////////////////////////// - -inline void WriteJsonValue(JsonWriter& Writer, const TSharedPtr& Value) -{ - if (Value.IsValid()) - { - FJsonSerializer::Serialize(Value.ToSharedRef(), "", Writer, false); - } - else - { - Writer->WriteObjectStart(); - Writer->WriteObjectEnd(); - } -} - -inline void WriteJsonValue(JsonWriter& Writer, const TSharedPtr& Value) -{ - if (Value.IsValid()) - { - FJsonSerializer::Serialize(Value.ToSharedRef(), Writer, false); - } - else - { - Writer->WriteObjectStart(); - Writer->WriteObjectEnd(); - } -} - -inline void WriteJsonValue(JsonWriter& Writer, const TArray& Value) -{ - Writer->WriteValue(FBase64::Encode(Value)); -} - -inline void WriteJsonValue(JsonWriter& Writer, const FDateTime& Value) -{ - Writer->WriteValue(Value.ToIso8601()); -} - -inline void WriteJsonValue(JsonWriter& Writer, const FGuid& Value) -{ - Writer->WriteValue(Value.ToString(EGuidFormats::DigitsWithHyphens)); -} - -inline void WriteJsonValue(JsonWriter& Writer, const F{{unrealModuleName}}Model& Value) -{ - Value.WriteJson(Writer); -} - -template::value, int>::type = 0> -inline void WriteJsonValue(JsonWriter& Writer, const T& Value) -{ - Writer->WriteValue(Value); -} - -template -inline void WriteJsonValue(JsonWriter& Writer, const TArray& Value) -{ - Writer->WriteArrayStart(); - for (const auto& Element : Value) - { - WriteJsonValue(Writer, Element); - } - Writer->WriteArrayEnd(); -} - -template -inline void WriteJsonValue(JsonWriter& Writer, const TSet& Value) -{ - Writer->WriteArrayStart(); - for (const auto& Element : Value) - { - WriteJsonValue(Writer, Element); - } - Writer->WriteArrayEnd(); -} - -template -inline void WriteJsonValue(JsonWriter& Writer, const TMap& Value) -{ - Writer->WriteObjectStart(); - for (const auto& It : Value) - { - Writer->WriteIdentifierPrefix(It.Key); - WriteJsonValue(Writer, It.Value); - } - Writer->WriteObjectEnd(); -} ////////////////////////////////////////////////////////////////////////// @@ -492,4 +403,92 @@ inline bool TryGetJsonValue(const TSharedPtr& JsonObject, const FSt // Absence of optional value is not a parsing error. // Nullable is handled like optional. return true; +} + +////////////////////////////////////////////////////////////////////////// + +inline void WriteJsonValue(JsonWriter& Writer, const TSharedPtr& Value) +{ + if (Value.IsValid()) + { + FJsonSerializer::Serialize(Value.ToSharedRef(), "", Writer, false); + } + else + { + Writer->WriteObjectStart(); + Writer->WriteObjectEnd(); + } +} + +inline void WriteJsonValue(JsonWriter& Writer, const TSharedPtr& Value) +{ + if (Value.IsValid()) + { + FJsonSerializer::Serialize(Value.ToSharedRef(), Writer, false); + } + else + { + Writer->WriteObjectStart(); + Writer->WriteObjectEnd(); + } +} + +inline void WriteJsonValue(JsonWriter& Writer, const TArray& Value) +{ + Writer->WriteValue(FBase64::Encode(Value)); +} + +inline void WriteJsonValue(JsonWriter& Writer, const FDateTime& Value) +{ + Writer->WriteValue(Value.ToIso8601()); +} + +inline void WriteJsonValue(JsonWriter& Writer, const FGuid& Value) +{ + Writer->WriteValue(Value.ToString(EGuidFormats::DigitsWithHyphens)); +} + +inline void WriteJsonValue(JsonWriter& Writer, const F{{unrealModuleName}}Model& Value) +{ + Value.WriteJson(Writer); +} + +template::value, int>::type = 0> +inline void WriteJsonValue(JsonWriter& Writer, const T& Value) +{ + Writer->WriteValue(Value); +} + +template +inline void WriteJsonValue(JsonWriter& Writer, const TArray& Value) +{ + Writer->WriteArrayStart(); + for (const auto& Element : Value) + { + WriteJsonValue(Writer, Element); + } + Writer->WriteArrayEnd(); +} + +template +inline void WriteJsonValue(JsonWriter& Writer, const TSet& Value) +{ + Writer->WriteArrayStart(); + for (const auto& Element : Value) + { + WriteJsonValue(Writer, Element); + } + Writer->WriteArrayEnd(); +} + +template +inline void WriteJsonValue(JsonWriter& Writer, const TMap& Value) +{ + Writer->WriteObjectStart(); + for (const auto& It : Value) + { + Writer->WriteIdentifierPrefix(It.Key); + WriteJsonValue(Writer, It.Value); + } + Writer->WriteObjectEnd(); } \ No newline at end of file diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache index b5bfb00..adcf44a 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache @@ -14,11 +14,6 @@ {{#models}} {{#model}} {{#isEnum}} -inline void WriteJsonValue(JsonWriter& Writer, E{{classname}}_{{name}}_Values Value) -{ - WriteJsonValue(Writer, StaticEnum()->GetNameStringByValue(static_cast(Value))); -} - inline bool TryGetJsonValue(const TSharedPtr& JsonValue, E{{classname}}_{{name}}_Values Value) { {{#allowableValues}} @@ -32,15 +27,15 @@ inline bool TryGetJsonValue(const TSharedPtr& JsonValue, E{{classnam return false; } +inline void WriteJsonValue(JsonWriter& Writer, E{{classname}}_{{name}}_Values Value) +{ + WriteJsonValue(Writer, StaticEnum()->GetNameStringByValue(static_cast(Value))); +} + {{/isEnum}} {{#hasEnums}} {{#vars}} {{#isEnum}} -inline void WriteJsonValue(JsonWriter& Writer, E{{classname}}_{{name}} Value) -{ - WriteJsonValue(Writer, StaticEnum()->GetNameStringByValue(static_cast(Value))); -} - inline bool TryGetJsonValue(const TSharedPtr& JsonValue, E{{classname}}_{{name}} Value) { {{#allowableValues}} @@ -54,33 +49,14 @@ inline bool TryGetJsonValue(const TSharedPtr& JsonValue, E{{classnam return false; } -{{/isEnum}} -{{/vars}} -{{/hasEnums}} -void F{{classname}}::WriteJson(JsonWriter& Writer) const +inline void WriteJsonValue(JsonWriter& Writer, E{{classname}}_{{name}} Value) { - {{#isString}}WriteJsonValue(Writer, Value);{{/isString}}{{#composedSchemas}}{{#oneOf}}{{^-first}} - else {{/-first}}if (const {{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}}* {{#lambda.pascalcase}}{{dataType}}{{/lambda.pascalcase}}Value = OneOf.TryGet<{{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}}>()) - { - WriteJsonValue(Writer, *{{#lambda.pascalcase}}{{dataType}}{{/lambda.pascalcase}}Value); - }{{/oneOf}}{{/composedSchemas}}{{^oneOf}}{{^isString}}Writer->WriteObjectStart(); - - {{#vars}} - {{#required}} - Writer->WriteIdentifierPrefix(TEXT("{{baseName}}")); WriteJsonValue(Writer, {{name}}); - {{/required}} - {{^required}} - - if ({{name}}.IsSet()) - { - Writer->WriteIdentifierPrefix(TEXT("{{baseName}}")); WriteJsonValue(Writer, {{name}}.GetValue()); - } - {{/required}} - {{/vars}} - - Writer->WriteObjectEnd();{{/isString}}{{/oneOf}} + WriteJsonValue(Writer, StaticEnum()->GetNameStringByValue(static_cast(Value))); } +{{/isEnum}} +{{/vars}} +{{/hasEnums}} F{{classname}}::~F{{classname}}() { } @@ -112,4 +88,28 @@ bool F{{classname}}::FromJson(const TSharedPtr& JsonValue) {{/vars}} return ParseSuccess;{{/isString}}{{/oneOf}} +} + +void F{{classname}}::WriteJson(JsonWriter& Writer) const +{ + {{#isString}}WriteJsonValue(Writer, Value);{{/isString}}{{#composedSchemas}}{{#oneOf}}{{^-first}} + else {{/-first}}if (const {{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}}* {{#lambda.pascalcase}}{{dataType}}{{/lambda.pascalcase}}Value = OneOf.TryGet<{{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}}>()) + { + WriteJsonValue(Writer, *{{#lambda.pascalcase}}{{dataType}}{{/lambda.pascalcase}}Value); + }{{/oneOf}}{{/composedSchemas}}{{^oneOf}}{{^isString}}Writer->WriteObjectStart(); + + {{#vars}} + {{#required}} + Writer->WriteIdentifierPrefix(TEXT("{{baseName}}")); WriteJsonValue(Writer, {{name}}); + {{/required}} + {{^required}} + + if ({{name}}.IsSet()) + { + Writer->WriteIdentifierPrefix(TEXT("{{baseName}}")); WriteJsonValue(Writer, {{name}}.GetValue()); + } + {{/required}} + {{/vars}} + + Writer->WriteObjectEnd();{{/isString}}{{/oneOf}} }{{/model}}{{/models}} \ No newline at end of file From 70d19075de457f7cd0a49d02cb5c74a700ee5afa Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Wed, 12 Feb 2025 06:44:35 +1000 Subject: [PATCH 34/35] fix: try get json value not working for enums --- .../cpp-ue4/api-operations-header.mustache | 6 +++- .../cpp-ue4/api-operations-source.mustache | 14 +++++++-- .../template/cpp-ue4/model-header.mustache | 11 +++++-- .../template/cpp-ue4/model-source.mustache | 30 +++++++++++++++---- 4 files changed, 51 insertions(+), 10 deletions(-) diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache index 5114f70..31f22d8 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-header.mustache @@ -2,6 +2,7 @@ #pragma once +#include "Misc/EnumRange.h" #include "UObject/ObjectMacros.h" #include "{{modelNamePrefix}}BaseModel.h" @@ -19,9 +20,12 @@ UENUM(BlueprintType) enum class E{{classname}}_{{operationIdCamelCase}}Request_{{paramName}} : uint8 { {{#enumVars}} - {{name}} UMETA(DisplayName = "{{value}}"){{^-last}},{{/-last}} + {{name}} UMETA(DisplayName = "{{value}}"), {{/enumVars}} + MAX }; + +ENUM_RANGE_BY_COUNT(E{{classname}}_{{operationIdCamelCase}}Request_{{paramName}}, E{{classname}}_{{operationIdCamelCase}}Request_{{paramName}}::MAX); {{/allowableValues}} {{/isEnum}} {{/allParams}} diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache index 2a89a3c..32aa22e 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/api-operations-source.mustache @@ -14,13 +14,23 @@ {{#allParams}} {{#isEnum}} -inline bool TryGetJsonValue(const TSharedPtr& JsonValue, E{{classname}}_{{operationIdCamelCase}}Request_{{paramName}} Value) +inline bool TryGetJsonValue(const TSharedPtr& JsonValue, E{{classname}}_{{operationIdCamelCase}}Request_{{paramName}}& Value) { {{#allowableValues}} FString EnumNameString; if (JsonValue->TryGetString(EnumNameString)) { - return StaticEnum()->GetIndexByNameString(EnumNameString) != INDEX_NONE; + UEnum* Enum = StaticEnum(); + + for (E{{classname}}_{{operationIdCamelCase}}Request_{{paramName}} Entry : TEnumRange()) + { + if (Enum->GetNameStringByValue(static_cast(Entry)) == EnumNameString) + { + Value = Entry; + + return true; + } + } } {{/allowableValues}} diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache index eb71d89..de284e2 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache @@ -2,6 +2,7 @@ #pragma once +#include "Misc/EnumRange.h" #include "UObject/ObjectMacros.h" {{#models}} {{#model}} @@ -27,9 +28,12 @@ UENUM(BlueprintType) enum class E{{classname}}_{{name}}_Values : uint8 { {{#enumVars}} - {{name}} UMETA(DisplayName = "{{value}}"){{^-last}},{{/-last}} + {{name}} UMETA(DisplayName = "{{value}}"), {{/enumVars}} + MAX }; + +ENUM_RANGE_BY_COUNT(E{{classname}}_{{name}}_Values, E{{classname}}_{{name}}_Values::MAX); {{/allowableValues}} {{/isEnum}} {{/isString}} @@ -41,9 +45,12 @@ UENUM(BlueprintType) enum class E{{classname}}_{{name}} : uint8 { {{#enumVars}} - {{name}} UMETA(DisplayName = "{{value}}"){{^-last}},{{/-last}} + {{name}} UMETA(DisplayName = "{{value}}"), {{/enumVars}} + MAX }; + +ENUM_RANGE_BY_COUNT(E{{classname}}_{{name}}, E{{classname}}_{{name}}::MAX); {{/allowableValues}} {{/isEnum}} {{/vars}} diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache index adcf44a..6959bcb 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache @@ -3,10 +3,10 @@ #include "{{classname}}.h" #include "Templates/SharedPointer.h" +#include "UObject/Class.h" {{#models}} {{#model}} {{#hasEnums}} -#include "UObject/Class.h" {{/hasEnums}}{{/model}} {{/models}} #include "{{modelNamePrefix}}Helpers.h" @@ -14,13 +14,23 @@ {{#models}} {{#model}} {{#isEnum}} -inline bool TryGetJsonValue(const TSharedPtr& JsonValue, E{{classname}}_{{name}}_Values Value) +inline bool TryGetJsonValue(const TSharedPtr& JsonValue, E{{classname}}_{{name}}_Values& Value) { {{#allowableValues}} FString EnumNameString; if (JsonValue->TryGetString(EnumNameString)) { - return StaticEnum()->GetIndexByNameString(EnumNameString) != INDEX_NONE; + UEnum* Enum = StaticEnum(); + + for (E{{classname}}_{{name}}_Values Entry : TEnumRange()) + { + if (Enum->GetNameStringByValue(static_cast(Entry)) == EnumNameString) + { + Value = Entry; + + return true; + } + } } {{/allowableValues}} @@ -36,13 +46,23 @@ inline void WriteJsonValue(JsonWriter& Writer, E{{classname}}_{{name}}_Values Va {{#hasEnums}} {{#vars}} {{#isEnum}} -inline bool TryGetJsonValue(const TSharedPtr& JsonValue, E{{classname}}_{{name}} Value) +inline bool TryGetJsonValue(const TSharedPtr& JsonValue, E{{classname}}_{{name}}& Value) { {{#allowableValues}} FString EnumNameString; if (JsonValue->TryGetString(EnumNameString)) { - return StaticEnum()->GetIndexByNameString(EnumNameString) != INDEX_NONE; + UEnum* Enum = StaticEnum(); + + for (E{{classname}}_{{name}} Entry : TEnumRange()) + { + if (Enum->GetNameStringByValue(static_cast(Entry)) == EnumNameString) + { + Value = Entry; + + return true; + } + } } {{/allowableValues}} From 6ba98b9166bf74cbaf44d224a705521ec67dd46f Mon Sep 17 00:00:00 2001 From: ImmutableJeffrey Date: Wed, 12 Feb 2025 21:13:58 +1000 Subject: [PATCH 35/35] feat: add test for models --- .../template/cpp-ue4/helpers-header.mustache | 351 +++++++++++++++++- .../template/cpp-ue4/model-header.mustache | 96 ++++- .../template/cpp-ue4/model-source.mustache | 228 +++++++++++- 3 files changed, 656 insertions(+), 19 deletions(-) diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache index 1154f83..d94d5ce 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/helpers-header.mustache @@ -491,4 +491,353 @@ inline void WriteJsonValue(JsonWriter& Writer, const TMap& Value) WriteJsonValue(Writer, It.Value); } Writer->WriteObjectEnd(); -} \ No newline at end of file +} + +////////////////////////////////////////////////////////////////////////// + +inline bool operator ==(const TSharedPtr& Left, const TSharedPtr& Right) +{ + if (Left->Values.Num() != Right->Values.Num()) + { + return false; + } + + TArray LeftKeys; + Left->Values.GetKeys(LeftKeys); + + TArray RightKeys; + Right->Values.GetKeys(RightKeys); + + if (LeftKeys.Num() != RightKeys.Num()) + { + return false; + } + + if (LeftKeys != RightKeys) + { + return false; + } + + TArray> LeftValues; + Left->Values.GenerateValueArray(LeftValues); + + TArray> RightValues; + Right->Values.GenerateValueArray(RightValues); + + if (LeftValues.Num() != RightValues.Num()) + { + return false; + } + + if (LeftValues != RightValues) + { + return false; + } + + return true; +} + +inline bool operator !=(const TSharedPtr& Left, const TSharedPtr& Right) +{ + return !(Left == Right); +} + +inline bool operator ==(const TSet& Left, const TSet& Right) +{ + // ToDo: Test + + if (Left.Num() != Right.Num()) + { + return false; + } + + return Left.Array() == Right.Array(); +} + +inline bool operator !=(const TSet& Left, const TSet& Right) +{ + return !(Left == Right); +} + +inline bool operator ==(const TMap& Left, const TMap& Right) +{ + // ToDo: Test + + if (Left.Num() != Right.Num()) + { + return false; + } + + TArray LeftKeys; + Left.GetKeys(LeftKeys); + + TArray RightKeys; + Right.GetKeys(RightKeys); + + if (LeftKeys.Num() != RightKeys.Num()) + { + return false; + } + + if (LeftKeys != RightKeys) + { + return false; + } + + TArray LeftValues; + Left.GenerateValueArray(LeftValues); + + TArray RightValues; + Right.GenerateValueArray(RightValues); + + if (LeftValues.Num() != RightValues.Num()) + { + return false; + } + + if (LeftValues != RightValues) + { + return false; + } + + return true; +} + +inline bool operator !=(const TMap& Left, const TMap& Right) +{ + return !(Left == Right); +} + +inline bool operator ==(const TMap>& Left, const TMap>& Right) +{ + // ToDo: Test + + if (Left.Num() != Right.Num()) + { + return false; + } + + TArray LeftKeys; + Left.GetKeys(LeftKeys); + + TArray RightKeys; + Right.GetKeys(RightKeys); + + if (LeftKeys.Num() != RightKeys.Num()) + { + return false; + } + + if (LeftKeys != RightKeys) + { + return false; + } + + TArray> LeftValues; + Left.GenerateValueArray(LeftValues); + + TArray> RightValues; + Right.GenerateValueArray(RightValues); + + if (LeftValues.Num() != RightValues.Num()) + { + return false; + } + + for (int32 Index = 0; Index < LeftValues.Num(); ++Index) + { + if (*LeftValues[Index] != *RightValues[Index]) + { + return false; + } + } + + return true; +} + +inline bool operator !=(const TMap>& Left, const TMap>& Right) +{ + return !(Left == Right); +} + +////////////////////////////////////////////////////////////////////////// + +template +TArray GenerateMocks(int32 Count = 10) +{ + static_assert(false); + return {}; +} + +template <> +inline TArray GenerateMocks(int32 Count) +{ + TArray Result; + + for (int32 Index = 0; Index < Count; ++Index) + { + Result.Add(FMath::RandBool()); + } + + return Result; +} + +template <> +inline TArray GenerateMocks(int32 Count) +{ + TArray Result; + + for (int32 Index = 0; Index < Count; ++Index) + { + Result.Add(FMath::RandRange(0, 1000)); + } + + return Result; +} + +template <> +inline TArray GenerateMocks(int32 Count) +{ + TArray Result; + + for (int32 Index = 0; Index < Count; ++Index) + { + Result.Add(FMath::FRandRange(0, 1000)); + } + + return Result; +} + +template <> +inline TArray GenerateMocks(int32 Count) +{ + TArray Result; + + for (int32 Index = 0; Index < Count; ++Index) + { + Result.Add(FGuid::NewGuid()); + } + + return Result; +} + +template <> +inline TArray GenerateMocks(int32 Count) +{ + TArray Result; + + for (int32 Index = 0; Index < Count; ++Index) + { + Result.Add(FString::Printf(TEXT("Entry_%d_Mock"), Index)); + } + + return Result; +} + +template <> +inline TArray GenerateMocks(int32 Count) +{ + TArray Result; + + const FDateTime Now = FDateTime::Now(); + + for (int32 Index = 0; Index < Count; ++Index) + { + Result.Add(Now); + } + + return Result; +} + +template <> +inline TArray> GenerateMocks(int32 Count) +{ + TArray> Result; + + for (int32 ArrayIndex = 0; ArrayIndex < Count; ++ArrayIndex) + { + TArray Array; + + for (int32 Index = 0; Index < Count; ++Index) + { + Array.Add(FString::Printf(TEXT("Array_%d_Entry_%d_Mock"), ArrayIndex)); + } + + Result.Add(Array); + } + + return Result; +} + +template <> +inline TArray> GenerateMocks(int32 Count) +{ + TArray> Result; + + for (int32 Index = 0; Index < Count; ++Index) + { + Result.Add(MakeShared()); + } + + return Result; +} + +template <> +inline TArray> GenerateMocks(int32 Count) +{ + TArray> Result; + + for (int32 SetIndex = 0; SetIndex < Count; ++SetIndex) + { + TSet Set; + + for (int32 Index = 0; Index < Count; ++Index) + { + Set.Add(FGuid::NewGuid()); + } + + Result.Add(Set); + } + + return Result; +} + +template <> +inline TArray> GenerateMocks(int32 Count) +{ + TArray> Result; + + for (int32 MapIndex = 0; MapIndex < Count; ++MapIndex) + { + TMap Map; + + for (int32 Index = 0; Index < Count; ++Index) + { + Map.Add(FString::Printf(TEXT("Map_%d_Key_%d_Mock"), MapIndex, Index), FString::Printf(TEXT("Map_%d_Value_%d_Mock"), MapIndex, Index)); + } + + Result.Add(Map); + } + + return Result; +} + +template <> +inline TArray>> GenerateMocks(int32 Count) +{ + TArray>> Result; + + for (int32 MapIndex = 0; MapIndex < Count; ++MapIndex) + { + TMap> Map; + + for (int32 Index = 0; Index < Count; ++Index) + { + Map.Add(FString::Printf(TEXT("Map_%d_Key_%d_Mock"), MapIndex, Index), MakeShareable(new FJsonValueString(FString::Printf(TEXT("Map_%d_Value_%d_Mock"), MapIndex, Index)))); + } + + Result.Add(Map); + } + + return Result; +} diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache index de284e2..ad029a5 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-header.mustache @@ -15,6 +15,7 @@ {{/models}} #include "{{modelNamePrefix}}BaseModel.h" +#include "{{modelNamePrefix}}Helpers.h" {{#imports}} {{{import}}} {{/imports}} @@ -65,6 +66,9 @@ class {{dllapi}} F{{classname}} : public F{{unrealModuleName}}Model public: virtual ~F{{classname}}() override; + bool operator ==(const F{{classname}}& Other) const; + bool operator !=(const F{{classname}}& Other) const; + virtual bool FromJson(const TSharedPtr& JsonValue) override final; virtual void WriteJson(JsonWriter& Writer) const override final; @@ -99,11 +103,97 @@ public: {{/isEnum}} {{/vars}} {{#oneOf}} - {{/oneOf}} - {{#oneOf}} {{#-first}} {{#description}}/* {{{.}}} */ {{/description}}TVariant<{{#composedSchemas}}{{#oneOf}}{{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}}{{^-last}}, {{/-last}}{{/oneOf}}{{/composedSchemas}}> OneOf; {{/-first}} {{/oneOf}} -};{{/model}}{{/models}} \ No newline at end of file +}; + +template <> +inline TArray GenerateMocks(int32 Count) +{ + TArray Results; + + F{{classname}} Mock = {}; + + {{#isString}} + {{#isEnum}} + {{#allowableValues}} + for (E{{classname}}_{{name}}_Values Value : TEnumRange()) + { + Mock.Value = Value; + Results.Add(Mock); + } + {{/allowableValues}} + {{/isEnum}} + {{/isString}} + {{#vars}} + {{#isEnum}} + {{^required}} + Results.Add(Mock); + {{/required}} + {{#allowableValues}} + for (E{{classname}}_{{name}} Value : TEnumRange()) + { + Mock.{{name}} = Value; + Results.Add(Mock); + } + {{/allowableValues}} + {{/isEnum}} + {{^isEnum}} + {{^oneOf}} + {{#isPrimitiveType}} + {{#isString}} + TArray<{{datatype}}> {{name}}Mocks = GenerateMocks<{{datatype}}>(); + for (const {{datatype}}& {{name}}Mock : {{name}}Mocks) + { + {{#isUuid}}Mock.{{name}} = {{name}}Mock;{{/isUuid}}{{^isUuid}}Mock.{{name}} = FString::Printf(TEXT("%s_%s"), TEXT("{{name}}"), *{{name}}Mock);{{/isUuid}} + Results.Add(Mock); + } + {{/isString}} + {{^isString}} + TArray<{{{datatype}}}> {{name}}Mocks = GenerateMocks<{{{datatype}}}>(); + for (const {{{datatype}}}& {{name}}Mock : {{name}}Mocks) + { + Mock.{{name}} = {{name}}Mock; + Results.Add(Mock); + } + {{/isString}} + {{/isPrimitiveType}} + {{^isPrimitiveType}} + {{#isContainer}} + Mock.{{name}} = GenerateMocks(); + Results.Add(Mock); + {{/isContainer}} + {{^isContainer}} + TArray {{name}}Mocks = GenerateMocks(); + for (const F{{datatype}}& {{name}}Mock : {{name}}Mocks) + { + Mock.{{name}} = {{name}}Mock; + Results.Add(Mock); + } + {{/isContainer}} + {{/isPrimitiveType}} + {{/oneOf}} + {{/isEnum}} + {{^-last}} + + {{/-last}} + {{/vars}} + {{#composedSchemas}} + {{#oneOf}} + TArray<{{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}}> {{dataType}}Mocks = GenerateMocks<{{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}}>(); + for (const {{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}}& {{dataType}}Mock : {{dataType}}Mocks) + { + Mock.OneOf.Set<{{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}}>({{dataType}}Mock); + Results.Add(Mock); + } + {{^-last}} + + {{/-last}} + {{/oneOf}} + {{/composedSchemas}} + + return Results; +}{{/model}}{{/models}} \ No newline at end of file diff --git a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache index 6959bcb..908db8d 100644 --- a/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache +++ b/Source/ImmutablezkEVMAPI/openapi-generator/template/cpp-ue4/model-source.mustache @@ -81,16 +81,82 @@ F{{classname}}::~F{{classname}}() { } -bool F{{classname}}::FromJson(const TSharedPtr& JsonValue) +bool F{{classname}}::operator ==(const F{{classname}}& Other) const { - {{#isString}}return TryGetJsonValue(JsonValue, Value);{{/isString}}{{#composedSchemas}}{{#oneOf}}{{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}} {{#lambda.pascalcase}}{{dataType}}{{/lambda.pascalcase}}Value; - if (const bool bIs{{#lambda.pascalcase}}{{dataType}}{{/lambda.pascalcase}} = TryGetJsonValue(JsonValue, {{#lambda.pascalcase}}{{dataType}}{{/lambda.pascalcase}}Value)) + {{#isString}} + {{#isEnum}} + {{#allowableValues}} + if (Value != Other.Value) + { + return false; + } + {{^-last}} + + {{/-last}} + {{/allowableValues}} + {{/isEnum}} + {{^isEnum}} + if (Value != Other.Value) + { + return false; + } + {{^-last}} + + {{/-last}} + {{/isEnum}} + {{/isString}} + {{#vars}} + {{#isEnum}} + if ({{name}} != Other.{{name}}) + { + return false; + } + {{^-last}} + + {{/-last}} + {{/isEnum}} + {{^isEnum}} + {{^oneOf}} + if ({{name}} != Other.{{name}}) { - OneOf.Set<{{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}}>({{#lambda.pascalcase}}{{dataType}}{{/lambda.pascalcase}}Value); - return true; + return false; } + {{^-last}} - {{/oneOf}}{{/composedSchemas}}{{#oneOf}}{{#-last}}return false;{{/-last}}{{/oneOf}}{{^oneOf}}{{^isString}}const TSharedPtr* Object; + {{/-last}} + {{/oneOf}} + {{/isEnum}} + {{/vars}} + {{#oneOf}} + {{#-first}} + {{#composedSchemas}} + {{#oneOf}} + if (OneOf.IsType<{{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}}>() && Other.OneOf.IsType<{{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}}>()) + { + if (*OneOf.TryGet<{{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}}>() != *Other.OneOf.TryGet<{{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}}>()) + { + return false; + } + } + {{^-last}} + + {{/-last}} + {{/oneOf}} + {{/composedSchemas}} + {{/-first}} + {{/oneOf}} + + return true; +} + +bool F{{classname}}::operator !=(const F{{classname}}& Other) const +{ + return !(*this == Other); +} + +bool F{{classname}}::FromJson(const TSharedPtr& JsonValue) +{ + {{#isString}}return TryGetJsonValue(JsonValue, Value);{{/isString}}{{^isString}}const TSharedPtr* Object; if (!JsonValue->TryGetObject(Object)) { return false; @@ -99,26 +165,76 @@ bool F{{classname}}::FromJson(const TSharedPtr& JsonValue) bool ParseSuccess = true; {{#vars}} + {{#isEnum}} {{#required}} - {{^isWriteOnly}}ParseSuccess &= {{/isWriteOnly}}TryGetJsonValue(*Object, TEXT("{{baseName}}"), {{name}}); + {{^isWriteOnly}} + ParseSuccess &= {{/isWriteOnly}}TryGetJsonValue(*Object, TEXT("{{baseName}}"), {{name}}); {{/required}} {{^required}} ParseSuccess &= TryGetJsonValue(*Object, TEXT("{{baseName}}"), {{name}}); {{/required}} + {{/isEnum}} {{/vars}} + {{^oneOf}} + {{#vars}} + {{^isEnum}} + {{#required}} + {{^isWriteOnly}} + ParseSuccess &= {{/isWriteOnly}}TryGetJsonValue(*Object, TEXT("{{baseName}}"), {{name}}); + {{/required}} + {{^required}} + ParseSuccess &= TryGetJsonValue(*Object, TEXT("{{baseName}}"), {{name}}); + {{/required}} + {{/isEnum}} + {{/vars}} + {{/oneOf}} + {{/isString}} + {{#composedSchemas}} + {{#oneOf}} + const TSharedPtr {{name}} = (*Object)->TryGetField(TEXT("{{name}}")); + if ({{name}}.IsValid() && !{{name}}->IsNull()) + { + {{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}} {{#lambda.pascalcase}}{{dataType}}{{/lambda.pascalcase}}Value; + if (const bool bIs{{#lambda.pascalcase}}{{dataType}}{{/lambda.pascalcase}} = TryGetJsonValue({{name}}, {{#lambda.pascalcase}}{{dataType}}{{/lambda.pascalcase}}Value)) + { + OneOf.Set<{{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}}>({{#lambda.pascalcase}}{{dataType}}{{/lambda.pascalcase}}Value); + ParseSuccess &= bIs{{#lambda.pascalcase}}{{dataType}}{{/lambda.pascalcase}}; + } + } + {{^-last}} + + {{/-last}} + {{/oneOf}} + {{/composedSchemas}} - return ParseSuccess;{{/isString}}{{/oneOf}} + {{^isString}} + return ParseSuccess; + {{/isString}} } void F{{classname}}::WriteJson(JsonWriter& Writer) const { - {{#isString}}WriteJsonValue(Writer, Value);{{/isString}}{{#composedSchemas}}{{#oneOf}}{{^-first}} - else {{/-first}}if (const {{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}}* {{#lambda.pascalcase}}{{dataType}}{{/lambda.pascalcase}}Value = OneOf.TryGet<{{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}}>()) - { - WriteJsonValue(Writer, *{{#lambda.pascalcase}}{{dataType}}{{/lambda.pascalcase}}Value); - }{{/oneOf}}{{/composedSchemas}}{{^oneOf}}{{^isString}}Writer->WriteObjectStart(); + {{#isString}}WriteJsonValue(Writer, Value); + {{/isString}}{{^isString}}Writer->WriteObjectStart(); + {{/isString}} {{#vars}} + {{#isEnum}} + {{#required}} + Writer->WriteIdentifierPrefix(TEXT("{{baseName}}")); WriteJsonValue(Writer, {{name}}); + {{/required}} + {{^required}} + + if ({{name}}.IsSet()) + { + Writer->WriteIdentifierPrefix(TEXT("{{baseName}}")); WriteJsonValue(Writer, {{name}}.GetValue()); + } + {{/required}} + {{/isEnum}} + {{/vars}} + {{^oneOf}} + {{#vars}} + {{^isEnum}} {{#required}} Writer->WriteIdentifierPrefix(TEXT("{{baseName}}")); WriteJsonValue(Writer, {{name}}); {{/required}} @@ -129,7 +245,89 @@ void F{{classname}}::WriteJson(JsonWriter& Writer) const Writer->WriteIdentifierPrefix(TEXT("{{baseName}}")); WriteJsonValue(Writer, {{name}}.GetValue()); } {{/required}} + {{/isEnum}} {{/vars}} + {{/oneOf}} + {{#composedSchemas}}{{#oneOf}}{{^-first}} + else {{/-first}}if (const {{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}}* {{#lambda.pascalcase}}{{dataType}}{{/lambda.pascalcase}}Value = OneOf.TryGet<{{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}}>()) + { + Writer->WriteIdentifierPrefix(TEXT("{{name}}")); WriteJsonValue(Writer, *{{#lambda.pascalcase}}{{dataType}}{{/lambda.pascalcase}}Value); + }{{/oneOf}} + {{/composedSchemas}} - Writer->WriteObjectEnd();{{/isString}}{{/oneOf}} -}{{/model}}{{/models}} \ No newline at end of file + {{^isString}} + Writer->WriteObjectEnd(); + {{/isString}} +} + +#include "Misc/AutomationTest.h" + +IMPLEMENT_SIMPLE_AUTOMATION_TEST(FTest{{classname}}, "ImmutablezkEVMAPI.Mock.Model.{{classname}}", EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter) + +bool FTest{{classname}}::RunTest(const FString& Parameters) +{ + auto TestMock = [this](const F{{classname}}& {{classname}}_Mock) + { + FString JsonString; + TSharedRef>> JsonWriter = TJsonWriterFactory>::Create(&JsonString); + + {{#isString}} + JsonWriter->WriteObjectStart(); + + JsonWriter->WriteIdentifierPrefix(TEXT("value")); + {{/isString}} + {{classname}}_Mock.WriteJson(JsonWriter); + {{#isString}} + + JsonWriter->WriteObjectEnd(); + {{/isString}} + + TestTrue(TEXT("Successfully closed the json writer after serializing the mock model"), JsonWriter->Close()); + + TestTrue(TEXT("Successfully generated json string from the mock model"), !JsonString.IsEmpty()); + + TSharedRef> JsonReader = TJsonReaderFactory<>::Create(JsonString); + + TSharedPtr JsonValue; + if (TestTrue(TEXT("Successfully deserialized the json string into a valid json value"), FJsonSerializer::Deserialize(JsonReader, JsonValue) && JsonValue.IsValid())) + { + F{{classname}} {{classname}}_ReconstructedMock = {}; + + {{#isString}} + const TSharedPtr* Object; + if (TestTrue(TEXT("TryGetObject"), JsonValue->TryGetObject(Object))) + { + TestTrue(TEXT("TryGetJsonValue"), TryGetJsonValue(*Object, TEXT("value"), {{classname}}_ReconstructedMock.Value)); + } + {{/isString}} + {{^isString}} + TestTrue(TEXT("Successfully reconstructed the mock model from the json value"), {{classname}}_ReconstructedMock.FromJson(JsonValue)); + + {{#composedSchemas}} + {{#oneOf}} + TestEqual(TEXT("IsType {{#lambda.pascalcase}}{{dataType}}{{/lambda.pascalcase}}"), {{classname}}_ReconstructedMock.OneOf.IsType<{{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}}>(), {{classname}}_Mock.OneOf.IsType<{{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}}>()); + if ({{classname}}_ReconstructedMock.OneOf.IsType<{{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}}>() && {{classname}}_Mock.OneOf.IsType<{{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}}>()) + { + TestEqual(TEXT("TryGet {{#lambda.pascalcase}}{{dataType}}{{/lambda.pascalcase}}"), *{{classname}}_ReconstructedMock.OneOf.TryGet<{{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}}>(), *{{classname}}_Mock.OneOf.TryGet<{{^isPrimitiveType}}F{{/isPrimitiveType}}{{dataType}}>()); + } + {{/oneOf}} + {{/composedSchemas}} + + {{^oneOf}} + {{#vars}} + TestEqual(TEXT("{{name}}"), {{classname}}_ReconstructedMock.{{Name}}, {{classname}}_Mock.{{name}}); + {{/vars}} + {{/oneOf}} + {{/isString}} + } + }; + + TArray {{classname}}_Mocks = GenerateMocks(); + for (const F{{classname}}& {{classname}}_Mock : {{classname}}_Mocks) + { + TestMock({{classname}}_Mock); + } + + return true; +} +{{/model}}{{/models}} \ No newline at end of file