89 lines
3.4 KiB
C++
89 lines
3.4 KiB
C++
#include <sstream>
|
|
#include "argparse_util.hpp"
|
|
|
|
namespace argparse {
|
|
|
|
template<typename T, typename Converter>
|
|
std::shared_ptr<Argument> make_singlevalue_argument(ArgValue<T>& dest, std::string long_opt, std::string short_opt) {
|
|
auto ptr = std::make_shared<SingleValueArgument<T, Converter>>(dest, long_opt, short_opt);
|
|
|
|
//If the conversion object specifies a non-empty set of choices
|
|
//use those by default
|
|
auto default_choices = Converter().default_choices();
|
|
if (!default_choices.empty()) {
|
|
ptr->choices(default_choices);
|
|
}
|
|
|
|
return ptr;
|
|
}
|
|
|
|
template<typename T, typename Converter>
|
|
std::shared_ptr<Argument> make_multivalue_argument(ArgValue<T>& dest, std::string long_opt, std::string short_opt) {
|
|
auto ptr = std::make_shared<MultiValueArgument<T, Converter>>(dest, long_opt, short_opt);
|
|
|
|
//If the conversion object specifies a non-empty set of choices
|
|
//use those by default
|
|
auto default_choices = Converter().default_choices();
|
|
if (!default_choices.empty()) {
|
|
ptr->choices(default_choices);
|
|
}
|
|
|
|
return ptr;
|
|
}
|
|
|
|
/*
|
|
* ArgumentParser
|
|
*/
|
|
|
|
template<typename T, typename Converter>
|
|
Argument& ArgumentParser::add_argument(ArgValue<T>& dest, std::string option) {
|
|
return add_argument<T,Converter>(dest, option, std::string());
|
|
}
|
|
|
|
template<typename T, typename Converter>
|
|
Argument& ArgumentParser::add_argument(ArgValue<T>& dest, std::string long_opt, std::string short_opt) {
|
|
return argument_groups_[0].add_argument<T,Converter>(dest, long_opt, short_opt);
|
|
}
|
|
|
|
template<typename T, typename Converter>
|
|
Argument& ArgumentParser::add_argument(ArgValue<std::vector<T>>& dest, std::string option) {
|
|
return add_argument<T,Converter>(dest, option, std::string());
|
|
}
|
|
|
|
template<typename T, typename Converter>
|
|
Argument& ArgumentParser::add_argument(ArgValue<std::vector<T>>& dest, std::string long_opt, std::string short_opt) {
|
|
return argument_groups_[0].add_argument<T,Converter>(dest, long_opt, short_opt);
|
|
}
|
|
/*
|
|
* ArgumentGroup
|
|
*/
|
|
template<typename T, typename Converter>
|
|
Argument& ArgumentGroup::add_argument(ArgValue<T>& dest, std::string option) {
|
|
return add_argument<T,Converter>(dest, option, std::string());
|
|
}
|
|
|
|
template<typename T, typename Converter>
|
|
Argument& ArgumentGroup::add_argument(ArgValue<T>& dest, std::string long_opt, std::string short_opt) {
|
|
arguments_.push_back(make_singlevalue_argument<T,Converter>(dest, long_opt, short_opt));
|
|
|
|
auto& arg = arguments_[arguments_.size() - 1];
|
|
arg->group_name(name()); //Tag the option with the group
|
|
return *arg;
|
|
}
|
|
|
|
template<typename T, typename Converter>
|
|
Argument& ArgumentGroup::add_argument(ArgValue<std::vector<T>>& dest, std::string option) {
|
|
return add_argument<T,Converter>(dest, option, std::string());
|
|
}
|
|
|
|
template<typename T, typename Converter>
|
|
Argument& ArgumentGroup::add_argument(ArgValue<std::vector<T>>& dest, std::string long_opt, std::string short_opt) {
|
|
arguments_.push_back(make_multivalue_argument<std::vector<T>,Converter>(dest, long_opt, short_opt));
|
|
|
|
auto& arg = arguments_[arguments_.size() - 1];
|
|
arg->group_name(name()); //Tag the option with the group
|
|
return *arg;
|
|
}
|
|
|
|
} //namespace
|