// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "WebAPIDefinition.h" #include "Dom/WebAPIEnum.h" #include "Dom/WebAPIModel.h" #include "Dom/WebAPIOperation.h" #include "Dom/WebAPISchema.h" #include "Dom/WebAPIService.h" #include "Dom/WebAPITypeRegistry.h" #include "UObject/StrongObjectPtr.h" #include "V2/WebAPISwaggerSchema.h" namespace UE::WebAPI::Swagger { class FWebAPISwaggerSchemaConverter { public: FWebAPISwaggerSchemaConverter( const TSharedPtr& InSwagger, UWebAPISchema* InWebAPISchema, const TSharedRef& InMessageLog, const FWebAPIProviderSettings& InProviderSettings); bool Convert(); public: FString NameTransformer(const FWebAPINameVariant& InString) const; TObjectPtr ResolveType(FString InJsonType, FString InTypeHint, FString InDefinitionName, const TSharedPtr& InSchema = nullptr) const; template TObjectPtr ResolveType(const TSharedPtr& InSchema, const FString& InDefinitionName = {}, FString InJsonType = {}); TObjectPtr GetTypeForContentType(const FString& InContentType); template FString GetDefaultJsonTypeForStorage(const StorageType& InStorage); template TSharedPtr ResolveReference(const FString& InDefinitionName); /** Only resolves if necessary. */ template TSharedPtr ResolveReference(const Json::TJsonReference& InJsonReference, FString& OutDefinitionName, bool bInCheck = true); //FWebAPINameVariant ResolveModelName(const TObjectPtr& InProperty, const TOptional& bInIsArray, const FWebAPITypeNameVariant& InPossibleName = {}); FWebAPINameVariant ResolvePropertyName(const TObjectPtr& InProperty, const FWebAPITypeNameVariant& InPotentialName, const TOptional& bInIsArray = {}); template bool IsArray(const TSharedPtr& InSchema); template static bool ConvertModelBase(const TSharedPtr& InSchema, const TObjectPtr& OutModel); template TObjectPtr ConvertEnum(const TSharedPtr& InSrcSchema, const FWebAPITypeNameVariant& InEnumTypeName = {}) const; /** Modifies an existing Property using the supplied source object. */ template bool PatchProperty(const TSharedPtr& InSrcSchema, const FWebAPINameVariant& InPropertyName, const TObjectPtr& OutProperty); /** Modifies an existing Property using the supplied source object. */ template bool PatchProperty(const FWebAPITypeNameVariant& InModelName, const FWebAPINameVariant& InPropertyName, const TSharedPtr& InSchema, const FString& InDefinitionName, const TObjectPtr& OutProperty); /** Modifies an existing Property using the supplied TypeInfo. */ bool PatchProperty(const FWebAPITypeNameVariant& InModelName, const FWebAPINameVariant& InPropertyName, const FWebAPITypeNameVariant& InPropertyTypeName, const TObjectPtr& OutProperty); /** Creates a new Property from the supplied source object. */ template TObjectPtr ConvertProperty(const TSharedPtr& InSrcSchema, const TObjectPtr& InModel, const FWebAPINameVariant& InPropertyName = {}, const FString& InDefinitionName = {}); /* template <> bool ConvertProperty(const FWebAPITypeNameVariant& InModelName, const FWebAPINameVariant& InPropertyName, const TSharedPtr& InSchema, const FString& InDefinitionName, const TObjectPtr& OutProperty); */ /** Modifies an existing Model using the supplied source object. */ template bool PatchModel(const TSharedPtr& InSrcSchema, const FWebAPITypeNameVariant& InModelTypeName, const TObjectPtr& OutModel); /** Creates a new Model from the supplied source object. */ template TObjectPtr ConvertModel(const TSharedPtr& InSrcSchema, const FWebAPITypeNameVariant& InModelTypeName = {}); bool ConvertOperationParameter(const FWebAPINameVariant& InParameterName, const TSharedPtr& InParameter, const FString& InDefinitionName, const TObjectPtr& OutParameter); TObjectPtr ConvertParameter(const TSharedPtr& InSrcParameter); bool ConvertRequest(const FWebAPITypeNameVariant& InOperationName, const TSharedPtr& InOperation, const TObjectPtr& OutRequest); bool ConvertResponse(const FWebAPITypeNameVariant& InOperationName, uint32 InResponseCode, const TSharedPtr& InResponse, const TObjectPtr& OutResponse); TObjectPtr ConvertOperation(const FString& InPath, const FString& InVerb, const TSharedPtr& InSrcOperation, const FWebAPITypeNameVariant& InOperationTypeName = {}); TObjectPtr ConvertService(const FWebAPINameVariant& InName) const; TObjectPtr ConvertService(const TSharedPtr& InTag) const; bool ConvertModels(const TMap>& InSchemas, UWebAPISchema* OutSchema); bool ConvertParameters(const TMap>& InParameters, UWebAPISchema* OutSchema); bool ConvertSecurity(const UE::WebAPI::OpenAPI::V2::FSwagger& InSwagger, UWebAPISchema* OutSchema); bool ConvertTags(const TArray>& InTags, UWebAPISchema* OutSchema) const; bool ConvertPaths(const TMap>& InPaths, UWebAPISchema* OutSchema); private: TSharedPtr InputSchema; TStrongObjectPtr OutputSchema; TSharedPtr MessageLog; FWebAPIProviderSettings ProviderSettings; }; template <> TSharedPtr FWebAPISwaggerSchemaConverter::ResolveReference(const FString& InDefinitionName); template <> TSharedPtr FWebAPISwaggerSchemaConverter::ResolveReference(const FString& InDefinitionName); /** Modifies an existing Model using the supplied source object. */ template <> bool FWebAPISwaggerSchemaConverter::PatchModel(const TSharedPtr& InSrcSchema, const FWebAPITypeNameVariant& InModelTypeName, const TObjectPtr& OutModel); }