parse.h 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #pragma once
  2. #include "resource.h"
  3. #include <yql/essentials/public/udf/udf_value.h>
  4. #include <yql/essentials/public/udf/udf_helpers.h>
  5. #include <yql/essentials/minikql/dom/json.h>
  6. #include <library/cpp/json/json_reader.h>
  7. namespace NJson2Udf {
  8. using namespace NKikimr;
  9. using namespace NUdf;
  10. using namespace NYql;
  11. using namespace NDom;
  12. class TParse: public TBoxedValue {
  13. public:
  14. TParse(TSourcePosition pos)
  15. : Pos_(pos)
  16. {
  17. }
  18. static const TStringRef& Name() {
  19. static auto name = TStringRef::Of("Parse");
  20. return name;
  21. }
  22. static bool DeclareSignature(
  23. const TStringRef& name,
  24. TType* userType,
  25. IFunctionTypeInfoBuilder& builder,
  26. bool typesOnly) {
  27. Y_UNUSED(userType);
  28. if (name != Name()) {
  29. return false;
  30. }
  31. builder.Args()
  32. ->Add<TAutoMap<TJson>>()
  33. .Done()
  34. .Returns<TJsonNodeResource>();
  35. if (!typesOnly) {
  36. builder.Implementation(new TParse(builder.GetSourcePosition()));
  37. }
  38. return true;
  39. }
  40. private:
  41. TUnboxedValue Run(
  42. const IValueBuilder* valueBuilder,
  43. const TUnboxedValuePod* args) const final {
  44. Y_UNUSED(valueBuilder);
  45. try {
  46. const auto json = args[0].AsStringRef();
  47. return TryParseJsonDom(json, valueBuilder);
  48. } catch (const std::exception& e) {
  49. UdfTerminate((TStringBuilder() << Pos_ << " " << e.what()).data());
  50. }
  51. }
  52. TSourcePosition Pos_;
  53. };
  54. }