Luna/libos/include/os/ArgumentParser.h

64 lines
1.9 KiB
C
Raw Normal View History

#pragma once
#include <luna/StringView.h>
#include <luna/Vector.h>
namespace os
{
class ArgumentParser
{
public:
ArgumentParser(bool add_help = true);
void add_description(StringView description);
Result<void> add_positional_argument(StringView& out, StringView name, bool required);
Result<void> add_positional_argument(StringView& out, StringView name, StringView fallback);
Result<void> add_switch_argument(bool& out, char short_flag, StringView long_flag, StringView help = {});
Result<void> add_value_argument(StringView& out, char short_flag, StringView long_flag, bool value_required,
StringView help = {});
Result<void> add_value_argument(StringView& out, char short_flag, StringView long_flag, StringView fallback,
StringView help = {});
Result<Vector<StringView>> parse(int argc, char* const* argv);
private:
struct PositionalArgument
{
StringView* out;
StringView name;
bool required;
StringView fallback;
};
struct SwitchArgument
{
bool* out;
char short_flag;
StringView long_flag;
StringView help;
};
struct ValueArgument
{
StringView* out;
char short_flag;
StringView long_flag;
bool required;
StringView fallback;
StringView help;
};
Result<void> usage(StringView program_name);
void short_usage(StringView program_name);
Vector<PositionalArgument> m_positional_args;
Vector<SwitchArgument> m_switch_args;
Vector<ValueArgument> m_value_args;
StringView m_description = {};
bool m_add_short_help_flag { false };
bool m_add_long_help_flag { false };
};
}