main.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. /**
  2. * main.cpp for jsonstroller
  3. *
  4. * Author: isundil <isundill@gmail.com>
  5. **/
  6. #include <iostream>
  7. #include <locale.h>
  8. #include "streamConsumer.hh"
  9. #include "curseSplitOutput.hh"
  10. #include "curseSimpleOutput.hh"
  11. #include "params.hh"
  12. #include "jsonException.hh"
  13. void displayException(const std::string &filename, const Params &params, const std::string &type, const JsonException &e)
  14. {
  15. const std::string buffer = e.getHistory();
  16. std::cerr << params.getProgName() << ": " << filename << " [" << type << "] at line " << e.currentLine() << ", " << e.currentCol() << " (" << e.what() << ") while reading" << std::endl;
  17. std::cerr << buffer << std::endl << std::string(buffer.size() -1, '~') << '^' << std::endl;
  18. }
  19. StreamConsumer *readFile(std::pair<std::string, std::basic_istream<char>*> input, const Params &params)
  20. {
  21. StreamConsumer *stream = new StreamConsumer(*(input.second));
  22. stream->withConfig(&params);
  23. stream->read();
  24. if (!stream->getRoot())
  25. throw EofException();
  26. return stream;
  27. }
  28. void runDiff(const Params &params)
  29. {
  30. const IndexedDeque inputs = params.getInputs();
  31. const size_t nbInputs = inputs.size();
  32. std::set<StreamConsumer *> streams;
  33. std::deque<JSonElement *> roots;
  34. std::deque<Warning> warns;
  35. std::deque<std::string> inputNames;
  36. if (!params.isIgnoringUnicode())
  37. setlocale(LC_ALL, "");
  38. for (std::pair<std::string, std::basic_istream<char>*> input : inputs)
  39. {
  40. StreamConsumer *stream;
  41. inputNames.push_back(input.first);
  42. try
  43. {
  44. stream = readFile(input, params);
  45. }
  46. catch (EofException &e)
  47. {
  48. std::cerr << params.getProgName() << ": " << input.first << " " << Warning::getType(e) << " (" << e.what() << ") error while reading" << std::endl;
  49. delete stream;
  50. stream = nullptr;
  51. }
  52. catch (JsonException &e)
  53. {
  54. std::cerr << "Error: ";
  55. displayException(input.first, params, Warning::getType(e), e);
  56. delete stream;
  57. stream = nullptr;
  58. }
  59. for (Warning w : stream->getMessages())
  60. {
  61. w.filename(input.first);
  62. warns.push_back(Warning(w));
  63. }
  64. roots.push_back(stream->getRoot());
  65. streams.insert(stream);
  66. }
  67. if (streams.size() == nbInputs)
  68. {
  69. CurseSplitOutput out(params);
  70. out.run(inputNames, roots);
  71. }
  72. for (StreamConsumer *stream: streams)
  73. delete stream;
  74. for (Warning w : warns)
  75. {
  76. std::cerr << "Warning: ";
  77. displayException(w.filename(), params, w.getType(), w());
  78. }
  79. }
  80. void run(const Params &params)
  81. {
  82. IndexedDeque inputs = params.getInputs();
  83. CurseSimpleOutput *out = new CurseSimpleOutput(params);
  84. std::list<Warning> warns;
  85. if (!params.isIgnoringUnicode())
  86. setlocale(LC_ALL, "");
  87. for (std::pair<std::string, std::basic_istream<char>*> input : inputs)
  88. {
  89. StreamConsumer *stream;
  90. try
  91. {
  92. stream = readFile(input, params);
  93. }
  94. catch (EofException &e)
  95. {
  96. delete out;
  97. out = nullptr;
  98. std::cerr << params.getProgName() << ": " << input.first << " " << Warning::getType(e) << " (" << e.what() << ") error while reading" << std::endl;
  99. break;
  100. }
  101. catch (JsonException &e)
  102. {
  103. delete out;
  104. out = nullptr;
  105. std::cerr << "Error: ";
  106. displayException(input.first, params, Warning::getType(e), e);
  107. break;;
  108. }
  109. for (Warning w : stream->getMessages())
  110. {
  111. w.filename(input.first);
  112. warns.push_back(Warning(w));
  113. }
  114. out->run(stream->getRoot(), input.first);
  115. delete stream;
  116. }
  117. if (out)
  118. delete out;
  119. for (Warning w : warns)
  120. {
  121. std::cerr << "Warning: ";
  122. displayException(w.filename(), params, w.getType(), w());
  123. }
  124. }
  125. int main(int ac, char **av)
  126. {
  127. (void) ac;
  128. Params *params = new Params(av);
  129. bool _run = false;
  130. try {
  131. _run = params->read();
  132. }
  133. catch (std::runtime_error &e)
  134. {
  135. std::cerr << *av << ": " << e.what() << std::endl;
  136. params->usage();
  137. delete params;
  138. exit (EXIT_FAILURE);
  139. }
  140. if (_run)
  141. {
  142. if (params->isDiff())
  143. runDiff(*params);
  144. else
  145. run(*params);
  146. }
  147. delete params;
  148. return 0;
  149. }