#ifndef LOGGER_H #define LOGGER_H #include "fmt/format.h" #include class DiskFlux; class TrackDataFlux; class TrackFlux; class Sector; class LogRenderer { public: static std::unique_ptr create(); public: virtual LogRenderer& add(std::string m) = 0; virtual LogRenderer& newsection() = 0; virtual LogRenderer& newline() = 0; virtual void renderTo(std::ostream& stream) = 0; }; struct ErrorLogMessage; struct EmergencyStopMessage; struct BeginSpeedOperationLogMessage; struct EndSpeedOperationLogMessage; struct TrackReadLogMessage; struct DiskReadLogMessage; struct BeginReadOperationLogMessage; struct EndReadOperationLogMessage; struct BeginWriteOperationLogMessage; struct EndWriteOperationLogMessage; struct BeginOperationLogMessage; struct EndOperationLogMessage; struct OperationProgressLogMessage; struct ErrorLogMessage { std::string message; }; struct EmergencyStopMessage { }; extern void renderLogMessage( LogRenderer& r, std::shared_ptr m); extern void renderLogMessage( LogRenderer& r, std::shared_ptr m); extern void renderLogMessage( LogRenderer& r, std::shared_ptr m); extern void renderLogMessage( LogRenderer& r, std::shared_ptr m); extern void renderLogMessage( LogRenderer& r, std::shared_ptr m); extern void renderLogMessage( LogRenderer& r, std::shared_ptr m); extern void renderLogMessage( LogRenderer& r, std::shared_ptr m); extern void renderLogMessage( LogRenderer& r, std::shared_ptr m); extern void renderLogMessage( LogRenderer& r, std::shared_ptr m); extern void renderLogMessage( LogRenderer& r, std::shared_ptr m); extern void renderLogMessage( LogRenderer& r, std::shared_ptr m); extern void renderLogMessage( LogRenderer& r, std::shared_ptr m); extern void renderLogMessage( LogRenderer& r, std::shared_ptr m); typedef std::variant, std::shared_ptr, std::shared_ptr, std::shared_ptr, std::shared_ptr, std::shared_ptr, std::shared_ptr, std::shared_ptr, std::shared_ptr, std::shared_ptr, std::shared_ptr, std::shared_ptr, std::shared_ptr, std::shared_ptr> AnyLogMessage; extern void log(const char* ptr); extern void log(const AnyLogMessage& message); template inline void log(const T& message) { log(AnyLogMessage(std::make_shared(message))); } template inline void log(fmt::string_view fstr, const Args&... args) { log(fmt::format(fstr, args...)); } namespace Logger { extern void setLogger(std::function cb); extern std::string toString(const AnyLogMessage&); } #endif