#pragma once #include #include namespace os { class ArgumentParser { public: ArgumentParser(bool add_help = true); void add_description(StringView description); Result add_positional_argument(StringView& out, StringView name, bool required); Result add_positional_argument(StringView& out, StringView name, StringView fallback); Result add_switch_argument(bool& out, char short_flag, StringView long_flag, StringView help = {}); Result add_value_argument(StringView& out, char short_flag, StringView long_flag, bool value_required, StringView help = {}); Result add_value_argument(StringView& out, char short_flag, StringView long_flag, StringView fallback, StringView help = {}); Result> 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 usage(StringView program_name); void short_usage(StringView program_name); Vector m_positional_args; Vector m_switch_args; Vector m_value_args; StringView m_description = {}; bool m_add_short_help_flag { false }; bool m_add_long_help_flag { false }; }; }