#pragma once #include #include #include #include #include #include "ast/ast_component.hpp" #include "util/input.hpp" #include "cmd/args/arg_generic.hpp" #include "cmd/args/arg_input.hpp" #include "cmd/args/arg_manager.hpp" namespace fsh { class ArgFactory { public: using FlagNode = std::optional&; using ArgNodes = std::vector >; using BuildFunc = std::shared_ptr<_Argument> (*)(void); struct ArgRule { BuildFunc build; bool mandatory; bool extends; }; struct FlagRule { BuildFunc build; bool specialinput; //Not implemented bool capturing; bool extends; //Not implemented }; void add_input_rule() { has_input = true; pos_arg_rules.push_back({ &_Argument::create, false, false }); } template void add_rule(bool mandatory, bool extends = false) { pos_arg_rules.push_back({ &_Argument::create >, mandatory, extends }); } template void add_rule(const std::string name, bool capturing = false) { flag_rules[name] = { _Argument::create >, false, capturing, false }; } void parse(ArgManager& manager, ArgNodes& vec, FlagNode flag); bool ghas_input() { return has_input; } private: std::vector pos_arg_rules; std::unordered_map flag_rules; bool has_input = false; void parse_flag(ArgManager& manager, FlagNode flag); std::shared_ptr<_Argument> build_arg(BuildFunc build_func, const std::string& str); std::shared_ptr<_Argument> build_arg(BuildFunc build_func, std::shared_ptr cmd_arg); }; }