fork download
  1. #include "reader.hpp"
  2.  
  3. #include <QJsonArray>
  4. #include <QJsonObject>
  5. #include <QJsonValue>
  6.  
  7. #include <functional>
  8. #include <iterator>
  9.  
  10. namespace advisor {
  11. namespace reader {
  12. namespace {
  13.  
  14. course::major major(const QJsonObject& m);
  15. course::offering offering(const QJsonObject& o);
  16. timings::timings timings(const QJsonObject& t);
  17. std::set<QDate> days(const QJsonArray& days);
  18. course::set prerequisites(const QJsonArray& ps);
  19. course::requirements requirements(const QJsonArray& reqs);
  20. course::requirements::value_type requirement(const QJsonObject& r);
  21.  
  22. template<typename Ts, typename Treader>
  23. Ts read(const QJsonArray& a, Treader&& f) {
  24. Ts c;
  25. std::transform(a.constBegin(), a.constEnd(), std::inserter(c, c.begin()),
  26. std::forward<Treader>(f));
  27. return c;
  28. }
  29.  
  30. } // namespace (anonymous)
  31.  
  32. std::set<course::major> majors(const QJsonDocument& in) {
  33. return read<std::set<course::major>>(in.array(), [](const QJsonValue& v) {
  34. return major(v.toObject());
  35. });
  36. }
  37.  
  38. std::set<course::offering> offerings(const QJsonDocument& in) {
  39. return read<std::set<course::offering>>(in.array(), [](const QJsonValue& v) {
  40. return offering(v.toObject());
  41. });
  42. }
  43.  
  44. course::requirements requirements(const QJsonDocument& in) {
  45. return requirements(in.array());
  46. }
  47.  
  48. namespace {
  49.  
  50. course::major major(const QJsonObject& m) {
  51. const auto& name = m.value("name").toString();
  52. const auto& department = m.value("department").toString();
  53. const auto& reqs = requirements(m.value("requirements").toArray());
  54. return {name, department, reqs};
  55. }
  56.  
  57. course::offering offering(const QJsonObject& o) {
  58. const course::code code{o.value("code").toString().toStdString()};
  59. const auto& section = o.value("section").toString().toInt();
  60. const auto& credits = o.value("credits").toString().toInt();
  61. const auto& timings = reader::timings(o.value("timings").toObject());
  62. return {code, section, credits, timings};
  63. }
  64.  
  65. timings::timings timings(const QJsonObject& t) {
  66. const auto& time_fmt = "hh:mm";
  67. const auto& start = QTime::fromString(t.value("start").toString(), time_fmt);
  68. const auto& end = QTime::fromString(t.value("end").toString(), time_fmt);
  69. const auto& days = reader::days(t.value("days").toArray());
  70. return {start, end, days};
  71. }
  72.  
  73. std::set<QDate> days(const QJsonArray& days) {
  74. return read<std::set<QDate>>(days, [](const QJsonValue& day) {
  75. return QDate::fromString(day.toString(), "ddd");
  76. });
  77. }
  78.  
  79. course::requirements requirements(const QJsonArray& reqs) {
  80. return read<course::requirements>(reqs, [](const QJsonValue& v) {
  81. return requirement(v.toObject());
  82. });
  83. }
  84.  
  85. course::requirements::value_type requirement(const QJsonObject& r) {
  86. const course::code code{r.value("code").toString().toStdString()};
  87. const auto& prereqs = prerequisites(r.value("prerequisites").toArray());
  88. return {code, prereqs};
  89. }
  90.  
  91. course::set prerequisites(const QJsonArray& ps) {
  92. return read<course::set>(ps, [](const QJsonValue& v) {
  93. return course::code{v.toString().toStdString()};
  94. });
  95. }
  96.  
  97. } // namespace (anonymous)
  98. } // namespace reader
  99. } // namespace advisor
  100.  
  101.  
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty