add macro

This commit is contained in:
liuneng 2024-04-16 11:09:04 +08:00
parent 92116dc8e5
commit 1483cbacdf

View File

@ -135,6 +135,13 @@ namespace
return tl::unexpected(ErrorCodeAndMessage(error_code)); \
}
/// Returns an error if the function call failed
#define RETURN_ERROR_IF_FAILED(function_call) \
{ \
if (auto result = function_call; !result.has_value()) \
return tl::unexpected(result.error()); \
}
/// Run a function and either return an error or assign the result.
#define ASSIGN_RESULT_OR_RETURN_ERROR(res, function_call) \
{ \
@ -721,8 +728,7 @@ namespace
else
{
/// literal:
if (auto result = checkSpace(cur, end, literal.size(), "insufficient space to parse literal", fragment); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(checkSpace(cur, end, literal.size(), "insufficient space to parse literal", fragment))
if (std::string_view(cur, literal.size()) != literal)
RETURN_ERROR(
ErrorCodes::CANNOT_PARSE_DATETIME,
@ -740,10 +746,7 @@ namespace
static PosOrError readNumber2(Pos cur, Pos end, [[maybe_unused]] const String & fragment, T & res)
{
if constexpr (need_check_space == NeedCheckSpace::Yes)
{
if (auto result = checkSpace(cur, end, 2, "readNumber2 requires size >= 2", fragment); !result.has_value())
return tl::unexpected(result.error());
}
RETURN_ERROR_IF_FAILED(checkSpace(cur, end, 2, "readNumber2 requires size >= 2", fragment))
res = (*cur - '0');
++cur;
@ -756,10 +759,7 @@ namespace
static PosOrError readNumber3(Pos cur, Pos end, [[maybe_unused]] const String & fragment, T & res)
{
if constexpr (need_check_space == NeedCheckSpace::Yes)
{
if (auto result = checkSpace(cur, end, 3, "readNumber3 requires size >= 3", fragment); !result.has_value())
return tl::unexpected(result.error());
}
RETURN_ERROR_IF_FAILED(checkSpace(cur, end, 3, "readNumber3 requires size >= 3", fragment))
res = (*cur - '0');
++cur;
res = res * 10 + (*cur - '0');
@ -773,10 +773,7 @@ namespace
static PosOrError readNumber4(Pos cur, Pos end, [[maybe_unused]] const String & fragment, T & res)
{
if constexpr (need_check_space == NeedCheckSpace::Yes)
{
if (auto result = checkSpace(cur, end, 4, "readNumber4 requires size >= 4", fragment); !result.has_value())
return tl::unexpected(result.error());
}
RETURN_ERROR_IF_FAILED(checkSpace(cur, end, 4, "readNumber4 requires size >= 4", fragment))
res = (*cur - '0');
++cur;
@ -805,10 +802,7 @@ namespace
static PosOrError assertChar(Pos cur, Pos end, char expected, const String & fragment)
{
if constexpr (need_check_space == NeedCheckSpace::Yes)
{
if (auto result = checkSpace(cur, end, 1, "assertChar requires size >= 1", fragment); !result.has_value())
return tl::unexpected(result.error());
}
RETURN_ERROR_IF_FAILED(checkSpace(cur, end, 1, "assertChar requires size >= 1", fragment))
if (*cur != expected) [[unlikely]]
RETURN_ERROR(
@ -827,10 +821,7 @@ namespace
static PosOrError assertNumber(Pos cur, Pos end, const String & fragment)
{
if constexpr (need_check_space == NeedCheckSpace::Yes)
{
if (auto result = checkSpace(cur, end, 1, "assertNumber requires size >= 1", fragment); !result.has_value())
return tl::unexpected(result.error());
}
RETURN_ERROR_IF_FAILED(checkSpace(cur, end, 1, "assertNumber requires size >= 1", fragment))
if (*cur < '0' || *cur > '9') [[unlikely]]
RETURN_ERROR(
@ -846,8 +837,7 @@ namespace
static PosOrError mysqlDayOfWeekTextShort(Pos cur, Pos end, const String & fragment, DateTime<error_handling> & date)
{
if (auto result = checkSpace(cur, end, 3, "mysqlDayOfWeekTextShort requires size >= 3", fragment); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(checkSpace(cur, end, 3, "mysqlDayOfWeekTextShort requires size >= 3", fragment))
String text(cur, 3);
boost::to_lower(text);
@ -859,16 +849,14 @@ namespace
fragment,
std::string_view(cur, end - cur),
text)
if (auto result = date.setDayOfWeek(it->second.second); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setDayOfWeek(it->second.second))
cur += 3;
return cur;
}
static PosOrError mysqlMonthOfYearTextShort(Pos cur, Pos end, const String & fragment, DateTime<error_handling> & date)
{
if (auto result = checkSpace(cur, end, 3, "mysqlMonthOfYearTextShort requires size >= 3", fragment); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(checkSpace(cur, end, 3, "mysqlMonthOfYearTextShort requires size >= 3", fragment))
String text(cur, 3);
boost::to_lower(text);
@ -881,16 +869,14 @@ namespace
std::string_view(cur, end - cur),
text)
if (auto result = date.setMonth(it->second.second); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setMonth(it->second.second))
cur += 3;
return cur;
}
static PosOrError mysqlMonthOfYearTextLong(Pos cur, Pos end, const String & fragment, DateTime<error_handling> & date)
{
if (auto result = checkSpace(cur, end, 3, "mysqlMonthOfYearTextLong requires size >= 3", fragment); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(checkSpace(cur, end, 3, "mysqlMonthOfYearTextLong requires size >= 3", fragment))
String text1(cur, 3);
boost::to_lower(text1);
auto it = monthMap.find(text1);
@ -904,14 +890,12 @@ namespace
cur += 3;
size_t expected_remaining_size = it->second.first.size();
if (auto result = checkSpace(
cur,
end,
expected_remaining_size,
"mysqlMonthOfYearTextLong requires the second parg size >= " + std::to_string(expected_remaining_size),
fragment);
!result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(checkSpace(
cur,
end,
expected_remaining_size,
"mysqlMonthOfYearTextLong requires the second parg size >= " + std::to_string(expected_remaining_size),
fragment))
String text2(cur, expected_remaining_size);
boost::to_lower(text2);
if (text2 != it->second.first)
@ -923,8 +907,7 @@ namespace
text1 + text2)
cur += expected_remaining_size;
if (auto result = date.setMonth(it->second.second); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setMonth(it->second.second))
return cur;
}
@ -932,8 +915,7 @@ namespace
{
Int32 month;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumber2<Int32, NeedCheckSpace::Yes>(cur, end, fragment, month)))
if (auto result = date.setMonth(month); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setMonth(month))
return cur;
}
@ -941,8 +923,7 @@ namespace
{
Int32 month;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, readNumberWithVariableLength(cur, end, false, false, false, 1, 2, fragment, month))
if (auto result = date.setMonth(month); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setMonth(month))
return cur;
}
@ -950,8 +931,7 @@ namespace
{
Int32 century;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumber2<Int32, NeedCheckSpace::Yes>(cur, end, fragment, century)))
if (auto result = date.setCentury(century); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setCentury(century))
return cur;
}
@ -959,8 +939,7 @@ namespace
{
Int32 day_of_month;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumber2<Int32, NeedCheckSpace::Yes>(cur, end, fragment, day_of_month)))
if (auto result = date.setDayOfMonth(day_of_month); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setDayOfMonth(day_of_month))
return cur;
}
@ -972,26 +951,22 @@ namespace
Int32 month;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumber2<Int32, NeedCheckSpace::No>(cur, end, fragment, month)))
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (assertChar<NeedCheckSpace::No>(cur, end, '/', fragment)))
if (auto result = date.setMonth(month); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setMonth(month))
Int32 day;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumber2<Int32, NeedCheckSpace::No>(cur, end, fragment, day)))
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (assertChar<NeedCheckSpace::No>(cur, end, '/', fragment)))
if (auto result = date.setDayOfMonth(day); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setDayOfMonth(day))
Int32 year;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumber2<Int32, NeedCheckSpace::No>(cur, end, fragment, year)))
if (auto result = date.setYear(year); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setYear(year))
return cur;
}
static PosOrError mysqlDayOfMonthSpacePadded(Pos cur, Pos end, const String & fragment, DateTime<error_handling> & date)
{
if (auto result = checkSpace(cur, end, 2, "mysqlDayOfMonthSpacePadded requires size >= 2", fragment); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(checkSpace(cur, end, 2, "mysqlDayOfMonthSpacePadded requires size >= 2", fragment))
Int32 day_of_month = *cur == ' ' ? 0 : (*cur - '0');
++cur;
@ -999,8 +974,7 @@ namespace
day_of_month = 10 * day_of_month + (*cur - '0');
++cur;
if (auto result = date.setDayOfMonth(day_of_month); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setDayOfMonth(day_of_month))
return cur;
}
@ -1018,12 +992,9 @@ namespace
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (assertChar<NeedCheckSpace::No>(cur, end, '-', fragment)))
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumber2<Int32, NeedCheckSpace::No>(cur, end, fragment, day)))
if (auto result = date.setYear(year); !result.has_value())
return tl::unexpected(result.error());
if (auto result = date.setMonth(month); !result.has_value())
return tl::unexpected(result.error());
if (auto result = date.setDayOfMonth(day); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setYear(year))
RETURN_ERROR_IF_FAILED(date.setMonth(month))
RETURN_ERROR_IF_FAILED(date.setDayOfMonth(day))
return cur;
}
@ -1031,8 +1002,7 @@ namespace
{
Int32 year2;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumber2<Int32, NeedCheckSpace::Yes>(cur, end, fragment, year2)))
if (auto result = date.setYear2(year2); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setYear2(year2))
return cur;
}
@ -1040,8 +1010,7 @@ namespace
{
Int32 year;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumber4<Int32, NeedCheckSpace::Yes>(cur, end, fragment, year)))
if (auto result = date.setYear(year); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setYear(year))
return cur;
}
@ -1049,17 +1018,14 @@ namespace
{
Int32 day_of_year;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumber3<Int32, NeedCheckSpace::Yes>(cur, end, fragment, day_of_year)))
if (auto result = date.setDayOfYear(day_of_year); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setDayOfYear(day_of_year))
return cur;
}
static PosOrError mysqlDayOfWeek(Pos cur, Pos end, const String & fragment, DateTime<error_handling> & date)
{
if (auto result = checkSpace(cur, end, 1, "mysqlDayOfWeek requires size >= 1", fragment); !result.has_value())
return tl::unexpected(result.error());
if (auto result = date.setDayOfWeek(*cur - '0'); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(checkSpace(cur, end, 1, "mysqlDayOfWeek requires size >= 1", fragment))
RETURN_ERROR_IF_FAILED(date.setDayOfWeek(*cur - '0'))
++cur;
return cur;
}
@ -1068,30 +1034,26 @@ namespace
{
Int32 week;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumber2<Int32, NeedCheckSpace::Yes>(cur, end, fragment, week)))
if (auto result = date.setWeek(week); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setWeek(week))
return cur;
}
static PosOrError mysqlDayOfWeek0To6(Pos cur, Pos end, const String & fragment, DateTime<error_handling> & date)
{
if (auto result = checkSpace(cur, end, 1, "mysqlDayOfWeek0To6 requires size >= 1", fragment); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(checkSpace(cur, end, 1, "mysqlDayOfWeek0To6 requires size >= 1", fragment))
Int32 day_of_week = *cur - '0';
if (day_of_week == 0)
day_of_week = 7;
if (auto result = date.setDayOfWeek(day_of_week); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setDayOfWeek(day_of_week))
++cur;
return cur;
}
static PosOrError mysqlDayOfWeekTextLong(Pos cur, Pos end, const String & fragment, DateTime<error_handling> & date)
{
if (auto result = checkSpace(cur, end, 6, "mysqlDayOfWeekTextLong requires size >= 6", fragment); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(checkSpace(cur, end, 6, "mysqlDayOfWeekTextLong requires size >= 6", fragment))
String text1(cur, 3);
boost::to_lower(text1);
auto it = dayOfWeekMap.find(text1);
@ -1105,8 +1067,7 @@ namespace
cur += 3;
size_t expected_remaining_size = it->second.first.size();
if (auto result = checkSpace(cur, end, expected_remaining_size, "mysqlDayOfWeekTextLong requires the second parg size >= " + std::to_string(expected_remaining_size), fragment); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(checkSpace(cur, end, expected_remaining_size, "mysqlDayOfWeekTextLong requires the second parg size >= " + std::to_string(expected_remaining_size), fragment))
String text2(cur, expected_remaining_size);
boost::to_lower(text2);
if (text2 != it->second.first)
@ -1118,8 +1079,7 @@ namespace
text1 + text2)
cur += expected_remaining_size;
if (auto result = date.setDayOfWeek(it->second.second); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setDayOfWeek(it->second.second))
return cur;
}
@ -1127,8 +1087,7 @@ namespace
{
Int32 year2;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumber2<Int32, NeedCheckSpace::Yes>(cur, end, fragment, year2)))
if (auto result = date.setYear2(year2); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setYear2(year2))
return cur;
}
@ -1136,15 +1095,13 @@ namespace
{
Int32 year;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumber4<Int32, NeedCheckSpace::Yes>(cur, end, fragment, year)))
if (auto result = date.setYear(year); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setYear(year))
return cur;
}
static PosOrError mysqlTimezoneOffset(Pos cur, Pos end, const String & fragment, DateTime<error_handling> & date)
{
if (auto result = checkSpace(cur, end, 5, "mysqlTimezoneOffset requires size >= 5", fragment); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(checkSpace(cur, end, 5, "mysqlTimezoneOffset requires size >= 5", fragment))
Int32 sign;
if (*cur == '-')
@ -1175,40 +1132,33 @@ namespace
{
Int32 minute;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumber2<Int32, NeedCheckSpace::Yes>(cur, end, fragment, minute)))
if (auto result = date.setMinute(minute); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setMinute(minute))
return cur;
}
static PosOrError mysqlAMPM(Pos cur, Pos end, const String & fragment, DateTime<error_handling> & date)
{
if (auto result = checkSpace(cur, end, 2, "mysqlAMPM requires size >= 2", fragment); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(checkSpace(cur, end, 2, "mysqlAMPM requires size >= 2", fragment))
String text(cur, 2);
boost::to_lower(text);
if (auto result = date.setAMPM(text); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setAMPM(text))
cur += 2;
return cur;
}
static PosOrError mysqlHHMM12(Pos cur, Pos end, const String & fragment, DateTime<error_handling> & date)
{
if (auto result = checkSpace(cur, end, 8, "mysqlHHMM12 requires size >= 8", fragment); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(checkSpace(cur, end, 8, "mysqlHHMM12 requires size >= 8", fragment))
Int32 hour;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumber2<Int32, NeedCheckSpace::No>(cur, end, fragment, hour)))
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (assertChar<NeedCheckSpace::No>(cur, end, ':', fragment)))
if (auto result = date.setHour(hour, true, true); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setHour(hour, true, true))
Int32 minute;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumber2<Int32, NeedCheckSpace::No>(cur, end, fragment, minute)))
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (assertChar<NeedCheckSpace::No>(cur, end, ' ', fragment)))
if (auto result = date.setMinute(minute); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setMinute(minute))
ASSIGN_RESULT_OR_RETURN_ERROR(cur, mysqlAMPM(cur, end, fragment, date))
return cur;
@ -1216,19 +1166,15 @@ namespace
static PosOrError mysqlHHMM24(Pos cur, Pos end, const String & fragment, DateTime<error_handling> & date)
{
if (auto result = checkSpace(cur, end, 5, "mysqlHHMM24 requires size >= 5", fragment); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(checkSpace(cur, end, 5, "mysqlHHMM24 requires size >= 5", fragment))
Int32 hour;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumber2<Int32, NeedCheckSpace::No>(cur, end, fragment, hour)))
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (assertChar<NeedCheckSpace::No>(cur, end, ':', fragment)))
if (auto result = date.setHour(hour, false, false); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setHour(hour, false, false))
Int32 minute;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumber2<Int32, NeedCheckSpace::No>(cur, end, fragment, minute)))
if (auto result = date.setMinute(minute); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setMinute(minute))
return cur;
}
@ -1236,15 +1182,13 @@ namespace
{
Int32 second;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumber2<Int32, NeedCheckSpace::Yes>(cur, end, fragment, second)))
if (auto result = date.setSecond(second); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setSecond(second))
return cur;
}
static PosOrError mysqlMicrosecond(Pos cur, Pos end, const String & fragment, DateTime<error_handling> & /*date*/)
{
if (auto result = checkSpace(cur, end, 6, "mysqlMicrosecond requires size >= 6", fragment); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(checkSpace(cur, end, 6, "mysqlMicrosecond requires size >= 6", fragment))
for (size_t i = 0; i < 6; ++i)
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (assertNumber<NeedCheckSpace::No>(cur, end, fragment)))
@ -1254,8 +1198,7 @@ namespace
static PosOrError mysqlISO8601Time(Pos cur, Pos end, const String & fragment, DateTime<error_handling> & date)
{
if (auto result = checkSpace(cur, end, 8, "mysqlISO8601Time requires size >= 8", fragment); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(checkSpace(cur, end, 8, "mysqlISO8601Time requires size >= 8", fragment))
Int32 hour;
Int32 minute;
@ -1265,12 +1208,9 @@ namespace
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumber2<Int32, NeedCheckSpace::No>(cur, end, fragment, minute)))
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (assertChar<NeedCheckSpace::No>(cur, end, ':', fragment)))
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumber2<Int32, NeedCheckSpace::No>(cur, end, fragment, second)))
if (auto result = date.setHour(hour, false, false); !result.has_value())
return tl::unexpected(result.error());
if (auto result = date.setMinute(minute); !result.has_value())
return tl::unexpected(result.error());
if (auto result = date.setSecond(second); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setHour(hour, false, false))
RETURN_ERROR_IF_FAILED(date.setMinute(minute))
RETURN_ERROR_IF_FAILED(date.setSecond(second))
return cur;
}
@ -1278,8 +1218,7 @@ namespace
{
Int32 hour;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumber2<Int32, NeedCheckSpace::Yes>(cur, end, fragment, hour)))
if (auto result = date.setHour(hour, true, true); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setHour(hour, true, true))
return cur;
}
@ -1287,8 +1226,7 @@ namespace
{
Int32 hour;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumberWithVariableLength(cur, end, false, false, false, 1, 2, fragment, hour)))
if (auto result = date.setHour(hour, true, true); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setHour(hour, true, true))
return cur;
}
@ -1296,8 +1234,7 @@ namespace
{
Int32 hour;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumber2<Int32, NeedCheckSpace::Yes>(cur, end, fragment, hour)))
if (auto result = date.setHour(hour, false, false); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setHour(hour, false, false))
return cur;
}
@ -1305,8 +1242,7 @@ namespace
{
Int32 hour;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumberWithVariableLength(cur, end, false, false, false, 1, 2, fragment, hour)))
if (auto result = date.setHour(hour, false, false); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setHour(hour, false, false))
return cur;
}
@ -1411,13 +1347,11 @@ namespace
static PosOrError jodaEra(int, Pos cur, Pos end, const String & fragment, DateTime<error_handling> & date)
{
if (auto result = checkSpace(cur, end, 2, "jodaEra requires size >= 2", fragment); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(checkSpace(cur, end, 2, "jodaEra requires size >= 2", fragment))
String era(cur, 2);
boost::to_lower(era);
if (auto result = date.setEra(era); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setEra(era))
cur += 2;
return cur;
}
@ -1426,8 +1360,7 @@ namespace
{
Int32 century;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumberWithVariableLength(cur, end, false, false, false, repetitions, repetitions, fragment, century)))
if (auto result = date.setCentury(century); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setCentury(century))
return cur;
}
@ -1435,8 +1368,7 @@ namespace
{
Int32 year_of_era;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumberWithVariableLength(cur, end, false, false, true, repetitions, repetitions, fragment, year_of_era)))
if (auto result = date.setYear(year_of_era, true); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setYear(year_of_era, true))
return cur;
}
@ -1444,8 +1376,7 @@ namespace
{
Int32 week_year;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumberWithVariableLength(cur, end, true, true, true, repetitions, repetitions, fragment, week_year)))
if (auto result = date.setYear(week_year, false, true); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setYear(week_year, false, true))
return cur;
}
@ -1453,8 +1384,7 @@ namespace
{
Int32 week;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumberWithVariableLength(cur, end, false, false, false, repetitions, std::max(repetitions, 2uz), fragment, week)))
if (auto result = date.setWeek(week); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setWeek(week))
return cur;
}
@ -1462,8 +1392,7 @@ namespace
{
Int32 day_of_week;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumberWithVariableLength(cur, end, false, false, false, repetitions, repetitions, fragment, day_of_week)))
if (auto result = date.setDayOfWeek(day_of_week); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setDayOfWeek(day_of_week))
return cur;
}
@ -1484,8 +1413,7 @@ namespace
std::string_view(cur, end - cur),
text1)
cur += 3;
if (auto result = date.setDayOfWeek(it->second.second); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setDayOfWeek(it->second.second))
size_t expected_remaining_size = it->second.first.size();
if (cur + expected_remaining_size <= end)
@ -1505,8 +1433,7 @@ namespace
{
Int32 year;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumberWithVariableLength(cur, end, true, true, true, repetitions, repetitions, fragment, year)))
if (auto result = date.setYear(year); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setYear(year))
return cur;
}
@ -1514,8 +1441,7 @@ namespace
{
Int32 day_of_year;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumberWithVariableLength(cur, end, false, false, false, repetitions, std::max(repetitions, 3uz), fragment, day_of_year)))
if (auto result = date.setDayOfYear(day_of_year); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setDayOfYear(day_of_year))
return cur;
}
@ -1523,15 +1449,13 @@ namespace
{
Int32 month;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumberWithVariableLength(cur, end, false, false, false, repetitions, 2, fragment, month)))
if (auto result = date.setMonth(month); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setMonth(month))
return cur;
}
static PosOrError jodaMonthOfYearText(int, Pos cur, Pos end, const String & fragment, DateTime<error_handling> & date)
{
if (auto result = checkSpace(cur, end, 3, "jodaMonthOfYearText requires size >= 3", fragment); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(checkSpace(cur, end, 3, "jodaMonthOfYearText requires size >= 3", fragment))
String text1(cur, 3);
boost::to_lower(text1);
auto it = monthMap.find(text1);
@ -1543,8 +1467,7 @@ namespace
std::string_view(cur, end - cur),
text1)
cur += 3;
if (auto result = date.setMonth(it->second.second); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setMonth(it->second.second))
size_t expected_remaining_size = it->second.first.size();
if (cur + expected_remaining_size <= end)
@ -1572,13 +1495,11 @@ namespace
static PosOrError jodaHalfDayOfDay(int, Pos cur, Pos end, const String & fragment, DateTime<error_handling> & date)
{
if (auto result = checkSpace(cur, end, 2, "jodaHalfDayOfDay requires size >= 2", fragment); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(checkSpace(cur, end, 2, "jodaHalfDayOfDay requires size >= 2", fragment))
String text(cur, 2);
boost::to_lower(text);
if (auto result = date.setAMPM(text); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setAMPM(text))
cur += 2;
return cur;
}
@ -1587,8 +1508,7 @@ namespace
{
Int32 hour;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumberWithVariableLength(cur, end, false, false, false, repetitions, std::max(repetitions, 2uz), fragment, hour)))
if (auto result = date.setHour(hour, true, false); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setHour(hour, true, false))
return cur;
}
@ -1596,8 +1516,7 @@ namespace
{
Int32 hour;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumberWithVariableLength(cur, end, false, false, false, repetitions, std::max(repetitions, 2uz), fragment, hour)))
if (auto result = date.setHour(hour, true, true); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setHour(hour, true, true))
return cur;
}
@ -1605,8 +1524,7 @@ namespace
{
Int32 hour;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumberWithVariableLength(cur, end, false, false, false, repetitions, std::max(repetitions, 2uz), fragment, hour)))
if (auto result = date.setHour(hour, false, false); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setHour(hour, false, false))
return cur;
}
@ -1614,8 +1532,7 @@ namespace
{
Int32 hour;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumberWithVariableLength(cur, end, false, false, false, repetitions, std::max(repetitions, 2uz), fragment, hour)))
if (auto result = date.setHour(hour, false, true); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setHour(hour, false, true))
return cur;
}
@ -1623,8 +1540,7 @@ namespace
{
Int32 minute;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumberWithVariableLength(cur, end, false, false, false, repetitions, std::max(repetitions, 2uz), fragment, minute)))
if (auto result = date.setMinute(minute); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setMinute(minute))
return cur;
}
@ -1632,8 +1548,7 @@ namespace
{
Int32 second;
ASSIGN_RESULT_OR_RETURN_ERROR(cur, (readNumberWithVariableLength(cur, end, false, false, false, repetitions, std::max(repetitions, 2uz), fragment, second)))
if (auto result = date.setSecond(second); !result.has_value())
return tl::unexpected(result.error());
RETURN_ERROR_IF_FAILED(date.setSecond(second))
return cur;
}
};