add libfmt to replace current logging mechanism
Signed-off-by: Amneesh Singh <natto@weirdnatto.in>
This commit is contained in:
		
							
								
								
									
										10
									
								
								flake.nix
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								flake.nix
									
									
									
									
									
								
							@@ -19,7 +19,14 @@
 | 
				
			|||||||
        llvm = pkgs.llvmPackages_16;
 | 
					        llvm = pkgs.llvmPackages_16;
 | 
				
			||||||
        stdenv = llvm.libcxxStdenv;
 | 
					        stdenv = llvm.libcxxStdenv;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        nativeBuildInputs = with pkgs; [ meson ninja ];
 | 
					        nativeBuildInputs = with pkgs; [
 | 
				
			||||||
 | 
					          meson
 | 
				
			||||||
 | 
					          ninja
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          # libraries
 | 
				
			||||||
 | 
					          pkg-config
 | 
				
			||||||
 | 
					          fmt.dev
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
      in
 | 
					      in
 | 
				
			||||||
      rec {
 | 
					      rec {
 | 
				
			||||||
        packages = rec {
 | 
					        packages = rec {
 | 
				
			||||||
@@ -49,7 +56,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
              # other tools
 | 
					              # other tools
 | 
				
			||||||
              valgrind
 | 
					              valgrind
 | 
				
			||||||
 | 
					 | 
				
			||||||
              llvm.lldb
 | 
					              llvm.lldb
 | 
				
			||||||
            ]);
 | 
					            ]);
 | 
				
			||||||
          };
 | 
					          };
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,49 +0,0 @@
 | 
				
			|||||||
#include "log.hh"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace logging {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace ansi {
 | 
					 | 
				
			||||||
static const char* RED     = "\033[31m";
 | 
					 | 
				
			||||||
static const char* YELLOW  = "\033[33m";
 | 
					 | 
				
			||||||
static const char* MAGENTA = "\033[35m";
 | 
					 | 
				
			||||||
static const char* WHITE   = "\033[37m";
 | 
					 | 
				
			||||||
static const char* BOLD    = "\033[1m";
 | 
					 | 
				
			||||||
static const char* RESET   = "\033[0m";
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Logger::Logger(std::ostream& os)
 | 
					 | 
				
			||||||
  : os(os){};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void
 | 
					 | 
				
			||||||
Logger::set_level(Level level) {
 | 
					 | 
				
			||||||
    switch (level) {
 | 
					 | 
				
			||||||
        case Level::Debug:
 | 
					 | 
				
			||||||
            os << ansi::MAGENTA << ansi::BOLD << "[DEBUG] ";
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        case Level::Info:
 | 
					 | 
				
			||||||
            os << ansi::WHITE << "[INFO] ";
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        case Level::Warn:
 | 
					 | 
				
			||||||
            os << ansi::YELLOW << "[WARN] ";
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        case Level::Error:
 | 
					 | 
				
			||||||
            os << ansi::RED << ansi::BOLD << "[ERROR] ";
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // unreachable
 | 
					 | 
				
			||||||
        default: {
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void
 | 
					 | 
				
			||||||
Logger::reset_level() {
 | 
					 | 
				
			||||||
    os << ansi::RESET;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Global logger
 | 
					 | 
				
			||||||
logging::Logger logger;
 | 
					 | 
				
			||||||
@@ -1,42 +1,57 @@
 | 
				
			|||||||
#pragma once
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <iomanip>
 | 
					#include <fmt/ostream.h>
 | 
				
			||||||
#include <iostream>
 | 
					#include <iostream>
 | 
				
			||||||
#include <source_location>
 | 
					 | 
				
			||||||
#include <streambuf>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace logging {
 | 
					namespace logger {
 | 
				
			||||||
enum class Level {
 | 
					inline std::ostream& stream = std::clog;
 | 
				
			||||||
    Debug,
 | 
					 | 
				
			||||||
    Info,
 | 
					 | 
				
			||||||
    Warn,
 | 
					 | 
				
			||||||
    Error,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Logger {
 | 
					namespace ansi {
 | 
				
			||||||
  public:
 | 
					static constexpr char RED[]     = "\033[31m";
 | 
				
			||||||
    Logger(std::ostream& os = std::clog);
 | 
					static constexpr char YELLOW[]  = "\033[33m";
 | 
				
			||||||
 | 
					static constexpr char MAGENTA[] = "\033[35m";
 | 
				
			||||||
    template<typename... Args>
 | 
					static constexpr char WHITE[]   = "\033[37m";
 | 
				
			||||||
    void print(Level level, Args&&... args) {
 | 
					static constexpr char BOLD[]    = "\033[1m";
 | 
				
			||||||
        set_level(level);
 | 
					static constexpr char RESET[]   = "\033[0m";
 | 
				
			||||||
        (os << ... << args);
 | 
					 | 
				
			||||||
        reset_level();
 | 
					 | 
				
			||||||
        os << std::endl;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  private:
 | 
					 | 
				
			||||||
    std::ostream& os;
 | 
					 | 
				
			||||||
    void set_level(Level level);
 | 
					 | 
				
			||||||
    void reset_level();
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern logging::Logger logger;
 | 
					template<typename... Args>
 | 
				
			||||||
 | 
					inline void
 | 
				
			||||||
 | 
					log_raw(const fmt::format_string<Args...>& fmt, Args&&... args) {
 | 
				
			||||||
 | 
					    fmt::println(stream, fmt, std::forward<Args>(args)...);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define log_debug(...) logger.print(logging::Level::Debug, __VA_ARGS__)
 | 
					template<typename... Args>
 | 
				
			||||||
#define log_info(...) logger.print(logging::Level::Info, __VA_ARGS__)
 | 
					inline void
 | 
				
			||||||
#define log_warn(...) logger.print(logging::Level::Warn, __VA_ARGS__)
 | 
					log_debug(const fmt::format_string<Args...>& fmt, Args&&... args) {
 | 
				
			||||||
#define log_error(...) logger.print(logging::Level::Error, __VA_ARGS__)
 | 
					    fmt::print(stream, "{}{}[DEBUG] ", ansi::MAGENTA, ansi::BOLD);
 | 
				
			||||||
#define log(...) log_info(__VA_ARGS__)
 | 
					    log_raw(fmt, std::forward<Args>(args)...);
 | 
				
			||||||
#define debug(value) log_debug(#value, " = ", value)
 | 
					    fmt::print(stream, ansi::RESET);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<typename... Args>
 | 
				
			||||||
 | 
					inline void
 | 
				
			||||||
 | 
					log_info(const fmt::format_string<Args...>& fmt, Args&&... args) {
 | 
				
			||||||
 | 
					    fmt::print(stream, "{}[INFO] ", ansi::WHITE);
 | 
				
			||||||
 | 
					    log_raw(fmt, std::forward<Args>(args)...);
 | 
				
			||||||
 | 
					    fmt::print(stream, ansi::RESET);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<typename... Args>
 | 
				
			||||||
 | 
					inline void
 | 
				
			||||||
 | 
					log_warn(const fmt::format_string<Args...>& fmt, Args&&... args) {
 | 
				
			||||||
 | 
					    fmt::print(stream, "{}[WARN] ", ansi::YELLOW);
 | 
				
			||||||
 | 
					    log_raw(fmt, std::forward<Args>(args)...);
 | 
				
			||||||
 | 
					    fmt::print(stream, ansi::RESET);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<typename... Args>
 | 
				
			||||||
 | 
					inline void
 | 
				
			||||||
 | 
					log_error(const fmt::format_string<Args...>& fmt, Args&&... args) {
 | 
				
			||||||
 | 
					    fmt::print(stream, "{}{}[ERROR] ", ansi::RED, ansi::BOLD);
 | 
				
			||||||
 | 
					    log_raw(fmt, std::forward<Args>(args)...);
 | 
				
			||||||
 | 
					    fmt::print(stream, ansi::RESET);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define debug(value) logger::log_debug("{} = {}", #value, value)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,3 @@
 | 
				
			|||||||
lib_sources += files(
 | 
					lib_sources += files(
 | 
				
			||||||
  'log.cc',
 | 
					 | 
				
			||||||
  'utils.cc'
 | 
					  'utils.cc'
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
		Reference in New Issue
	
	Block a user