Scoping out ArgsParser class.

This commit is contained in:
2025-07-03 01:18:22 -04:00
parent fe0e9c4f41
commit 0badef2ccd
4 changed files with 259 additions and 0 deletions

106
src/ArgsParser.cpp Normal file
View File

@@ -0,0 +1,106 @@
#include <ArgsParser.hpp>
#include <algorithm>
ArgsParser::ArgsParser(int argc, char **argv, bool keep_program_name) {
args = std::vector<std::string>(argv, argv+argc);
}
bool ArgsParser::has_next() const {
return !args.empty();
}
std::string ArgsParser::get_next() const {
return args[0];
}
std::string ArgsParser::consume_next() {
std::string value = args[0];
args.erase(args.begin());
return value;
}
bool ArgsParser::has_flag(const std::string &option) {
return std::ranges::find(args, option) != args.end();
}
bool ArgsParser::has_flag(const std::initializer_list<std::string> &flags) {
for (auto& flag : flags)
if (has_flag(flag))
return true;
return false;
}
bool ArgsParser::consume_flag(const std::string &option) {
if (has_flag(option)) {
args.erase(std::remove(args.begin(), args.end(), option), args.end());
return true;
}
return false;
}
bool ArgsParser::consume_flag(const std::initializer_list<std::string> &flags) {
bool had_any_flag = false;
for (auto& flag : flags) {
if (has_flag(flags)) {
had_any_flag = true;
args.erase(std::remove(args.begin(), args.end(), flag), args.end());
}
}
return had_any_flag;
}
bool ArgsParser::has_flag_arg(const std::string &option) {
if (has_flag(option)) {
auto it = std::ranges::find(args, option);
return it!=args.end() && ++it!=args.end();
}
}
std::optional<std::string> ArgsParser::get_flag_arg(const std::string &option) {
auto it = std::ranges::find(args, option);
++it;
return *it;
}
std::optional<std::string> ArgsParser::consume_flag_arg(const std::string &flag) {
}
std::tuple<bool, std::string> ArgsParser::consume_flag_arg(const std::initializer_list<std::string> &flags) {
}
std::vector<std::string> ArgsParser::get_remaining_args() const {
return args;
}
bool ArgsParser::has_flag_contains(const std::string &match) {
for (auto& token : args) {
if (token.find(match) != std::string::npos)
return true;
}
return false;
}
bool ArgsParser::has_flag_starts_with(const std::string &value) const {
for (auto& token : args) {
if (token.starts_with(value))
return true;
}
return false;
}
std::string ArgsParser::get_flag_starts_with(const std::string &prefix) const {
for (auto& token : this->args) {
if (token.starts_with(prefix))
return token;
}
}