25 #include "rapidjson/document.h" 26 #include "rapidjson/writer.h" 27 #include "rapidjson/stringbuffer.h" 53 cout <<
"EXCEPTION: Oops, " << excpt
54 <<
". Please try again." << endl;
67 "Does not":"really matter what is in here." 77 "usage":"Enter json command in 'command':'<command>','payload': { // json payload of arguments }" 95 "reason":"Exiting program on user request." 111 "command": "sum_ints", 120 "command": "sum_ints", 122 "addends": [1, 2, 3, 4, 5, 100, 999999999, -1, 0, -999] 129 "command": "sum_ints", 131 "addends": [1, 2, 3, 4.5, 5.0, 100.1, 999999999.1, -1.1, 0, -999.1] 138 "command": "sum_ints", 140 "addends": ["apples", "oranges", "turtles"] 147 "command": "sum_ints", 157 "command": "mean_ints", 159 "addends": [1, 2, 3, 4, 5] 166 "command": "mean_ints", 175 "command": "mean_ints", 177 "addends": [1, 2, 3, 4, 5, 100, 999999999, -1, 0, -999] 186 "command": "query_payload", 203 "command": "query_payload", 235 bool help(rapidjson::Value &payload)
237 cout <<
"Controller::help: command: \n";
240 rapidjson::Value::ConstMemberIterator itr = payload.FindMember(
"usage");
243 if (itr != payload.MemberEnd()) {
246 cout << itr->value.GetString() << endl;
250 throw "no member \"usage\" present in payload JSON";
266 bool exit(rapidjson::Value &payload)
268 cout <<
"Controller::exit: command: \n";
271 rapidjson::Value::ConstMemberIterator itr = payload.FindMember(
"reason");
274 if (itr != payload.MemberEnd()) {
277 cout << itr->value.GetString() << endl;
285 throw "no member \"reason\" present in payload JSON";
308 cout <<
"Controller::payload_type command: \n";
311 static const char* kTypeNames[] = {
321 for (Value::ConstMemberIterator itr = payload.MemberBegin();
322 itr != payload.MemberEnd(); ++itr) {
324 cout <<
"Type of member " << itr->name.GetString()
325 <<
" is " << kTypeNames[itr->value.GetType()] << endl;
350 cout <<
"Controller::sum_ints command: \n";
353 rapidjson::Value::ConstMemberIterator itr = payload.FindMember(
"addends");
356 if ( itr != payload.MemberEnd( )) {
363 const Value& a = payload[
"addends"];
367 throw "payload value \"addends\" is not an array";
370 for (
auto& v : a.GetArray() ) {
378 throw "no integers in array";
381 vector<int> int_vect;
382 int_vect.reserve(num_ints);
387 for (
auto& v : a.GetArray()) {
391 int_vect.push_back(v.GetInt());
395 sum_i = summation(int_vect);
397 cout << sum_i << endl;
402 throw "no member \"addends\" present in payload JSON";
431 cout <<
"Controller::mean_ints command: \n";
434 rapidjson::Value::ConstMemberIterator itr = payload.FindMember(
"addends");
437 if ( itr != payload.MemberEnd() ) {
444 const Value& a = payload[
"addends"];
448 throw "payload value \"addends\" is not an array";
451 for (
auto& v : a.GetArray() ) {
459 throw "no integers in array";
462 vector<int> int_vect;
463 int_vect.reserve(num_ints);
468 for (
auto& v : a.GetArray() ) {
472 int_vect.push_back(v.GetInt());
475 sum_i = summation(int_vect);
478 cout << (sum_i/num_ints) << endl;
482 throw "no member \"addends\" present in payload JSON";
517 for (
auto& num : collection) {
580 cout <<
"CommandDispatcher: addCommandHandler: " << command << std::endl;
582 bool add_succeeded =
true;
585 auto test = command_handlers_.insert( std::make_pair( command, handler));
588 if( test.second ==
false) {
589 cout <<
"Command " << command <<
" already existed. Addition failed" << endl;
590 add_succeeded =
false;
594 cout <<
"Command " << command <<
" added to map." << endl;
598 return add_succeeded;
618 cout <<
"\n\nCOMMAND: " << command_json << endl;
621 const char *command_ptr = command_json.c_str();
624 this->doc.Parse(command_ptr);
627 if( this->doc.HasParseError() )
628 throw "malformed JSON";
631 rapidjson::Value::ConstMemberIterator itr_c = this->doc.FindMember(
"command");
632 rapidjson::Value::ConstMemberIterator itr_p = this->doc.FindMember(
"payload");
636 if (itr_c != this->doc.MemberEnd()) {
639 cout <<
"found command: " << itr_c->value.GetString() << endl;
644 throw "no member \"command\" present in JSON";
649 if (itr_p != this->doc.MemberEnd()) {
654 Writer<StringBuffer> writer(buffer);
655 itr_p->value.Accept(writer);
657 cout <<
"found payload: " << buffer.GetString() << endl;
662 throw "no member \"payload\" present in JSON";
667 bool command_found =
false;
668 for( this->map_itr = command_handlers_.begin() ;
669 this->map_itr != command_handlers_.end(); this->map_itr++ ) {
672 if( itr_c->value.GetString() == (*map_itr).first ) {
675 cout << itr_c->value.GetString() <<
" matched a value in map!" << endl
676 <<
"Attempting to start command handler" << endl;
679 command_found =
true;
682 (*map_itr).second(this->doc[
"payload"]);
689 if ( ! command_found) {
690 throw "no match for command found in map";
693 return command_found;
698 std::map<std::string, CommandHandler> command_handlers_;
700 std::map<std::string, CommandHandler>::iterator map_itr =
701 this->command_handlers_.begin();
703 rapidjson::Document doc;
720 std::cout <<
"COMMAND DISPATCHER: STARTED" << std::endl;
729 using namespace placeholders;
758 string test_commands[] = {
787 for (
auto& com : test_commands) {
793 catch (
const char* excpt) {
804 cout <<
"COMMANDS: {\"command\":\"exit\", \"payload\":{\"reason\":\"User requested exit.\"}}\n";
805 cout <<
"\tenter command : ";
806 getline(cin, command);
810 catch (
const char* excpt) {
815 std::cout <<
"COMMAND DISPATCHER: ENDED" << std::endl;
controller class of functions to "dispatch" from Command Dispatcher
bool query_payload(rapidjson::Value &payload)
command handler for query_payload
void exceptionPrinter(const char *excpt)
EXCEPTION HANDLER function.
bool VERBOSE
turn on verbose messages
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 TEST_ALL
test all functionality before prompting user
bool dispatchCommand(std::string command_json)
initial receiver of command
bool exit(rapidjson::Value &payload)
command handler for exit
std::function< bool(rapidjson::Value &)> CommandHandler
std::function< bool(rapidjson::Value &)> CommandHandler
auto mean_command_fraction
auto query_payload_command_2
bool addCommandHandler(std::string command, CommandHandler handler)
adds a command and handler pair to the map
auto query_payload_command
static auto summation(vector< T > collection) -> T
summation function for sum_ints() and mean_ints()