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