// Copyright Epic Games, Inc. All Rights Reserved. #include "CmdLineParameters.h" #include "Logging/SubmitToolLog.h" #include "Misc/CommandLine.h" const FCmdLineParameters FCmdLineParameters::Instance = FCmdLineParameters(); FCmdLineParameters::FCmdLineParameters() : Parameters(FSubmitToolCmdLine::SubmitToolCmdLineArgs) { } bool FCmdLineParameters::ValidateParameters() const { const TCHAR* CommandLine = FCommandLine::Get(); bool bIsValid = true; for (const TSharedPtr& Parameter : Parameters) { if (Parameter->bIsRequired) { FString Key = Parameter->Key; if(!Key.EndsWith(TEXT(" "))) { Key += TEXT(" "); } FString Val; if (FParse::Value(CommandLine, *Key, Val)) { if (Val.IsEmpty()) { UE_LOG(LogSubmitTool, Error, TEXT("Command Line argument '-%s' has no value."), *Parameter->Key); bIsValid = false; } else if(!Parameter->IsValid(Val)) { UE_LOG(LogSubmitTool, Error, TEXT("Command Line argument '-%s' value '%s' is invalid."), *Parameter->Key, *Val); bIsValid = false; } } else { UE_LOG(LogSubmitTool, Error, TEXT("Command Line missing '-%s' argument."), *Parameter->Key); bIsValid = false; } } else { // optional parameters must contain a value if they are present in the command line FString Val; if (!Parameter->bIsFlag && FParse::Value(CommandLine, *Parameter->Key, Val)) { if (Val.IsEmpty()) { UE_LOG(LogSubmitTool, Error, TEXT("Command Line argument '-%s' has no value."), *Parameter->Key); bIsValid = false; } } } } return bIsValid; } void FCmdLineParameters::LogParameters() const { for (const TSharedPtr& Parameter : Parameters) { UE_LOG(LogSubmitTool, Warning, TEXT("-%s\t%s"), *Parameter->Key, *Parameter->Description); } } const FCmdLineParameters& FCmdLineParameters::Get() { return Instance; } bool FCmdLineParameters::Contains(const FString& InKey) const { return FParse::Param(FCommandLine::Get(), *InKey); } bool FCmdLineParameters::GetValue(const FString& InKey, FString& OutValue) const { const TCHAR* CommandLine = FCommandLine::Get(); TArray Tokens; TArray Switches; FCommandLine::Parse(CommandLine, Tokens, Switches); const TSharedPtr* Definition = Parameters.FindByPredicate([InKey](const TSharedPtr& InCmdParam) { return InCmdParam->Key == InKey; }); for (int i = 0; i < Switches.Num(); i++) { FString Switch = Switches[i]; if (Switch.StartsWith(InKey, ESearchCase::IgnoreCase)) { TArray SplitSwitch; if (2 == Switch.ParseIntoArray(SplitSwitch, TEXT("="), true)) { OutValue = SplitSwitch[1]; if (Definition) { (*Definition)->CustomParse(OutValue); } return true; } } } for(int i = 0; i < Tokens.Num(); i++) { if(Tokens[i].Equals(InKey, ESearchCase::IgnoreCase) && i + 1 < Tokens.Num()) { OutValue = (*Definition)->bIsFlag ? TEXT("true") : Tokens[i + 1]; if(Definition) { (*Definition)->CustomParse(OutValue); } return true; } } return false; }