From d31e600f14138180528505d7c9df8ec2151fb14f Mon Sep 17 00:00:00 2001 From: Jasson Cordones Date: Tue, 25 Jun 2024 14:09:52 -0400 Subject: [PATCH] core: Inproved error handling and arg parsing (#380) * Inproved error handling and arg parsing * Removed duplicated lines * Remove curly braces from short ifs, used c-style casts, used contains instead of find to parse exception, applied clang formating * Fix Formatting --- src/main.cpp | 82 ++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 60 insertions(+), 22 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 8bc156f..547b849 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,6 +1,7 @@ #include "config/ConfigManager.hpp" #include "core/hyprlock.hpp" +#include void help() { std::cout << "Usage: hyprlock [options]\n\n" @@ -12,13 +13,26 @@ void help() { " --immediate - Lock immediately, ignoring any configured grace period\n" " -h, --help - Show this help message\n"; } -int main(int argc, char** argv, char** envp) { - std::string configPath; - std::string wlDisplay; - bool immediate = false; - for (int i = 1; i < argc; ++i) { - std::string arg = argv[i]; +std::optional parseArg(const std::vector& args, const std::string& flag, std::size_t& i) { + if (i + 1 < args.size()) { + return args[++i]; + } else { + std::cerr << "Error: Missing value for " << flag << " option.\n"; + return std::nullopt; + } +} + +int main(int argc, char** argv, char** envp) { + std::string configPath; + std::string wlDisplay; + bool immediate = false; + bool showHelp = false; + + std::vector args(argv, argv + argc); + + for (std::size_t i = 1; i < args.size(); ++i) { + const std::string arg = argv[i]; if (arg == "--verbose" || arg == "-v") Debug::verbose = true; @@ -26,33 +40,57 @@ int main(int argc, char** argv, char** envp) { else if (arg == "--quiet" || arg == "-q") Debug::quiet = true; - else if ((arg == "--config" || arg == "-c") && i + 1 < argc) - configPath = argv[++i]; + else if ((arg == "--config" || arg == "-c") && i + 1 < (std::size_t)argc) { + if (auto value = parseArg(args, arg, i); value) + configPath = *value; + else + return 1; - else if (arg == "--display" && i + 1 < argc) { - wlDisplay = argv[i + 1]; - i++; - } else if (arg == "--immediate") { + } else if (arg == "--display" && i + 1 < (std::size_t)argc) { + if (auto value = parseArg(args, arg, i); value) + wlDisplay = *value; + else + return 1; + + } else if (arg == "--immediate") immediate = true; - } else if (arg == "--help" || arg == "-h") { + + else if (arg == "--help" || arg == "-h") { + showHelp = true; + break; + + } else { + std::cerr << "Unknown option: " << arg << "\n"; help(); - return 0; + return 1; } } + if (showHelp) { + help(); + return 0; + } + try { - g_pConfigManager = std::make_unique(configPath); - g_pConfigManager->init(); - } catch (const char* err) { - Debug::log(CRIT, "ConfigManager threw: {}", err); - std::string strerr = err; - if (strerr.contains("File does not exist")) + auto configManager = std::make_unique(configPath); + configManager->init(); + g_pConfigManager = std::move(configManager); + } catch (const std::exception& ex) { + Debug::log(CRIT, "ConfigManager threw: {}", ex.what()); + if (std::string(ex.what()).contains("File does not exist")) Debug::log(NONE, " Make sure you have a config."); + return 1; } - g_pHyprlock = std::make_unique(wlDisplay, immediate); - g_pHyprlock->run(); + try { + auto hyprlock = std::make_unique(wlDisplay, immediate); + g_pHyprlock = std::move(hyprlock); + g_pHyprlock->run(); + } catch (const std::exception& ex) { + Debug::log(CRIT, "Hyprlock threw: {}", ex.what()); + return 1; + } return 0; }