summaryrefslogtreecommitdiff
path: root/Libraries/LibCore/CArgsParser.h
diff options
context:
space:
mode:
Diffstat (limited to 'Libraries/LibCore/CArgsParser.h')
-rw-r--r--Libraries/LibCore/CArgsParser.h69
1 files changed, 69 insertions, 0 deletions
diff --git a/Libraries/LibCore/CArgsParser.h b/Libraries/LibCore/CArgsParser.h
new file mode 100644
index 0000000000..6a696054e2
--- /dev/null
+++ b/Libraries/LibCore/CArgsParser.h
@@ -0,0 +1,69 @@
+#pragma once
+
+#include <AK/AKString.h>
+#include <AK/HashMap.h>
+#include <AK/Vector.h>
+
+/*
+ The class ArgsParser provides a way to parse arguments by using a given list that describes the possible
+ types of arguments (name, description, required or not, must be followed by a value...).
+ Call the add_arg() functions to describe your arguments.
+
+ The class ArgsParserResult is used to manipulate the arguments (checking if an arg has been provided,
+ retrieve its value...). In case of error (missing required argument) an empty structure is returned as result.
+*/
+
+class CArgsParserResult {
+public:
+ bool is_present(const String& arg_name) const;
+ String get(const String& arg_name) const;
+ const Vector<String>& get_single_values() const;
+
+private:
+ HashMap<String, String> m_args;
+ Vector<String> m_single_values;
+
+ friend class CArgsParser;
+};
+
+class CArgsParser {
+public:
+ CArgsParser(const String& program_name);
+
+ CArgsParserResult parse(int argc, char** argv);
+
+ void add_required_arg(const String& name, const String& description);
+ void add_required_arg(const String& name, const String& value_name, const String& description);
+ void add_arg(const String& name, const String& description);
+ void add_arg(const String& name, const String& value_name, const String& description);
+ void add_single_value(const String& name);
+ void add_required_single_value(const String& name);
+ String get_usage() const;
+ void print_usage() const;
+
+private:
+ struct Arg {
+ inline Arg() {}
+ Arg(const String& name, const String& description, bool required);
+ Arg(const String& name, const String& value_name, const String& description, bool required);
+
+ String name;
+ String description;
+ String value_name;
+ bool required;
+ };
+
+ int parse_next_param(int index, char** argv, const int params_left, CArgsParserResult& res);
+ bool is_param_valid(const String& param_name);
+ bool check_required_args(const CArgsParserResult& res);
+
+ String m_program_name;
+ String m_prefix;
+
+ struct SingleArg {
+ String name;
+ bool required;
+ };
+ Vector<SingleArg> m_single_args;
+ HashMap<String, Arg> m_args;
+};