Advertisement
Fiskmans

Untitled

Mar 21st, 2019
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.42 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include "DataReader.hpp"
  3. #include <fstream>
  4. #include <sstream>
  5.  
  6. #pragma region Helper Functions
  7.  
  8.  
  9. std::string ReadWholeFile(std::string aPath)
  10. {
  11.     if (aPath.empty())
  12.     {
  13.         ////std::cout << "trying to open empty path" << std::endl;
  14.         return "{}";
  15.     }
  16.     std::stringstream out;
  17.     std::string buff;
  18.     std::ifstream stream;
  19.     stream.open(aPath);
  20.     if (stream.fail())
  21.     {
  22.         ////std::cout << "file does not exist: " << aPath.c_str() << std::endl;
  23.         return "{}";
  24.     }
  25.  
  26.     while (std::getline(stream, buff))
  27.     {
  28.         out << buff;
  29.     }
  30.     stream.close();
  31.     return out.str();
  32. }
  33. std::string translateJsonErrors(rapidjson::ParseErrorCode aCode)
  34. {
  35.     std::stringstream out;
  36.     do
  37.     {
  38.         if (aCode & rapidjson::ParseErrorCode::kParseErrorDocumentEmpty != 0)
  39.         {
  40.             out << "document empty \n";
  41.         }
  42.         if (aCode & rapidjson::ParseErrorCode::kParseErrorArrayMissCommaOrSquareBracket != 0)
  43.         {
  44.             out << "missing , or [ or ]\n";
  45.         }
  46.         if (aCode & rapidjson::ParseErrorCode::kParseErrorDocumentRootNotSingular != 0)
  47.         {
  48.             out << "ducument has more than one root\n";
  49.         }
  50.         if (aCode & rapidjson::ParseErrorCode::kParseErrorNone != 0)
  51.         {
  52.             out << "No error\n";
  53.         }
  54.         if (aCode & rapidjson::ParseErrorCode::kParseErrorNumberMissExponent != 0)
  55.         {
  56.             out << "number missing exponent\n";
  57.         }
  58.         if (aCode & rapidjson::ParseErrorCode::kParseErrorNumberMissFraction != 0)
  59.         {
  60.             out << "number missing fraction\n";
  61.         }
  62.         if (aCode & rapidjson::ParseErrorCode::kParseErrorNumberTooBig != 0)
  63.         {
  64.             out << "number too big\n";
  65.         }
  66.         if (aCode & rapidjson::ParseErrorCode::kParseErrorObjectMissColon != 0)
  67.         {
  68.             out << "object missing ,\n";
  69.         }
  70.         if (aCode & rapidjson::ParseErrorCode::kParseErrorObjectMissCommaOrCurlyBracket != 0)
  71.         {
  72.             out << "object missing , or { or }\n";
  73.         }
  74.         if (aCode & rapidjson::ParseErrorCode::kParseErrorObjectMissName != 0)
  75.         {
  76.             out << "object missing name\n";
  77.         }
  78.         if (aCode & rapidjson::ParseErrorCode::kParseErrorStringEscapeInvalid != 0)
  79.         {
  80.             out << "invalid excape character\n";
  81.         }
  82.         if (aCode & rapidjson::ParseErrorCode::kParseErrorStringInvalidEncoding != 0)
  83.         {
  84.             out << "invalid encoding (What in the hell did you do!?)\n";
  85.         }
  86.         if (aCode & rapidjson::ParseErrorCode::kParseErrorStringMissQuotationMark != 0)
  87.         {
  88.             out << "missing \"\n";
  89.         }
  90.         if (aCode & rapidjson::ParseErrorCode::kParseErrorStringUnicodeEscapeInvalidHex != 0)
  91.         {
  92.             out << "invalid hexcode escape\n";
  93.         }
  94.         if (aCode & rapidjson::ParseErrorCode::kParseErrorStringUnicodeSurrogateInvalid != 0)
  95.         {
  96.             out << "invalid unicode surrogate (i'm.. i.. don't know)\n";
  97.         }
  98.         if (aCode & rapidjson::ParseErrorCode::kParseErrorTermination != 0)
  99.         {
  100.             out << "Terminated\n";
  101.         }
  102.         if (aCode & rapidjson::ParseErrorCode::kParseErrorUnspecificSyntaxError != 0)
  103.         {
  104.             out << "unspecific syntac error\n";
  105.         }
  106.         if (aCode & rapidjson::ParseErrorCode::kParseErrorValueInvalid != 0)
  107.         {
  108.             out << "invalid value\n";
  109.         }
  110.     } while (false); // quick return
  111.  
  112.     return out.str();
  113. }
  114. void ParseFile(const char * aFile, rapidjson::Document& aDocument)
  115. {
  116.     aDocument.Parse(ReadWholeFile(aFile).c_str());
  117.     if (aDocument.HasParseError())
  118.     {
  119.         std::cout << "Parse error(s)! in " << aFile << std::endl;
  120.         rapidjson::ParseErrorCode errCode = aDocument.GetParseError();
  121.     }
  122. }
  123. #pragma endregion
  124.  
  125.  
  126.  
  127.  
  128. std::ostream& operator<<(std::ostream& aStream, std::string& aString)
  129. {
  130.     return aStream << aString.c_str();
  131. }
  132.  
  133.  
  134.  
  135. std::vector<TypedInterface*> DataReader::myLinks;
  136.  
  137. void DataReader::CleanUp()
  138. {
  139.     for (auto link : myLinks)
  140.     {
  141.         delete link;
  142.     }
  143. }
  144.  
  145. TypedInterface* DataReader::FindMatchingLink(std::string aKey)
  146. {
  147.     for (auto link : myLinks)
  148.     {
  149.         if (link->myPath == aKey)
  150.         {
  151.             return link;
  152.         }
  153.     }
  154.     return nullptr;
  155. }
  156.  
  157. void DataReader::ResetTagged()
  158. {
  159.     for (auto link : myLinks)
  160.     {
  161.         link->myHasBeenAssigned = false;
  162.     }
  163. }
  164.  
  165. void DataReader::LogMissedValues()
  166. {
  167.     for (auto link : myLinks)
  168.     {
  169.         if (!link->myHasBeenAssigned)
  170.         {
  171.             std::cout << link->myPath << " was not assigned from json" << std::endl;
  172.         }
  173.     }
  174. }
  175.  
  176. void DataReader::AssignToValues(rapidjson::Value& aValue,std::string aName)
  177. {
  178.     auto it = aValue.MemberBegin();
  179.     while (it != aValue.MemberEnd())
  180.     {
  181.         std::string compoundName = aName + (aName.empty() ? "" : "/") + it->name.GetString();
  182.  
  183.         if (it->value.IsObject())
  184.         {
  185.             AssignToValues(it->value, compoundName);
  186.             it++;
  187.             continue;
  188.         }
  189.         TypedInterface* link = FindMatchingLink(compoundName);
  190.  
  191.         if (link)
  192.         {
  193.             link->Load(it->value);
  194.         }
  195.         else
  196.         {
  197.             std::cout << "the value " << compoundName << " is not loaded in code" << std::endl;
  198.         }
  199.         it++;
  200.     }
  201. }
  202.  
  203. void DataReader::Load(const char * aPath)
  204. {
  205.     rapidjson::Document doc;
  206.     ParseFile(aPath, doc);
  207.     ResetTagged();
  208.     AssignToValues(doc);
  209.     LogMissedValues();
  210. }
  211.  
  212. DataReader::DataReader()
  213. {
  214. }
  215.  
  216.  
  217. DataReader::~DataReader()
  218. {
  219. }
  220.  
  221.  
  222. Data::Data(const char * aPath) : myPath(aPath)
  223. {
  224. }
  225.  
  226. Data::Data(std::string aString) : Data(aString.c_str())
  227. {
  228. }
  229.  
  230. const char * DataReader::JsonTypeToString(rapidjson::Type aType)
  231. {
  232.     switch (aType)
  233.     {
  234.     case rapidjson::kNullType:
  235.         return "Null";
  236.     case rapidjson::kFalseType:
  237.         return "False";
  238.     case rapidjson::kTrueType:
  239.         return "True";
  240.     case rapidjson::kObjectType:
  241.         return "Object";
  242.     case rapidjson::kArrayType:
  243.         return "Array";
  244.     case rapidjson::kStringType:
  245.         return "String";
  246.     case rapidjson::kNumberType:
  247.         return "Number";
  248.     default:
  249.         break;
  250.     }
  251.     return nullptr;
  252. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement