// Copyright (C) 2022 TiltedPhoques SRL. // For licensing information see LICENSE at the root of this distribution. #pragma once #include #include #include namespace Console { template struct ErrorOr { const char* msg; T val; }; template struct ResultAnd { explicit ResultAnd(T x) : val(x) { } ResultAnd(const char* msg, T x) : val(x) , msg(msg) { } const char* msg{nullptr}; T val; }; // Never make this class static class ConsoleRegistry { public: ConsoleRegistry(const char* acLoggerName); ~ConsoleRegistry(); void RegisterNatives(); void BindStaticItems(); template inline void RegisterCommand(const char* acName, const char* acDesc, std::function func) { AddCommand(TiltedPhoques::CastUnique(TiltedPhoques::MakeUnique>(acName, acDesc, func))); } inline void RegisterSetting(const char* acName, const char* acDesc, const char* acString) { AddSetting(TiltedPhoques::CastUnique(TiltedPhoques::MakeUnique(acName, acDesc, acString))); } template inline void RegisterSetting(const char* acName, const char* acDesc, const T acDefault) { AddSetting(TiltedPhoques::CastUnique(TiltedPhoques::MakeUnique>(acName, acDesc, acDefault))); } enum class ExecutionResult { kFailure, kSuccess, kDirty }; ExecutionResult TryExecuteCommand(const TiltedPhoques::String& acLine); CommandBase* FindCommand(const char* acName); SettingBase* FindSetting(const char* acName); // Note that this is not thread safe, call this from the same thread you requested // the execution from. auto& GetCommandHistory() const noexcept { return m_commandHistory; } // Call this from your main thread, this will drain the work item queue. bool Update(); template void ForAllCommands(T functor) { for (auto& c : m_commands) functor(c); } template void ForAllSettings(T functor) { for (auto& c : m_settings) functor(c); } void MarkDirty() noexcept { m_requestFlush = true; } private: void AddCommand(TiltedPhoques::UniquePtr apCommand); void AddSetting(TiltedPhoques::UniquePtr apSetting); void StoreCommandInHistory(const TiltedPhoques::String& acLine); ResultAnd CreateArgStack(const CommandBase* apCommand, const TiltedPhoques::String* acStringArgs, ArgStack& aStackOut); private: std::mutex m_listLock; TiltedPhoques::Vector m_commands; TiltedPhoques::Vector m_settings; TiltedPhoques::Vector> m_dynamicCommands; TiltedPhoques::Vector> m_dynamicSettings; TiltedPhoques::Vector m_commandHistory; CommandQueue m_queue; bool m_requestFlush = true; std::shared_ptr m_out; }; } // namespace Console