#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); }; }