yql_provider_gateway.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #pragma once
  2. #include <yql/essentials/core/issue/yql_issue.h>
  3. #include <yql/essentials/public/issue/yql_issue_manager.h>
  4. #include <library/cpp/threading/future/future.h>
  5. namespace NYql {
  6. namespace NCommon {
  7. class TOperationResult {
  8. public:
  9. [[nodiscard]]
  10. bool Success() const { return Status_ == TIssuesIds::SUCCESS; };
  11. const EYqlIssueCode& Status() const { return Status_; }
  12. const TIssues& Issues() const { return Issues_; }
  13. void SetSuccess() { Status_ = TIssuesIds::SUCCESS; }
  14. void SetStatus(EYqlIssueCode status) { Status_ = status; }
  15. void AddIssue(const TIssue& issue);
  16. void AddIssues(const TIssues& issues);
  17. void SetException(const std::exception& e, const TPosition& pos = {});
  18. void ReportIssues(TIssueManager& issueManager) const;
  19. private:
  20. EYqlIssueCode Status_ = TIssuesIds::DEFAULT_ERROR;
  21. TIssues Issues_;
  22. };
  23. template<typename TResult>
  24. TResult ResultFromException(const std::exception& e, const TPosition& pos = {}) {
  25. TResult result;
  26. result.SetException(e, pos);
  27. return result;
  28. }
  29. template<typename TResult>
  30. TResult ResultFromIssues(EYqlIssueCode status, const TString& message, const TIssues& issues) {
  31. TIssue statusIssue = message.empty()
  32. ? YqlIssue(TPosition(), status)
  33. : YqlIssue(TPosition(), status, message);
  34. for (auto& issue : issues) {
  35. statusIssue.AddSubIssue(MakeIntrusive<TIssue>(issue));
  36. }
  37. TResult result;
  38. result.SetStatus(status);
  39. result.AddIssue(statusIssue);
  40. return result;
  41. }
  42. template<typename TResult>
  43. TResult ResultFromIssues(EYqlIssueCode status, const TIssues& issues) {
  44. return ResultFromIssues<TResult>(status, "", issues);
  45. }
  46. template<typename TResult>
  47. TResult ResultFromError(const TIssue& error) {
  48. TResult result;
  49. result.AddIssue(error);
  50. return result;
  51. }
  52. template<typename TResult>
  53. TResult ResultFromError(const TIssues& error) {
  54. TResult result;
  55. result.AddIssues(error);
  56. return result;
  57. }
  58. template<typename TResult>
  59. TResult ResultFromError(const TString& error, TPosition pos = TPosition()) {
  60. return ResultFromError<TResult>(TIssue(pos, error));
  61. }
  62. template<typename TResult>
  63. TResult ResultFromErrors(const TIssues& errors) {
  64. TResult result;
  65. result.AddIssues(errors);
  66. return result;
  67. }
  68. template <typename T>
  69. inline void SetPromiseValue(NThreading::TPromise<T>& promise, const NThreading::TFuture<T>& future)
  70. {
  71. future.Subscribe([=] (const NThreading::TFuture<T>& f) mutable {
  72. try {
  73. promise.SetValue(f.GetValue());
  74. } catch (...) {
  75. promise.SetException(std::current_exception());
  76. }
  77. });
  78. }
  79. } // NCommon
  80. } // NYql