25 #include "rapidjson/document.h" 26 #include "rapidjson/writer.h" 27 #include "rapidjson/stringbuffer.h" 56 std::cerr <<
"***\tDEBUG from " <<
id <<
": " 57 << msg <<
" \t***" << std::endl;
71 cout <<
"EXCEPTION: Oops, " << excpt
72 <<
". Please try again." << endl;
85 "Does not":"really matter what is in here." 95 "usage":"Enter json command in 'command':'<command>','payload': { // json payload of arguments }" 104 "reason":"Not usage." 113 "reason":"Exiting program on user request." 129 "command": "sum_ints", 138 "command": "sum_ints", 140 "addends": [1, 2, 3, 4, 5, 100, 999999999, -1, 0, -999] 147 "command": "sum_ints", 149 "addends": [1, 2, 3, 4.5, 5.0, 100.1, 999999999.1, -1.1, 0, -999.1] 156 "command": "sum_ints", 158 "addends": ["apples", "oranges", "turtles"] 165 "command": "sum_ints", 175 "command": "mean_ints", 177 "addends": [1, 2, 3, 4, 5] 184 "command": "mean_ints", 193 "command": "mean_ints", 195 "addends": [1, 2, 3, 4, 5, 100, 999999999, -1, 0, -999] 202 "command": "query_payload", 234 bool help(rapidjson::Value &payload)
236 cout <<
"Controller::help: command: \n";
239 rapidjson::Value::ConstMemberIterator itr = payload.FindMember(
"usage");
242 if (itr != payload.MemberEnd()) {
245 cout << itr->value.GetString() << endl;
249 throw "no member \"usage\" present in payload JSON";
265 bool exit(rapidjson::Value &payload)
267 cout <<
"Controller::exit: command: \n";
270 rapidjson::Value::ConstMemberIterator itr = payload.FindMember(
"reason");
273 if (itr != payload.MemberEnd()) {
276 cout << itr->value.GetString() << endl;
284 throw "no member \"reason\" present in payload JSON";
307 cout <<
"Controller::payload_type command: \n";
310 static const char* kTypeNames[] = {
320 for (Value::ConstMemberIterator itr = payload.MemberBegin();
321 itr != payload.MemberEnd(); ++itr) {
323 cout <<
"Type of member " << itr->name.GetString()
324 <<
" is " << kTypeNames[itr->value.GetType()] << endl;
349 cout <<
"Controller::sum_ints command: \n";
352 rapidjson::Value::ConstMemberIterator itr = payload.FindMember(
"addends");
355 if ( itr != payload.MemberEnd( )) {
362 const Value& a = payload[
"addends"];
366 throw "payload value \"addends\" is not an array";
369 for (
auto& v : a.GetArray() ) {
377 throw "no integers in array";
380 vector<int> int_vect;
381 int_vect.reserve(num_ints);
386 for (
auto& v : a.GetArray()) {
390 int_vect.push_back(v.GetInt());
395 cerr <<
"Made it past for loop in the int try" << endl;
397 sum_i = summation(int_vect);
399 cout << sum_i << endl;
404 throw "no member \"addends\" present in payload JSON";
433 cout <<
"Controller::mean_ints command: \n";
436 rapidjson::Value::ConstMemberIterator itr = payload.FindMember(
"addends");
439 if ( itr != payload.MemberEnd() ) {
446 const Value& a = payload[
"addends"];
450 throw "payload value \"addends\" is not an array";
453 for (
auto& v : a.GetArray() ) {
461 throw "no integers in array";
464 vector<int> int_vect;
465 int_vect.reserve(num_ints);
470 for (
auto& v : a.GetArray() ) {
474 int_vect.push_back(v.GetInt());
478 cerr <<
"Made it past for loop in the int try" << endl;
480 sum_i = summation(int_vect);
483 cout << (sum_i/num_ints) << endl;
487 throw "no member \"addends\" present in payload JSON";
523 for (
auto& num : collection) {
589 cout <<
"CommandDispatcher: addCommandHandler: " << command << std::endl;
591 bool add_succeeded =
true;
594 auto test = command_handlers_.insert( std::make_pair( command, handler));
597 if( test.second ==
false) {
598 cout <<
"Command " << command <<
" already existed. Addition failed" << endl;
599 add_succeeded =
false;
603 cout <<
"Command " << command <<
" added to map." << endl;
607 return add_succeeded;
627 cout <<
"\n\nCOMMAND: " << command_json << endl;
629 debugPrinter(this->CUR_SCOPE,
"made it to dispatchCommand");
632 const char *command_ptr = command_json.c_str();
634 debugPrinter(this->CUR_SCOPE,
"made it past command_ptr");
640 this->doc.Parse(command_ptr);
642 debugPrinter(this->CUR_SCOPE,
"made it past doc.Parse");
645 if( this->doc.HasParseError() )
646 throw "malformed JSON";
649 debugPrinter(this->CUR_SCOPE,
"made it past doc.HasParseError");
653 rapidjson::Value::ConstMemberIterator itr_c = this->doc.FindMember(
"command");
654 rapidjson::Value::ConstMemberIterator itr_p = this->doc.FindMember(
"payload");
658 if (itr_c != this->doc.MemberEnd()) {
663 cout <<
"found command: " << itr_c->value.GetString() << endl;
668 throw "no member \"command\" present in JSON";
673 if (itr_p != this->doc.MemberEnd()) {
680 Writer<StringBuffer> writer(buffer);
681 itr_p->value.Accept(writer);
683 cout <<
"found payload: " << buffer.GetString() << endl;
688 throw "no member \"payload\" present in JSON";
693 debugPrinter(this->CUR_SCOPE,
"made it past iterators");
696 bool command_found =
false;
697 for( this->map_itr = command_handlers_.begin() ;
698 this->map_itr != command_handlers_.end(); this->map_itr++ ) {
701 if( itr_c->value.GetString() == (*map_itr).first ) {
704 cout << itr_c->value.GetString() <<
" matched a value in map!" << endl
705 <<
"Attempting to start command handler" << endl;
708 command_found =
true;
711 (*map_itr).second(this->doc[
"payload"]);
718 if ( ! command_found) {
720 debugPrinter(this->CUR_SCOPE,
"made it into ! command_found if");
722 throw "no match for command found in map";
725 return command_found;
730 std::string CUR_SCOPE =
"class CommandDispatcher";
734 std::map<std::string, CommandHandler>::iterator map_itr =
736 this->command_handlers_.begin();
755 std::cout <<
"COMMAND DISPATCHER: STARTED" << std::endl;
764 using namespace placeholders;
793 string test_commands[] = {
821 for (
auto& com : test_commands) {
827 catch (
const char* excpt) {
838 cout <<
"COMMANDS: {\"command\":\"exit\", \"payload\":{\"reason\":\"User requested exit.\"}}\n";
839 cout <<
"\tenter command : ";
840 getline(cin, command);
844 catch (
const char* excpt) {
849 std::cout <<
"COMMAND DISPATCHER: ENDED" << std::endl;
controller class of functions to "dispatch" from Command Dispatcher
bool VERBOSE
turn on verbose messages
void debugPrinter(std::string id, std::string msg)
DEBUG PRINTER function.
bool query_payload(rapidjson::Value &payload)
command handler for query_payload
auto query_payload_command
bool sum_ints(rapidjson::Value &payload)
command handler for sum_ints
bool help(rapidjson::Value &payload)
command handler for help
virtual ~CommandDispatcher()
bool mean_ints(rapidjson::Value &payload)
command handler for mean_ints
bool DEBUG
turn on debug messages
bool dispatchCommand(std::string command_json)
initial receiver of command
bool TEST_ALL
test all functionality before prompting user
bool exit(rapidjson::Value &payload)
command handler for exit
std::function< bool(rapidjson::Value &)> CommandHandler
bool addCommandHandler(std::string command, CommandHandler handler)
adds a command and handler pair to the map
void exceptionPrinter(const char *excpt)
EXCEPTION HANDLER function.
static auto summation(vector< T > collection) -> T
summation function for sum_ints() and mean_ints()
std::map< std::string, CommandHandler > command_handlers_
map of command handlers
auto mean_command_fraction