diff --git a/CMakeLists.txt b/CMakeLists.txt index b5c6e4a..e15bdf0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -43,6 +43,12 @@ FetchContent_Declare( URL ${CMAKE_SOURCE_DIR}/deps/argparse-v3.0-mirror.zip ) FetchContent_MakeAvailable(argparse) +FetchContent_Declare( + spdlog + URL_HASH SHA256=9f6763bb76fff7db371f5733626c83352edd7c57899501ab00248fafad9cc504 + URL ${CMAKE_SOURCE_DIR}/deps/spdlog-v1.13.0-mirror.zip +) +FetchContent_MakeAvailable(spdlog) include_directories(${CMAKE_SOURCE_DIR}/bpt/include) include_directories(${CMAKE_SOURCE_DIR}/stlite) enable_testing() diff --git a/deps/spdlog-v1.13.0-mirror.zip b/deps/spdlog-v1.13.0-mirror.zip new file mode 100644 index 0000000..b4cf0f4 Binary files /dev/null and b/deps/spdlog-v1.13.0-mirror.zip differ diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7ce699d..f09f7ab 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -5,4 +5,5 @@ if(OJ_TEST_BACKEND) endif() add_executable(${BACKEND_EXETUABLE_NAME} main.cpp) target_link_libraries(${BACKEND_EXETUABLE_NAME} argparse) +target_link_libraries(${BACKEND_EXETUABLE_NAME} spdlog::spdlog) set_target_properties(${BACKEND_EXETUABLE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index ef9aae6..d312ef8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,9 +1,27 @@ +#include +#include +#include +#include #include +#include #include const std::string main_version = "0.0.1"; const std::string build_version = GIT_COMMIT_HASH; +std::shared_ptr logger_ptr; int main(int argc, char *argv[]) { argparse::ArgumentParser program("backend", main_version + "-" + build_version); + argparse::ArgumentParser fsck_command("fsck"); + fsck_command.add_description("Check and fix data"); + program.add_subparser(fsck_command); + program.add_argument("-d", "--directory").help("Directory to serve").default_value(std::string(".")).nargs(1, 1); + auto &group = program.add_mutually_exclusive_group(); + group.add_argument("-c", "--consolelog").help("Enable console log").default_value(false).implicit_value(true); + group.add_argument("-l", "--logfile").help("Enable log file").nargs(1, 1); + program.add_argument("--level") + .help("Log level") + .default_value(std::string("info")) + .nargs(1, 1) + .choices("debug", "info", "warn", "error"); try { program.parse_args(argc, argv); } catch (const std::exception &err) { @@ -11,5 +29,33 @@ int main(int argc, char *argv[]) { std::cerr << program; return 1; } + auto data_directory = program.get("--directory"); + bool log_enabled = program.get("--consolelog"); + std::string log_file_name; + if (auto it = program.present("--logfile")) { + log_enabled = true; + log_file_name = program.get("--logfile"); + } + std::string log_level = program.get("--level"); + if (log_level == "debug") + spdlog::set_level(spdlog::level::debug); + else if (log_level == "info") + spdlog::set_level(spdlog::level::info); + else if (log_level == "warn") + spdlog::set_level(spdlog::level::warn); + else if (log_level == "error") + spdlog::set_level(spdlog::level::err); + else { + std::cerr << "Invalid log level" << std::endl; + return 1; + } + if (log_enabled) { + if (log_file_name == "") + logger_ptr = spdlog::stderr_color_mt("stderr_logger"); + else + logger_ptr = spdlog::basic_logger_mt("file_logger", log_file_name); + } + if (logger_ptr) logger_ptr->info("Starting backend"); + if (logger_ptr) logger_ptr->info("Data directory: {}", data_directory); return 0; } \ No newline at end of file