2022-07-26 02:57:57 +00:00
|
|
|
#pragma once
|
|
|
|
#include <vector>
|
2022-07-26 21:14:58 +00:00
|
|
|
#include <stdint.h>
|
2022-07-26 02:57:57 +00:00
|
|
|
|
|
|
|
namespace Cam
|
|
|
|
{
|
|
|
|
namespace Arguments
|
|
|
|
{
|
|
|
|
|
|
|
|
enum OPTTYPE
|
|
|
|
{
|
|
|
|
FLAG = 0,
|
|
|
|
STRING,
|
|
|
|
INT
|
|
|
|
};
|
|
|
|
|
|
|
|
class Option
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
Option(const char* name, const char* description, OPTTYPE type);
|
2022-07-26 21:14:58 +00:00
|
|
|
Option(const char* name, const char short_name, const char* description, OPTTYPE type);
|
|
|
|
Option(const char short_name, const char* description, OPTTYPE type);
|
2022-07-26 02:57:57 +00:00
|
|
|
bool found();
|
|
|
|
void* data;
|
|
|
|
private:
|
|
|
|
const char* m_name;
|
2022-07-26 21:14:58 +00:00
|
|
|
const char m_short_name;
|
2022-07-26 02:57:57 +00:00
|
|
|
const char* m_description;
|
|
|
|
OPTTYPE m_type;
|
|
|
|
bool m_found;
|
|
|
|
|
|
|
|
friend class Parser;
|
|
|
|
};
|
|
|
|
|
|
|
|
class PositionalArgument
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
PositionalArgument(const char* name, bool required, OPTTYPE type = STRING);
|
|
|
|
bool found();
|
|
|
|
void* data;
|
|
|
|
private:
|
|
|
|
const char* m_name;
|
|
|
|
OPTTYPE m_type;
|
|
|
|
bool m_req;
|
|
|
|
bool m_found;
|
|
|
|
|
|
|
|
friend class Parser;
|
|
|
|
};
|
|
|
|
|
|
|
|
class Parser
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
Parser(const char* program_name);
|
|
|
|
void set_description(const char* description);
|
|
|
|
void add_option(Option* opt);
|
|
|
|
void add_positional_argument(PositionalArgument* arg);
|
|
|
|
int parse(int argc, char** argv);
|
|
|
|
private:
|
2022-07-26 21:14:58 +00:00
|
|
|
int print_help_message();
|
|
|
|
int handle_long_option(const char* option, const char* next_value);
|
|
|
|
int handle_short_option(const char option, const char* next_value);
|
|
|
|
int handle_positional_argument(const char* arg);
|
|
|
|
int get_option_data(Option* opt, const char* data_str);
|
|
|
|
int unknown_option(const char* option);
|
|
|
|
int unknown_option(const char option);
|
|
|
|
int incorrect_type(const char* option, const char* got);
|
|
|
|
int missing_argument(const char* option);
|
|
|
|
int missing_positional_argument(const char* arg);
|
2022-07-26 02:57:57 +00:00
|
|
|
private:
|
|
|
|
const char* m_program_name;
|
|
|
|
const char* m_description;
|
2022-07-26 21:14:58 +00:00
|
|
|
const char** m_argv;
|
|
|
|
uint16_t m_opt_index;
|
|
|
|
uint16_t m_pos_index;
|
2022-07-26 02:57:57 +00:00
|
|
|
std::vector<Option*> m_options;
|
|
|
|
std::vector<PositionalArgument*> m_positional_args;
|
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace Arguments
|
|
|
|
} // namespace Cam
|