iostream.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #pragma once
  2. #include <iostream>
  3. #include <set>
  4. #include <sstream>
  5. #include <unordered_set>
  6. #include <jvalidate/enum.h>
  7. #include <jvalidate/status.h>
  8. namespace jvalidate::adapter {
  9. inline std::ostream & operator<<(std::ostream & os, Type type) {
  10. switch (type) {
  11. case Type::Null:
  12. return os << "null";
  13. case Type::Boolean:
  14. return os << "boolean";
  15. case Type::Integer:
  16. return os << "integer";
  17. case Type::Number:
  18. return os << "number";
  19. case Type::String:
  20. return os << "string";
  21. case Type::Array:
  22. return os << "array";
  23. case Type::Object:
  24. return os << "object";
  25. }
  26. }
  27. }
  28. namespace jvalidate::schema {
  29. inline std::ostream & operator<<(std::ostream & os, Version version) {
  30. switch (version) {
  31. case Version::Draft03:
  32. return os << "draft3";
  33. case Version::Draft04:
  34. return os << "draft4";
  35. case Version::Draft06:
  36. return os << "draft6";
  37. case Version::Draft07:
  38. return os << "draft7";
  39. case Version::Draft2019_09:
  40. return os << "draft2019-09";
  41. case Version::Draft2020_12:
  42. return os << "draft2020-12";
  43. }
  44. }
  45. }
  46. namespace jvalidate {
  47. inline std::ostream & operator<<(std::ostream & os, Status st) {
  48. if (st == Status::Accept) {
  49. return os << "Accept";
  50. }
  51. if (st == Status::Reject) {
  52. return os << "Reject";
  53. }
  54. return os << "Noop";
  55. }
  56. template <typename T>
  57. inline std::ostream & operator<<(std::ostream & os, std::set<T> const & data) {
  58. if (data.size() == 1) {
  59. return os << *data.begin();
  60. }
  61. os << '[';
  62. std::string div = " ";
  63. for (auto const & elem : data) {
  64. os << std::exchange(div, ", ") << elem;
  65. }
  66. return os << ' ' << ']';
  67. }
  68. template <typename T>
  69. inline std::ostream & operator<<(std::ostream & os, std::unordered_set<T> const & data) {
  70. if (data.size() == 1) {
  71. return os << *data.begin();
  72. }
  73. os << '[';
  74. std::string div = " ";
  75. for (auto const & elem : data) {
  76. os << std::exchange(div, ", ") << elem;
  77. }
  78. return os << ' ' << ']';
  79. }
  80. template <typename S>
  81. requires(std::is_constructible_v<std::string, S>)
  82. // Optimization to avoid running string-like objects through a
  83. // std::stringstream in fmtlist.
  84. static std::string to_string(S const & str) {
  85. return std::string(str);
  86. }
  87. // Format va_args into a single string to annotate or mark an error message
  88. static std::string to_string(auto const &... args) {
  89. std::stringstream ss;
  90. using ::jvalidate::operator<<;
  91. [[maybe_unused]] int _[] = {(ss << args, 0)...};
  92. return ss.str();
  93. }
  94. // Format an iterable argument into a vector of strings to annotate or mark
  95. // an error.
  96. static std::vector<std::string> to_string_list(auto const & arg) {
  97. std::vector<std::string> strs;
  98. for (auto const & elem : arg) {
  99. strs.push_back(::jvalidate::to_string(elem));
  100. }
  101. return strs;
  102. }
  103. }