error_helpers.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #include "error_helpers.h"
  2. #include <library/cpp/yson/writer.h>
  3. #include <ydb/library/yql/public/issue/yql_issue_id.h>
  4. #include <ydb/library/yql/core/issue/protos/issue_id.pb.h>
  5. namespace NYT::NYqlPlugin {
  6. ////////////////////////////////////////////////////////////////////////////////
  7. const int IssueToErrorCodesShift = 30000;
  8. ////////////////////////////////////////////////////////////////////////////////
  9. TString MessageToYtErrorYson(const TString& message)
  10. {
  11. TStringStream yson;
  12. ::NYson::TYsonWriter writer(&yson);
  13. writer.OnBeginMap();
  14. writer.OnKeyedItem("code");
  15. writer.OnInt64Scalar(1); // Generic error
  16. writer.OnKeyedItem("message");
  17. writer.OnStringScalar(message);
  18. writer.OnKeyedItem("attributes");
  19. writer.OnBeginMap();
  20. writer.OnEndMap();
  21. writer.OnEndMap();
  22. return yson.Str();
  23. }
  24. TString IssuesToYtErrorYson(const NYql::TIssues& issues)
  25. {
  26. TStringStream yson;
  27. ::NYson::TYsonWriter writer(&yson);
  28. auto serializePosition = [&] (const NYql::TPosition& position) {
  29. writer.OnBeginMap();
  30. {
  31. writer.OnKeyedItem("column");
  32. writer.OnInt64Scalar(position.Column);
  33. writer.OnKeyedItem("row");
  34. writer.OnInt64Scalar(position.Row - 1); // First line is for required pragmas.
  35. if (!position.File.empty()) {
  36. writer.OnKeyedItem("file");
  37. writer.OnStringScalar(position.File);
  38. }
  39. }
  40. writer.OnEndMap();
  41. };
  42. auto fn = [&] (const NYql::TIssue& issue, ui16 /*level*/) {
  43. writer.OnListItem();
  44. writer.OnBeginMap();
  45. {
  46. writer.OnKeyedItem("code");
  47. NYql::TIssueCode code = IssueToErrorCodesShift + issue.GetCode();
  48. writer.OnInt64Scalar(code);
  49. writer.OnKeyedItem("message");
  50. writer.OnStringScalar(issue.GetMessage());
  51. writer.OnKeyedItem("attributes");
  52. writer.OnBeginMap();
  53. {
  54. if (issue.Range().Position) {
  55. writer.OnKeyedItem("start_position");
  56. serializePosition(issue.Range().Position);
  57. }
  58. if (issue.Range().EndPosition) {
  59. writer.OnKeyedItem("end_position");
  60. serializePosition(issue.Range().EndPosition);
  61. }
  62. writer.OnKeyedItem("yql_status");
  63. writer.OnStringScalar(NYql::IssueCodeToString<NYql::TIssuesIds>(issue.GetCode()));
  64. writer.OnKeyedItem("severity");
  65. writer.OnStringScalar(SeverityToString(issue.GetSeverity()));
  66. }
  67. writer.OnEndMap();
  68. writer.OnKeyedItem("inner_errors");
  69. writer.OnBeginList();
  70. }
  71. };
  72. auto afterChildrenFn = [&] (const NYql::TIssue& /*issue*/, ui16 /*level*/) {
  73. writer.OnEndList();
  74. writer.OnEndMap();
  75. };
  76. writer.OnBeginMap();
  77. writer.OnKeyedItem("message");
  78. writer.OnStringScalar("There are some issues");
  79. writer.OnKeyedItem("code");
  80. writer.OnInt64Scalar(1);
  81. writer.OnKeyedItem("inner_errors");
  82. writer.OnBeginList();
  83. for (const auto& issue : issues) {
  84. WalkThroughIssues(issue, /*leafOnly*/ false, fn, afterChildrenFn);
  85. }
  86. writer.OnEndList();
  87. writer.OnKeyedItem("attributes");
  88. writer.OnBeginMap();
  89. writer.OnEndMap();
  90. writer.OnEndMap();
  91. return yson.Str();
  92. }
  93. ////////////////////////////////////////////////////////////////////////////////
  94. } // namespace NYT::NYqlPLugin