#pragma once #include #include #include "templates.h" #include "zstring.h" #include "printf.h" #include "m_argv.h" class Commandlet { public: virtual ~Commandlet() = default; virtual void OnCommand(FArgs args) = 0; virtual void OnPrintHelp() = 0; void RunInGame(std::function action); const FString& GetLongFormName() const { return LongFormName; } const FString& GetShortDescription() const { return ShortDescription; } protected: void SetLongFormName(FString name) { LongFormName = std::move(name); } void SetShortDescription(FString desc) { ShortDescription = std::move(desc); } private: FString LongFormName; FString ShortDescription; }; class CommandletGroup { public: void AddGroup(std::unique_ptr group); void AddCommand(std::unique_ptr command); template void AddGroup() { AddGroup(std::make_unique()); } template void AddCommand() { AddCommand(std::make_unique()); } const FString& GetLongFormName() const { return LongFormName; } const FString& GetShortDescription() const { return ShortDescription; } protected: void SetLongFormName(FString name) { LongFormName = std::move(name); } void SetShortDescription(FString desc) { ShortDescription = std::move(desc); } private: FString LongFormName; FString ShortDescription; TArray> Groups; TArray> Commands; friend class RootCommandlet; }; class RootCommandlet : public CommandletGroup { public: RootCommandlet(); void RunCommand(); static void RunEngineCommand(); private: void RunCommand(CommandletGroup* group, FArgs args, const FString prefix); void PrintCommandList(CommandletGroup* group, const FString prefix); void PrintDetailHelp(CommandletGroup* group, FArgs args); };