Files
fsh-oop/include/cmd/args/arg_manager.hpp

42 lines
1.3 KiB
C++

#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<std::shared_ptr<_Argument> >;
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 <typename T>
std::optional<T> get(const unsigned int id) {
if ((unsigned int)id < pos_argument.size()) return Argument<T>::get(pos_argument[id]);
return std::make_optional<T>();
}
template <typename T>
std::optional<T> get(const std::string& id) {
if (flags.find(id) != flags.end()) return Argument<T>::get(flags[id]);
return std::make_optional<T>();
}
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;
};
}