86 lines
2.1 KiB
C++
86 lines
2.1 KiB
C++
#pragma once
|
|
|
|
#include "CoreMinimal.h"
|
|
#include "WingHandler.h"
|
|
#include "WingFetcher.h"
|
|
#include "WingServer.h"
|
|
#include "WingTypes.h"
|
|
#include "WingJson.h"
|
|
#include "WingUtils.h"
|
|
#include "ShowCommands.generated.h"
|
|
|
|
UCLASS()
|
|
class UWing_ShowCommands : public UObject, public IWingHandler
|
|
{
|
|
GENERATED_BODY()
|
|
|
|
public:
|
|
UPROPERTY(meta=(Optional, Description="Substring filter for command names"))
|
|
FString Query;
|
|
|
|
UPROPERTY(meta=(Optional, Description="If true, return full details including parameter types and descriptions"))
|
|
bool Verbose = false;
|
|
|
|
virtual FString GetDescription() const override
|
|
{
|
|
return TEXT("List all available commands with their descriptions.");
|
|
}
|
|
|
|
void EmitCommand(UClass* Class)
|
|
{
|
|
if (Verbose)
|
|
{
|
|
WingUtils::FormatCommandHelp(Class);
|
|
return;
|
|
}
|
|
UWingServer::Print(WingUtils::GetHandlerName(Class));
|
|
UWingServer::Print(TEXT("("));
|
|
bool bFirst = true;
|
|
for (TFieldIterator<FProperty> PropIt(Class, EFieldIterationFlags::None); PropIt; ++PropIt)
|
|
{
|
|
if (!bFirst) UWingServer::Print(TEXT(","));
|
|
bFirst = false;
|
|
if (PropIt->HasMetaData(TEXT("Optional"))) UWingServer::Print(TEXT("?"));
|
|
UWingServer::Print(PropIt->GetName());
|
|
}
|
|
UWingServer::Print(TEXT(")\n"));
|
|
}
|
|
|
|
void EmitCommandList(bool bHalfBaked)
|
|
{
|
|
FString QueryLower = Query.ToLower();
|
|
FString PrevGroup;
|
|
|
|
for (UClass* Class : WingUtils::CollectHandlerClasses())
|
|
{
|
|
bool bIsHalfBaked = Class->GetMetaData(TEXT("ModuleRelativePath")).StartsWith(TEXT("HalfBaked/"));
|
|
if (bIsHalfBaked != bHalfBaked)
|
|
continue;
|
|
|
|
FString ToolName = WingUtils::GetHandlerName(Class);
|
|
if (!ToolName.ToLower().Contains(QueryLower))
|
|
continue;
|
|
|
|
// Blank line between groups
|
|
FString Group = WingUtils::GetHandlerGroup(Class);
|
|
if (Group != PrevGroup)
|
|
{
|
|
if (!PrevGroup.IsEmpty())
|
|
UWingServer::Print(TEXT("\n"));
|
|
PrevGroup = Group;
|
|
}
|
|
|
|
EmitCommand(Class);
|
|
}
|
|
}
|
|
|
|
virtual void Handle() override
|
|
{
|
|
UWingServer::Printf(TEXT("\n"));
|
|
EmitCommandList(false);
|
|
// UWingServer::Print(TEXT("\n--- Half-Baked (may have issues) ---\n\n"));
|
|
// EmitCommandList(true);
|
|
UWingServer::Printf(TEXT("\n"));
|
|
}
|
|
};
|