#pragma once #include "cmd/args/arg_generic.hpp" #include "cmd/args/arg_input.hpp" #include "util/input.hpp" namespace fsh{ class ArgManager { friend class ArgFactory; using PosArgs = std::vector >; using FlagOpts = std::unordered_map< std::string ,std::shared_ptr<_Argument> >; public: ArgManager() {} std::istream& get_input(const unsigned int id) { if(id < pos_argument.size()) return ArgInput::get(pos_argument[id]); return util::cin; } template std::optional get(const unsigned int id) { if((unsigned int) id < pos_argument.size()) return Argument::get(pos_argument[id]); return std::make_optional(); } template std::optional get(const std::string& id) { if(flags.find(id) != flags.end()) return Argument::get(flags[id]); return std::make_optional(); } bool get(const std::string& id) { return flags.find(id) != flags.end(); } void push_arg(std::shared_ptr<_Argument> arg) { pos_argument.push_back(arg); } void push_flag(const std::string &id,std::shared_ptr<_Argument> arg = nullptr) { flags[id] = arg; } private: PosArgs pos_argument; FlagOpts flags; }; }