This repository has been archived on 2021-06-27. You can view files and clone it, but cannot push or open issues or pull requests.
modetw/src/query.cpp

117 lines
2.6 KiB
C++

#include "../include/query.hpp"
template <>
Query<bool>::Query(const std::string &query)
: _query(std::move(query)) {}
template <>
Query<int>::Query(const std::string &query, char *list)
: _query(std::move(query)), _list(std::move(list)) {}
template <>
Query<std::string>::Query(const std::string &query, char *list)
: _query(std::move(query)), _list(std::move(list)) {}
/*template <class OUTPUT>
OUTPUT Query<OUTPUT>::execute()
{
switch (_qf)
{
case BOOL: return _bool();
case STRING: return _string();
case INT: return _int();
default:
throw ExceptionHandler(CUSTOM_ERROR, "No flag set for query.");
}
}*/
template <>
bool Query<bool>::execute(const rapidjson::Document &cfg) const
{
char in;
do
{
std::cout << _query << " [Y/n] ";
std::cin.get(in);
switch (in)
{
case 'N':
case 'n': std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); return false;
case 'Y':
case 'y': std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
case '\n': return true;
default:
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cerr << "ERROR: \"" << in << "\" is not a valid input!\n";
}
} while (true);
}
template <>
std::string Query<std::string>::execute(const rapidjson::Document &cfg) const
{
std::string input;
do
{
std::cout << _query << " [enter q to quit]" << "\n";
std::cin.clear();
std::cout << ">>> ";
std::getline(std::cin, input);
if (input == "q" || input == "q\n") { exit(0); }
for (rapidjson::SizeType i = 0; i < cfg[_list].Size(); i++)
{
if (input == cfg[_list][i].GetString())
{
return std::move(input);
}
}
std::cout << "Error! \"" << input << "\" not found in " << _list << " list!" << "\n";
} while (true);
}
template <>
int Query<int>::execute(const rapidjson::Document &cfg) const
{
char input;
int output;
do
{
std::cout << "\n" << _query;
for (rapidjson::SizeType i = 0; i < cfg[_list].Size(); i++)
{
std::cout << " [" << (i+1) << "] " << cfg[_list][i]["name"].GetString();
}
std::cout << " [press q to exit]" << "\n";
std::cout << ">>> ";
std::cin.get(input);
output = input - '0';
if (input == 'q')
{
exit(0);
}
if (output < 1 || output > static_cast<int>(cfg[_list].Size()))
{
std::cout << "Error! \"" << input << "\" is not a valid input." << "\n";
}
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
} while (output < 1 || output > static_cast<int>(cfg[_list].Size()));
return output;
}