satdump/src-core/common/cli_utils.cpp

87 lines
3.2 KiB
C++
Raw Normal View History

2022-02-21 23:32:11 +01:00
#include "cli_utils.h"
nlohmann::json parse_common_flags(int argc, char *argv[], std::map<std::string, std::optional<std::type_index>> strong_types)
2022-02-21 23:32:11 +01:00
{
nlohmann::json parameters;
if (argc > 0)
{
for (int i = 0; i < argc; i++)
{
if (i != argc)
{
std::string flag = argv[i];
if (flag[0] == '-' && flag[1] == '-') // Detect a flag
{
flag = flag.substr(2, flag.length()); // Remove the "--"
if (i + 1 == argc) // Check if there is a next element, if not, consider this is a switch
{
parameters[flag] = true;
continue;
}
std::string value = argv[i + 1]; // Get value
// Check if the next value is a flag as well. If so, treat as a switch and set it to true
if (value[0] == '-' && value[1] == '-')
{
parameters[flag] = true;
continue;
}
// Force specified flags to be parsed as the specified type
if (strong_types.count(flag) > 0)
{
if (strong_types[flag] == typeid(std::string))
{
parameters[flag] = value;
i++;
continue;
}
}
2022-05-07 10:33:44 +02:00
// Is this a boolean?
if (value == "false" || value == "true")
{
parameters[flag] = (value == "true");
continue;
}
2022-02-21 23:32:11 +01:00
try // Attempt to parse it as a number
{
2024-03-13 20:18:59 +01:00
for (char &c : std::string(argv[i + 1]))
if (c < '0' || '9' < c)
if (c != '.' && c != 'e')
2024-03-14 20:21:35 +01:00
if (c != '-')
throw std::runtime_error("");
2024-03-13 20:18:59 +01:00
int points_cnt = 0;
for (char &c : std::string(argv[i + 1]))
if (c == '.')
points_cnt++;
if (points_cnt > 1)
throw std::runtime_error(""); // Numbers should not have more than one dot! If it does, probably an IP address
2022-02-21 23:32:11 +01:00
double val = std::stod(argv[i + 1]);
double integral, fractional = modf(val, &integral); // Split to fractional & integral parts
if (fractional != 0) // If this is not an integer, put it as a double
parameters[flag] = val;
else // Otherwse, cast to an integer
2022-10-20 00:15:06 +02:00
parameters[flag] = (long long)integral;
2022-02-21 23:32:11 +01:00
}
2024-03-13 20:18:59 +01:00
catch (std::exception &) // If it fails, parse to a string
2022-02-21 23:32:11 +01:00
{
parameters[flag] = value;
}
i++; // Skip the value
}
}
}
}
return parameters;
}