Handler registration overhaul

This commit is contained in:
2026-04-01 17:45:33 -04:00
parent 7e53975e3d
commit 483b3b75ff
74 changed files with 362 additions and 255 deletions

View File

@@ -265,7 +265,7 @@ FString UWingServer::HandleRequest(const FString& Line)
LogCapture.bEnabled = true;
HandlerOutput.Reset();
SuggestedManualSections.Empty();
LastHandlerClass = nullptr;
LastHandler = nullptr;
TryCallHandler(Line);
@@ -279,7 +279,7 @@ FString UWingServer::HandleRequest(const FString& Line)
if (!SuggestedManualSections.IsEmpty())
{
UWingServer::SuggestManual(WingManual::Section::HandlerHelp);
WingManual::PrintManual(SuggestedManualSections, LastHandlerClass, true);
WingManual::PrintManual(SuggestedManualSections, LastHandler, true);
}
FString Result = HandlerOutput.ToString();
HandlerOutput.Reset();
@@ -312,19 +312,20 @@ void UWingServer::TryCallHandler(const FString &Line)
}
Request->RemoveField(TEXT("command"));
// Find the handler UClass for the specified command.
TObjectPtr<UClass>* HandlerClass = WingHandlerRegistry.Find(Command);
if (!HandlerClass)
// Find the handler for the specified command.
FWingHandlerConfig* Found = FindHandler(Command);
if (!Found)
{
UWingServer::Printf(TEXT("Unknown command: %s"), *Command);
UWingServer::SuggestManual(WingManual::Section::ImportantCommands);
return;
}
LastHandlerClass = *HandlerClass;
LastHandler = Found;
// Make an object of the handler class.
TStrongObjectPtr<UObject> HandlerObj(NewObject<UObject>(GetTransientPackage(), *HandlerClass));
IWingHandler* Handler = Cast<IWingHandler>(HandlerObj.Get());
TStrongObjectPtr<UObject> HandlerObj(NewObject<UObject>(GetTransientPackage(), Found->Class.Get()));
UWingHandler* Handler = Cast<UWingHandler>(HandlerObj.Get());
Handler->ConfigurationObject = Found->Config.Get();
// Populate the handler object with the request parameters.
if (!FWingProperty::PopulateFromJson(HandlerObj->GetClass(), HandlerObj.Get(), &*Request))
@@ -451,10 +452,39 @@ void UWingServer::ClientThreadFunc(UWingServer* Server, TSharedPtr<FClientConnec
// BuildWingHandlerRegistry
// ============================================================
void UWingHandler::Register(UWingServer* Server)
{
UClass* Class = GetClass();
Server->AddHandler(WingUtils::GetHandlerName(Class), Class, nullptr, EWingHandlerKind::Normal);
}
void UWingServer::AddHandler(const FString& Name, UClass* Class, UObject* Config, EWingHandlerKind Kind)
{
FWingHandlerConfig H;
H.Name = Name;
H.Class = TStrongObjectPtr<UClass>(Class);
H.Config = TStrongObjectPtr<UObject>(Config);
H.Kind = Kind;
WingHandlerRegistry.Add(MoveTemp(H));
}
void UWingServer::BuildWingHandlerRegistry()
{
for (UClass* Class : WingUtils::CollectHandlerClasses())
{
WingHandlerRegistry.FindOrAdd(WingUtils::GetHandlerName(Class)) = Class;
UWingHandler* CDO = Cast<UWingHandler>(Class->GetDefaultObject());
CDO->Register(this);
}
WingHandlerRegistry.Sort([](const FWingHandlerConfig& A, const FWingHandlerConfig& B) { return A.Name < B.Name; });
}
FWingHandlerConfig* UWingServer::FindHandler(const FString& Name)
{
int32 Index = Algo::LowerBoundBy(WingHandlerRegistry, Name, [](const FWingHandlerConfig& H) { return H.Name; });
if (Index < WingHandlerRegistry.Num() && WingHandlerRegistry[Index].Name == Name)
{
return &WingHandlerRegistry[Index];
}
return nullptr;
}