1#include <userver/proto-structs/date.hpp>
5#include <userver/proto-structs/exceptions.hpp>
6#include <userver/utils/impl/internal_tag.hpp>
10namespace proto_structs {
12Date::Date(utils::impl::InternalTag, std::int32_t year, std::int32_t month, std::int32_t day) {
13 if (!IsValid(utils::impl::InternalTag{}, year, month, day)) {
14 ThrowError(year, month, day,
"invalid or out of range");
22 month_.emplace(
static_cast<
unsigned>(month));
26 day_.emplace(
static_cast<
unsigned>(day));
31 utils::impl::InternalTag,
32 std::int32_t year_num,
33 std::int32_t month_num,
36 std::optional<std::chrono::year> year;
37 std::optional<std::chrono::month> month;
38 std::optional<std::chrono::day> day;
41 year.emplace(year_num);
45 if (month_num > 0 && month_num <= 12) {
46 month.emplace(
static_cast<
unsigned>(month_num));
53 if (day_num > 0 && day_num <= 31) {
54 day.emplace(
static_cast<
unsigned>(day_num));
60 return IsValid(year, month, day);
63void Date::ThrowError(std::int32_t year, std::int32_t month, std::int32_t day,
const char* reason) {
64 throw ValueError(fmt::format(
"Date '{}y/{}m/{}d' error: {}", year, month, day, reason));