comparison src/core/date.cc @ 258:862d0d8619f6

*: HUUUGE changes animia has been renamed to animone, so instead of thinking of a health condition, you think of a beautiful flower :) I've also edited some of the code for animone, but I have no idea if it even works or not because I don't have a mac or windows machine lying around. whoops! ... anyway, all of the changes divergent from Anisthesia are now licensed under BSD. it's possible that I could even rewrite most of the code to where I don't even have to keep the MIT license, but that's thinking too far into the future I've been slacking off on implementing the anime seasons page, mostly out of laziness. I think I'd have to create another db file specifically for the seasons anyway, this code is being pushed *primarily* because the hard drive it's on is failing! yay :)
author Paper <paper@paper.us.eu.org>
date Mon, 01 Apr 2024 02:43:44 -0400
parents bc1ae1810855
children b1f4d1867ab1
comparison
equal deleted inserted replaced
257:699a20c57dc8 258:862d0d8619f6
9 /* An implementation of AniList's "fuzzy date" */ 9 /* An implementation of AniList's "fuzzy date" */
10 10
11 Date::Date() { 11 Date::Date() {
12 } 12 }
13 13
14 Date::Date(unsigned int y) { 14 Date::Date(Date::Year y) {
15 SetYear(y); 15 SetYear(y);
16 } 16 }
17 17
18 Date::Date(unsigned int y, unsigned int m, unsigned int d) { 18 Date::Date(Date::Year y, Date::Month m, Date::Day d) {
19 SetYear(y); 19 SetYear(y);
20 SetMonth(m); 20 SetMonth(m);
21 SetDay(d); 21 SetDay(d);
22 } 22 }
23 23
24 Date::Date(const QDate& date) { 24 Date::Date(const QDate& date) {
25 SetYear(date.year()); 25 SetYear(date.year());
26 SetMonth(date.month()); 26 auto m = date.month();
27 m = std::clamp(m, static_cast<decltype(m)>(Date::Month::Jan), static_cast<decltype(m)>(Date::Month::Dec));
28 SetMonth(static_cast<Date::Month>(m));
27 SetDay(date.day()); 29 SetDay(date.day());
28 } 30 }
29 31
30 Date::Date(const nlohmann::json& json) { 32 Date::Date(const nlohmann::json& json) {
31 /* NOTE: this constructor is made for use with 33 /* NOTE: this constructor is made for use with
32 AniList FuzzyDate-style JSON. In the future, some other 34 * AniList FuzzyDate-style JSON. In the future, some other
33 methods may be parsed and whatnot if necessary. */ 35 * methods may be parsed and whatnot if necessary. */
34 36
35 if (json.contains("/year"_json_pointer) && json.at("/year"_json_pointer).is_number()) 37 if (json.contains("/year"_json_pointer) && json.at("/year"_json_pointer).is_number())
36 SetYear(json.at("/year"_json_pointer).get<unsigned int>()); 38 SetYear(json.at("/year"_json_pointer).get<unsigned int>());
37 if (json.contains("/month"_json_pointer) && json.at("/month"_json_pointer).is_number()) 39
38 SetMonth(json.at("/month"_json_pointer).get<unsigned int>()); 40 if (json.contains("/month"_json_pointer) && json.at("/month"_json_pointer).is_number()) {
41 auto m = json.at("/month"_json_pointer).get<unsigned int>();
42 m = std::clamp(m, static_cast<decltype(m)>(Date::Month::Jan), static_cast<decltype(m)>(Date::Month::Dec));
43 SetMonth(static_cast<Date::Month>(m));
44 }
45
39 if (json.contains("/day"_json_pointer) && json.at("/day"_json_pointer).is_number()) 46 if (json.contains("/day"_json_pointer) && json.at("/day"_json_pointer).is_number())
40 SetDay(json.at("/day"_json_pointer).get<unsigned int>()); 47 SetDay(json.at("/day"_json_pointer).get<unsigned char>());
41 } 48 }
42 49
43 void Date::VoidYear() { 50 void Date::VoidYear() {
44 year.reset(); 51 year.reset();
45 } 52 }
50 57
51 void Date::VoidDay() { 58 void Date::VoidDay() {
52 day.reset(); 59 day.reset();
53 } 60 }
54 61
55 void Date::SetYear(unsigned int y) { 62 void Date::SetYear(Date::Year y) {
56 year.emplace(y); 63 year.emplace(y);
57 } 64 }
58 65
59 void Date::SetMonth(unsigned int m) { 66 void Date::SetMonth(Date::Month m) {
60 month.emplace(std::clamp(m, 1U, 12U)); 67 month.emplace(m);
61 } 68 }
62 69
63 void Date::SetDay(unsigned int d) { 70 void Date::SetDay(Date::Day d) {
64 day.emplace(std::clamp(d, 1U, 31U)); 71 day.emplace(std::clamp(d, static_cast<Date::Day>(1U), static_cast<Date::Day>(31U)));
65 } 72 }
66 73
67 std::optional<unsigned int> Date::GetYear() const { 74 std::optional<Date::Year> Date::GetYear() const {
68 return year; 75 return year;
69 } 76 }
70 77
71 std::optional<unsigned int> Date::GetMonth() const { 78 std::optional<Date::Month> Date::GetMonth() const {
72 return month; 79 return month;
73 } 80 }
74 81
75 std::optional<unsigned int> Date::GetDay() const { 82 std::optional<Date::Day> Date::GetDay() const {
76 return day; 83 return day;
77 } 84 }
78 85
79 bool Date::IsValid() const { 86 bool Date::IsValid() const {
80 return year.has_value() && month.has_value() && day.has_value(); 87 return year.has_value() && month.has_value() && day.has_value();
81 } 88 }
82 89
83 QDate Date::GetAsQDate() const { 90 QDate Date::GetAsQDate() const {
84 /* QDate doesn't support "missing" values (for good reason), 91 /* QDate doesn't support "missing" values (for good reason),
85 * so we do our best and return what we can. 92 * so we do our best and return what we can.
86 */ 93 */
87 94
88 return QDate(year.value_or(2000), month.value_or(1), day.value_or(1)); 95 return QDate(year.value_or(2000), static_cast<unsigned int>(month.value_or(Date::Month::Jan)), day.value_or(1));
89 } 96 }
90 97
91 nlohmann::json Date::GetAsAniListJson() const { 98 nlohmann::json Date::GetAsAniListJson() const {
92 return { 99 nlohmann::json json = {
93 {"year", year}, 100 {"year", nullptr},
94 {"month", month}, 101 {"month", nullptr},
95 {"day", day} 102 {"day", nullptr}
96 }; 103 };
104
105 if (year)
106 json["year"] = static_cast<unsigned int>(year.value());
107
108 if (month)
109 json["month"] = static_cast<unsigned char>(month.value());
110
111 if (day)
112 json["day"] = static_cast<unsigned char>(day.value());
113
114 return json;
97 } 115 }