| 708 | using ErrorCode = DateTimeResult::ErrorCode; |
| 709 | |
| 710 | ErrorCode parseFromPattern( |
| 711 | FormatPattern curPattern, |
| 712 | const std::string_view& input, |
| 713 | const char*& cur, |
| 714 | const char* end, |
| 715 | Date& date, |
| 716 | bool specifierNext, |
| 717 | DateTimeFormatterType type, |
| 718 | bool legacySpark = false) { |
| 719 | if (curPattern.specifier == DateTimeFormatSpecifier::TIMEZONE_OFFSET_ID) { |
| 720 | auto size = parseTimezoneOffset(cur, end, date); |
| 721 | if (size == -1) { |
| 722 | return ErrorCode::PARSE_TIMEZONE_OFFSET_ERROR; |
| 723 | } |
| 724 | cur += size; |
| 725 | } else if (curPattern.specifier == DateTimeFormatSpecifier::TIMEZONE) { |
| 726 | auto size = parseTimezone(cur, end, date, legacySpark); |
| 727 | if (size == -1) { |
| 728 | return ErrorCode::PARSE_TIMEZONE_ERROR; |
| 729 | } |
| 730 | cur += size; |
| 731 | } else if (curPattern.specifier == DateTimeFormatSpecifier::ERA) { |
| 732 | auto size = parseEra(cur, end, date); |
| 733 | if (size == -1) { |
| 734 | return ErrorCode::PARSE_ERA_ERROR; |
| 735 | } |
| 736 | cur += size; |
| 737 | } else if ( |
| 738 | curPattern.specifier == DateTimeFormatSpecifier::MONTH_OF_YEAR_TEXT) { |
| 739 | auto size = parseMonthText(cur, end, date); |
| 740 | if (size == -1) { |
| 741 | return ErrorCode::PARSE_MONTH_ERROR; |
| 742 | } |
| 743 | cur += size; |
| 744 | if (!date.hasYear) { |
| 745 | date.hasYear = true; |
| 746 | date.year = 2000; |
| 747 | } |
| 748 | } else if (curPattern.specifier == DateTimeFormatSpecifier::HALFDAY_OF_DAY) { |
| 749 | auto size = parseHalfDayOfDay(cur, end, date); |
| 750 | if (size == -1) { |
| 751 | return ErrorCode::PARSE_HALFDAY_ERROR; |
| 752 | } |
| 753 | #ifdef SPARK_COMPATIBLE |
| 754 | date.isHourOfHalfDay = true; // for get_timestamp("PM", "a") case |
| 755 | #endif |
| 756 | cur += size; |
| 757 | } else if ( |
| 758 | curPattern.specifier == DateTimeFormatSpecifier::DAY_OF_WEEK_TEXT) { |
| 759 | auto size = parseDayOfWeekText(cur, end, date); |
| 760 | if (size == -1) { |
| 761 | return ErrorCode::PARSE_DAY_ERROR; |
| 762 | } |
| 763 | cur += size; |
| 764 | date.weekDateFormat = true; |
| 765 | date.dayOfYearFormat = false; |
| 766 | if (!date.hasYear) { |
| 767 | date.hasYear = true; |
no test coverage detected