url_parse.cpp 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #include "url_parse.h"
  2. #define FIELD_ADD(name) structBuilder->AddField(#name, optionalStringType, &urlParseIndexes.name);
  3. #define FIELD_FILL(name) \
  4. if (value.FldIsSet(TUri::Field##name)) { \
  5. fields[UrlParseIndexes.name] = valueBuilder->NewString(value.GetField(TUri::Field##name)); \
  6. }
  7. namespace NUrlUdf {
  8. using namespace NUri;
  9. using namespace NKikimr;
  10. using namespace NUdf;
  11. TUnboxedValue TParse::Run(
  12. const IValueBuilder* valueBuilder,
  13. const TUnboxedValuePod* args) const {
  14. TUri value;
  15. const auto ParseError = value.ParseAbs(args[0].AsStringRef(), ParseFlags);
  16. TUnboxedValue* fields = nullptr;
  17. const auto result = valueBuilder->NewArray(FieldsCount, fields);
  18. if (ParseError == TUri::ParsedOK) {
  19. FIELD_MAP(FIELD_FILL)
  20. } else {
  21. fields[UrlParseIndexes.ParseError] = valueBuilder->NewString(TStringBuilder() << ParseError);
  22. }
  23. return result;
  24. }
  25. bool TParse::DeclareSignature(
  26. const TStringRef& name,
  27. TType* userType,
  28. IFunctionTypeInfoBuilder& builder,
  29. bool typesOnly) {
  30. Y_UNUSED(userType);
  31. if (Name() == name) {
  32. TUrlParseIndexes urlParseIndexes;
  33. builder.Args(1)->Add<TAutoMap<char*>>();
  34. const auto optionalStringType = builder.Optional()->Item<char*>().Build();
  35. const auto structBuilder = builder.Struct(FieldsCount);
  36. structBuilder->AddField("ParseError", optionalStringType, &urlParseIndexes.ParseError);
  37. FIELD_MAP(FIELD_ADD)
  38. builder.Returns(structBuilder->Build());
  39. if (!typesOnly) {
  40. builder.Implementation(new TParse(urlParseIndexes));
  41. }
  42. return true;
  43. } else {
  44. return false;
  45. }
  46. }
  47. }