Generated-output differences

quicktype output changed between the PR base and tested PR merge revisions.
← Back to the pull request
34test cases
94files differ
94modified
0new
0deleted
609changed lines
+480 −129insertions / deletions
Base 526168869ba8f05b9da09f364f96f0c130d3eb3f · PR merge 4b14ad572af1e19f4ce36e4d4c12c68192afb2ab · Head 68cdb19f9e0860f0516125a1c5e82a0bda63db21 · raw patch
Test case

test/inputs/json/misc/0a358.json

3 generated files · +14 −4
Mcplusplusdefault / quicktype.hpp+2 −2
@@ -149,12 +149,12 @@ namespace quicktype {
149149 inline void from_json(const json & j, Result& x) {
150150 if (!j.is_object()) throw std::runtime_error("Expected object");
151151 x.set_code(j.at("code").get<std::string>());
152- if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
152+ if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
153153 x.set_created_at(j.at("created_at").get<std::string>());
154154 if (j.find("id") != j.end() && !j.at("id").is_number_integer()) throw std::runtime_error("Expected integer");
155155 x.set_id(j.at("id").get<int64_t>());
156156 x.set_name(j.at("name").get<std::string>());
157- if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
157+ if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
158158 x.set_updated_at(j.at("updated_at").get<std::string>());
159159 x.set_uri(j.at("uri").get<std::string>());
160160 }
Mobjective-cdefault / QTTopLevel.m+4 −2
@@ -228,12 +228,14 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
228228 {
229229 if (self = [super init]) {
230230 if (![dict[@"code"] isKindOfClass:NSString.class]) return nil;
231- if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
231+ if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
232+ if (dict[@"created_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created_at"] substringToIndex:10]]) return nil;
232233 if (![dict[@"created_at"] isKindOfClass:NSString.class]) return nil;
233234 if (![dict[@"id"] isKindOfClass:NSNumber.class]) return nil;
234235 if ([dict[@"id"] doubleValue] != [dict[@"id"] longLongValue]) return nil;
235236 if (![dict[@"name"] isKindOfClass:NSString.class]) return nil;
236- if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
237+ if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
238+ if (dict[@"updated_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"updated_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"updated_at"] substringToIndex:10]]) return nil;
237239 if (![dict[@"updated_at"] isKindOfClass:NSString.class]) return nil;
238240 if (![dict[@"uri"] isKindOfClass:NSString.class]) return nil;
239241 [self setValuesForKeysWithDictionary:dict];
Mphpdefault / TopLevel.php+8 −0
@@ -583,6 +583,10 @@ class Result {
583583 */
584584 public static function fromCreatedAt(string $value): DateTime {
585585 $tmp = new DateTime($value);
586+ $errors = DateTime::getLastErrors();
587+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
588+ throw new Exception('Invalid date-time');
589+ }
586590 if (!is_a($tmp, 'DateTime')) {
587591 throw new Exception('Attribute Error:Result::');
588592 }
@@ -731,6 +735,10 @@ class Result {
731735 */
732736 public static function fromUpdatedAt(string $value): DateTime {
733737 $tmp = new DateTime($value);
738+ $errors = DateTime::getLastErrors();
739+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
740+ throw new Exception('Invalid date-time');
741+ }
734742 if (!is_a($tmp, 'DateTime')) {
735743 throw new Exception('Attribute Error:Result::');
736744 }
Test case

test/inputs/json/misc/0a91a.json

3 generated files · +56 −16
Mcplusplusdefault / quicktype.hpp+8 −8
@@ -1243,7 +1243,7 @@ namespace quicktype {
12431243 x.set_compare_url(j.at("compare_url").get<std::string>());
12441244 x.set_contents_url(j.at("contents_url").get<std::string>());
12451245 x.set_contributors_url(j.at("contributors_url").get<std::string>());
1246- if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
1246+ if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
12471247 x.set_created_at(j.at("created_at").get<std::string>());
12481248 x.set_default_branch(j.at("default_branch").get<std::string>());
12491249 x.set_deployments_url(j.at("deployments_url").get<std::string>());
@@ -1289,7 +1289,7 @@ namespace quicktype {
12891289 x.set_open_issues_count(j.at("open_issues_count").get<int64_t>());
12901290 x.set_owner(j.at("owner").get<MergedBy>());
12911291 x.set_pulls_url(j.at("pulls_url").get<std::string>());
1292- if (j.find("pushed_at") != j.end() && !std::regex_match(j.at("pushed_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
1292+ if (j.find("pushed_at") != j.end() && !std::regex_match(j.at("pushed_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
12931293 x.set_pushed_at(j.at("pushed_at").get<std::string>());
12941294 x.set_releases_url(j.at("releases_url").get<std::string>());
12951295 x.set_repo_private(j.at("private").get<bool>());
@@ -1306,7 +1306,7 @@ namespace quicktype {
13061306 x.set_tags_url(j.at("tags_url").get<std::string>());
13071307 x.set_teams_url(j.at("teams_url").get<std::string>());
13081308 x.set_trees_url(j.at("trees_url").get<std::string>());
1309- if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
1309+ if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
13101310 x.set_updated_at(j.at("updated_at").get<std::string>());
13111311 x.set_url(j.at("url").get<std::string>());
13121312 if (j.find("watchers") != j.end() && !j.at("watchers").is_number_integer()) throw std::runtime_error("Expected integer");
@@ -1450,7 +1450,7 @@ namespace quicktype {
14501450 x.set_body(j.at("body").get<std::string>());
14511451 if (j.find("changed_files") != j.end() && !j.at("changed_files").is_number_integer()) throw std::runtime_error("Expected integer");
14521452 x.set_changed_files(j.at("changed_files").get<int64_t>());
1453- if (j.find("closed_at") != j.end() && !std::regex_match(j.at("closed_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
1453+ if (j.find("closed_at") != j.end() && !std::regex_match(j.at("closed_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
14541454 x.set_closed_at(j.at("closed_at").get<std::string>());
14551455 if (j.find("comments") != j.end() && !j.at("comments").is_number_integer()) throw std::runtime_error("Expected integer");
14561456 x.set_comments(j.at("comments").get<int64_t>());
@@ -1458,7 +1458,7 @@ namespace quicktype {
14581458 if (j.find("commits") != j.end() && !j.at("commits").is_number_integer()) throw std::runtime_error("Expected integer");
14591459 x.set_commits(j.at("commits").get<int64_t>());
14601460 x.set_commits_url(j.at("commits_url").get<std::string>());
1461- if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
1461+ if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
14621462 x.set_created_at(j.at("created_at").get<std::string>());
14631463 if (j.find("deletions") != j.end() && !j.at("deletions").is_number_integer()) throw std::runtime_error("Expected integer");
14641464 x.set_deletions(j.at("deletions").get<int64_t>());
@@ -1475,7 +1475,7 @@ namespace quicktype {
14751475 x.set_mergeable(get_untyped(j, "mergeable"));
14761476 x.set_mergeable_state(j.at("mergeable_state").get<std::string>());
14771477 x.set_merged(j.at("merged").get<bool>());
1478- if (j.find("merged_at") != j.end() && !std::regex_match(j.at("merged_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
1478+ if (j.find("merged_at") != j.end() && !std::regex_match(j.at("merged_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
14791479 x.set_merged_at(j.at("merged_at").get<std::string>());
14801480 x.set_merged_by(j.at("merged_by").get<MergedBy>());
14811481 x.set_milestone(get_untyped(j, "milestone"));
@@ -1491,7 +1491,7 @@ namespace quicktype {
14911491 x.set_state(j.at("state").get<std::string>());
14921492 x.set_statuses_url(j.at("statuses_url").get<std::string>());
14931493 x.set_title(j.at("title").get<std::string>());
1494- if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
1494+ if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
14951495 x.set_updated_at(j.at("updated_at").get<std::string>());
14961496 x.set_url(j.at("url").get<std::string>());
14971497 x.set_user(j.at("user").get<MergedBy>());
@@ -1613,7 +1613,7 @@ namespace quicktype {
16131613 inline void from_json(const json & j, TopLevelElement& x) {
16141614 if (!j.is_object()) throw std::runtime_error("Expected object");
16151615 x.set_actor(j.at("actor").get<Actor>());
1616- if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
1616+ if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
16171617 x.set_created_at(j.at("created_at").get<std::string>());
16181618 x.set_id(j.at("id").get<std::string>());
16191619 if (j.find("org") != j.end() && j.at("org").is_null()) throw std::runtime_error("Unexpected null");
Mobjective-cdefault / QTTopLevel.m+16 −8
@@ -175,7 +175,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
175175 {
176176 if (self = [super init]) {
177177 if (![dict[@"actor"] isKindOfClass:NSDictionary.class]) return nil;
178- if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
178+ if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
179+ if (dict[@"created_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created_at"] substringToIndex:10]]) return nil;
179180 if (![dict[@"created_at"] isKindOfClass:NSString.class]) return nil;
180181 if (![dict[@"id"] isKindOfClass:NSString.class]) return nil;
181182 if (![dict[@"public"] isKindOfClass:NSNumber.class]) return nil;
@@ -539,7 +540,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
539540 if (![dict[@"body"] isKindOfClass:NSString.class]) return nil;
540541 if (![dict[@"changed_files"] isKindOfClass:NSNumber.class]) return nil;
541542 if ([dict[@"changed_files"] doubleValue] != [dict[@"changed_files"] longLongValue]) return nil;
542- if (dict[@"closed_at"] && [dict[@"closed_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
543+ if (dict[@"closed_at"] && [dict[@"closed_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
544+ if (dict[@"closed_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"closed_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"closed_at"] substringToIndex:10]]) return nil;
543545 if (![dict[@"closed_at"] isKindOfClass:NSString.class]) return nil;
544546 if (![dict[@"comments"] isKindOfClass:NSNumber.class]) return nil;
545547 if ([dict[@"comments"] doubleValue] != [dict[@"comments"] longLongValue]) return nil;
@@ -547,7 +549,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
547549 if (![dict[@"commits"] isKindOfClass:NSNumber.class]) return nil;
548550 if ([dict[@"commits"] doubleValue] != [dict[@"commits"] longLongValue]) return nil;
549551 if (![dict[@"commits_url"] isKindOfClass:NSString.class]) return nil;
550- if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
552+ if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
553+ if (dict[@"created_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created_at"] substringToIndex:10]]) return nil;
551554 if (![dict[@"created_at"] isKindOfClass:NSString.class]) return nil;
552555 if (![dict[@"deletions"] isKindOfClass:NSNumber.class]) return nil;
553556 if ([dict[@"deletions"] doubleValue] != [dict[@"deletions"] longLongValue]) return nil;
@@ -564,7 +567,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
564567 if (![dict[@"merge_commit_sha"] isKindOfClass:NSString.class]) return nil;
565568 if (!dict[@"mergeable"]) return nil;
566569 if (![dict[@"mergeable_state"] isKindOfClass:NSString.class]) return nil;
567- if (dict[@"merged_at"] && [dict[@"merged_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
570+ if (dict[@"merged_at"] && [dict[@"merged_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
571+ if (dict[@"merged_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"merged_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"merged_at"] substringToIndex:10]]) return nil;
568572 if (![dict[@"merged_at"] isKindOfClass:NSString.class]) return nil;
569573 if (![dict[@"merged_by"] isKindOfClass:NSDictionary.class]) return nil;
570574 if (!dict[@"milestone"]) return nil;
@@ -580,7 +584,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
580584 if (![dict[@"state"] isKindOfClass:NSString.class]) return nil;
581585 if (![dict[@"statuses_url"] isKindOfClass:NSString.class]) return nil;
582586 if (![dict[@"title"] isKindOfClass:NSString.class]) return nil;
583- if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
587+ if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
588+ if (dict[@"updated_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"updated_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"updated_at"] substringToIndex:10]]) return nil;
584589 if (![dict[@"updated_at"] isKindOfClass:NSString.class]) return nil;
585590 if (![dict[@"url"] isKindOfClass:NSString.class]) return nil;
586591 if (![dict[@"user"] isKindOfClass:NSDictionary.class]) return nil;
@@ -794,7 +799,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
794799 if (![dict[@"compare_url"] isKindOfClass:NSString.class]) return nil;
795800 if (![dict[@"contents_url"] isKindOfClass:NSString.class]) return nil;
796801 if (![dict[@"contributors_url"] isKindOfClass:NSString.class]) return nil;
797- if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
802+ if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
803+ if (dict[@"created_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created_at"] substringToIndex:10]]) return nil;
798804 if (![dict[@"created_at"] isKindOfClass:NSString.class]) return nil;
799805 if (![dict[@"default_branch"] isKindOfClass:NSString.class]) return nil;
800806 if (![dict[@"deployments_url"] isKindOfClass:NSString.class]) return nil;
@@ -840,7 +846,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
840846 if ([dict[@"open_issues_count"] doubleValue] != [dict[@"open_issues_count"] longLongValue]) return nil;
841847 if (![dict[@"owner"] isKindOfClass:NSDictionary.class]) return nil;
842848 if (![dict[@"pulls_url"] isKindOfClass:NSString.class]) return nil;
843- if (dict[@"pushed_at"] && [dict[@"pushed_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
849+ if (dict[@"pushed_at"] && [dict[@"pushed_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
850+ if (dict[@"pushed_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"pushed_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"pushed_at"] substringToIndex:10]]) return nil;
844851 if (![dict[@"pushed_at"] isKindOfClass:NSString.class]) return nil;
845852 if (![dict[@"releases_url"] isKindOfClass:NSString.class]) return nil;
846853 if (![dict[@"size"] isKindOfClass:NSNumber.class]) return nil;
@@ -857,7 +864,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
857864 if (![dict[@"teams_url"] isKindOfClass:NSString.class]) return nil;
858865 if (!dict[@"description"]) return nil;
859866 if (![dict[@"trees_url"] isKindOfClass:NSString.class]) return nil;
860- if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
867+ if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
868+ if (dict[@"updated_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"updated_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"updated_at"] substringToIndex:10]]) return nil;
861869 if (![dict[@"updated_at"] isKindOfClass:NSString.class]) return nil;
862870 if (![dict[@"url"] isKindOfClass:NSString.class]) return nil;
863871 if (![dict[@"watchers"] isKindOfClass:NSNumber.class]) return nil;
Mphpdefault / TopLevel.php+32 −0
@@ -89,6 +89,10 @@ class TopLevel {
8989 */
9090 public static function fromCreatedAt(string $value): DateTime {
9191 $tmp = new DateTime($value);
92+ $errors = DateTime::getLastErrors();
93+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
94+ throw new Exception('Invalid date-time');
95+ }
9296 if (!is_a($tmp, 'DateTime')) {
9397 throw new Exception('Attribute Error:TopLevel::');
9498 }
@@ -2790,6 +2794,10 @@ class PullRequest {
27902794 */
27912795 public static function fromClosedAt(string $value): DateTime {
27922796 $tmp = new DateTime($value);
2797+ $errors = DateTime::getLastErrors();
2798+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
2799+ throw new Exception('Invalid date-time');
2800+ }
27932801 if (!is_a($tmp, 'DateTime')) {
27942802 throw new Exception('Attribute Error:PullRequest::');
27952803 }
@@ -3032,6 +3040,10 @@ class PullRequest {
30323040 */
30333041 public static function fromCreatedAt(string $value): DateTime {
30343042 $tmp = new DateTime($value);
3043+ $errors = DateTime::getLastErrors();
3044+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
3045+ throw new Exception('Invalid date-time');
3046+ }
30353047 if (!is_a($tmp, 'DateTime')) {
30363048 throw new Exception('Attribute Error:PullRequest::');
30373049 }
@@ -3702,6 +3714,10 @@ class PullRequest {
37023714 */
37033715 public static function fromMergedAt(string $value): DateTime {
37043716 $tmp = new DateTime($value);
3717+ $errors = DateTime::getLastErrors();
3718+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
3719+ throw new Exception('Invalid date-time');
3720+ }
37053721 if (!is_a($tmp, 'DateTime')) {
37063722 throw new Exception('Attribute Error:PullRequest::');
37073723 }
@@ -4338,6 +4354,10 @@ class PullRequest {
43384354 */
43394355 public static function fromUpdatedAt(string $value): DateTime {
43404356 $tmp = new DateTime($value);
4357+ $errors = DateTime::getLastErrors();
4358+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
4359+ throw new Exception('Invalid date-time');
4360+ }
43414361 if (!is_a($tmp, 'DateTime')) {
43424362 throw new Exception('Attribute Error:PullRequest::');
43434363 }
@@ -5873,6 +5893,10 @@ class BaseRepo {
58735893 */
58745894 public static function fromCreatedAt(string $value): DateTime {
58755895 $tmp = new DateTime($value);
5896+ $errors = DateTime::getLastErrors();
5897+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
5898+ throw new Exception('Invalid date-time');
5899+ }
58765900 if (!is_a($tmp, 'DateTime')) {
58775901 throw new Exception('Attribute Error:BaseRepo::');
58785902 }
@@ -7817,6 +7841,10 @@ class BaseRepo {
78177841 */
78187842 public static function fromPushedAt(string $value): DateTime {
78197843 $tmp = new DateTime($value);
7844+ $errors = DateTime::getLastErrors();
7845+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
7846+ throw new Exception('Invalid date-time');
7847+ }
78207848 if (!is_a($tmp, 'DateTime')) {
78217849 throw new Exception('Attribute Error:BaseRepo::');
78227850 }
@@ -8435,6 +8463,10 @@ class BaseRepo {
84358463 */
84368464 public static function fromUpdatedAt(string $value): DateTime {
84378465 $tmp = new DateTime($value);
8466+ $errors = DateTime::getLastErrors();
8467+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
8468+ throw new Exception('Invalid date-time');
8469+ }
84388470 if (!is_a($tmp, 'DateTime')) {
84398471 throw new Exception('Attribute Error:BaseRepo::');
84408472 }
Test case

test/inputs/json/misc/16bc5.json

3 generated files · +7 −2
Mcplusplusdefault / quicktype.hpp+1 −1
@@ -711,7 +711,7 @@ namespace quicktype {
711711 if (!j.is_object()) throw std::runtime_error("Expected object");
712712 if (j.find("count") != j.end() && !j.at("count").is_number_integer()) throw std::runtime_error("Expected integer");
713713 x.set_count(j.at("count").get<int64_t>());
714- if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
714+ if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
715715 x.set_created(j.at("created").get<std::string>());
716716 x.set_lang(j.at("lang").get<std::string>());
717717 x.set_results(j.at("results").get<Results>());
Mobjective-cdefault / QTTopLevel.m+2 −1
@@ -217,7 +217,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
217217 if (self = [super init]) {
218218 if (![dict[@"count"] isKindOfClass:NSNumber.class]) return nil;
219219 if ([dict[@"count"] doubleValue] != [dict[@"count"] longLongValue]) return nil;
220- if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
220+ if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
221+ if (dict[@"created"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created"] substringToIndex:10]]) return nil;
221222 if (![dict[@"created"] isKindOfClass:NSString.class]) return nil;
222223 if (![dict[@"lang"] isKindOfClass:NSString.class]) return nil;
223224 if (![dict[@"results"] isKindOfClass:NSDictionary.class]) return nil;
Mphpdefault / TopLevel.php+4 −0
@@ -178,6 +178,10 @@ class Query {
178178 */
179179 public static function fromCreated(string $value): DateTime {
180180 $tmp = new DateTime($value);
181+ $errors = DateTime::getLastErrors();
182+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
183+ throw new Exception('Invalid date-time');
184+ }
181185 if (!is_a($tmp, 'DateTime')) {
182186 throw new Exception('Attribute Error:Query::');
183187 }
Test case

test/inputs/json/misc/262f0.json

3 generated files · +7 −2
Mcplusplusdefault / quicktype.hpp+1 −1
@@ -716,7 +716,7 @@ namespace quicktype {
716716 if (!j.is_object()) throw std::runtime_error("Expected object");
717717 if (j.find("count") != j.end() && !j.at("count").is_number_integer()) throw std::runtime_error("Expected integer");
718718 x.set_count(j.at("count").get<int64_t>());
719- if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
719+ if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
720720 x.set_created(j.at("created").get<std::string>());
721721 x.set_lang(j.at("lang").get<std::string>());
722722 x.set_results(j.at("results").get<Results>());
Mobjective-cdefault / QTTopLevel.m+2 −1
@@ -246,7 +246,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
246246 if (self = [super init]) {
247247 if (![dict[@"count"] isKindOfClass:NSNumber.class]) return nil;
248248 if ([dict[@"count"] doubleValue] != [dict[@"count"] longLongValue]) return nil;
249- if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
249+ if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
250+ if (dict[@"created"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created"] substringToIndex:10]]) return nil;
250251 if (![dict[@"created"] isKindOfClass:NSString.class]) return nil;
251252 if (![dict[@"lang"] isKindOfClass:NSString.class]) return nil;
252253 if (![dict[@"results"] isKindOfClass:NSDictionary.class]) return nil;
Mphpdefault / TopLevel.php+4 −0
@@ -178,6 +178,10 @@ class Query {
178178 */
179179 public static function fromCreated(string $value): DateTime {
180180 $tmp = new DateTime($value);
181+ $errors = DateTime::getLastErrors();
182+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
183+ throw new Exception('Invalid date-time');
184+ }
181185 if (!is_a($tmp, 'DateTime')) {
182186 throw new Exception('Attribute Error:Query::');
183187 }
Test case

test/inputs/json/misc/32d5c.json

1 generated file · +4 −0
Mphpdefault / TopLevel.php+4 −0
@@ -42,6 +42,10 @@ class TopLevel {
4242 public static function fromBirthDate(?string $value): ?DateTime {
4343 if (!is_null($value)) {
4444 $tmp = new DateTime($value);
45+ $errors = DateTime::getLastErrors();
46+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
47+ throw new Exception('Invalid date-time');
48+ }
4549 if (!is_a($tmp, 'DateTime')) {
4650 throw new Exception('Attribute Error:TopLevel::');
4751 }
Test case

test/inputs/json/misc/337ed.json

3 generated files · +42 −12
Mcplusplusdefault / quicktype.hpp+6 −6
@@ -386,13 +386,13 @@ namespace quicktype {
386386 if (!j.is_object()) throw std::runtime_error("Expected object");
387387 if (j.find("amount") != j.end() && !j.at("amount").is_number_integer()) throw std::runtime_error("Expected integer");
388388 x.set_amount(j.at("amount").get<int64_t>());
389- if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
389+ if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
390390 x.set_created_at(j.at("created_at").get<std::string>());
391391 x.set_id(j.at("id").get<std::string>());
392392 x.set_name(j.at("name").get<std::string>());
393393 x.set_status(j.at("status").get<Status>());
394394 x.set_type(j.at("type").get<CustomIncomeType>());
395- if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
395+ if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
396396 x.set_updated_at(j.at("updated_at").get<std::string>());
397397 x.set_uri(j.at("uri").get<std::string>());
398398 }
@@ -417,12 +417,12 @@ namespace quicktype {
417417 x.set_cost_max(get_stack_optional<int64_t>(j, "cost_max"));
418418 j.at("cost_min");
419419 x.set_cost_min(get_stack_optional<int64_t>(j, "cost_min"));
420- if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
420+ if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
421421 x.set_created_at(j.at("created_at").get<std::string>());
422422 x.set_custom_incomes(j.at("customIncomes").get<std::vector<CustomIncome>>());
423423 x.set_direct_rep_costs_max(get_untyped(j, "direct_rep_costs_max"));
424424 x.set_direct_rep_costs_min(get_untyped(j, "direct_rep_costs_min"));
425- if (j.find("end_date") != j.end() && !std::regex_match(j.at("end_date").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
425+ if (j.find("end_date") != j.end() && !std::regex_match(j.at("end_date").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
426426 x.set_end_date(j.at("end_date").get<std::string>());
427427 if (j.find("eur_sources_grants") != j.end() && !j.at("eur_sources_grants").is_number_integer()) throw std::runtime_error("Expected integer");
428428 x.set_eur_sources_grants(j.at("eur_sources_grants").get<int64_t>());
@@ -451,7 +451,7 @@ namespace quicktype {
451451 j.at("public_financing_total");
452452 x.set_public_financing_total(get_stack_optional<int64_t>(j, "public_financing_total"));
453453 x.set_representative(j.at("representative").get<std::string>());
454- if (j.find("start_date") != j.end() && !std::regex_match(j.at("start_date").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
454+ if (j.find("start_date") != j.end() && !std::regex_match(j.at("start_date").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
455455 x.set_start_date(j.at("start_date").get<std::string>());
456456 x.set_status(j.at("status").get<Status>());
457457 j.at("total_budget");
@@ -463,7 +463,7 @@ namespace quicktype {
463463 j.at("turnover_min");
464464 x.set_turnover_min(get_stack_optional<int64_t>(j, "turnover_min"));
465465 x.set_type(j.at("type").get<ResultType>());
466- if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
466+ if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
467467 x.set_updated_at(j.at("updated_at").get<std::string>());
468468 x.set_uri(j.at("uri").get<std::string>());
469469 }
Mobjective-cdefault / QTTopLevel.m+12 −6
@@ -344,12 +344,14 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
344344 if (!dict[@"cost_absolute"]) return nil;
345345 if (!dict[@"cost_max"]) return nil;
346346 if (!dict[@"cost_min"]) return nil;
347- if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
347+ if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
348+ if (dict[@"created_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created_at"] substringToIndex:10]]) return nil;
348349 if (![dict[@"created_at"] isKindOfClass:NSString.class]) return nil;
349350 if (![dict[@"customIncomes"] isKindOfClass:NSArray.class]) return nil;
350351 if (!dict[@"direct_rep_costs_max"]) return nil;
351352 if (!dict[@"direct_rep_costs_min"]) return nil;
352- if (dict[@"end_date"] && [dict[@"end_date"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
353+ if (dict[@"end_date"] && [dict[@"end_date"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
354+ if (dict[@"end_date"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"end_date"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"end_date"] substringToIndex:10]]) return nil;
353355 if (![dict[@"end_date"] isKindOfClass:NSString.class]) return nil;
354356 if (![dict[@"eur_sources_grants"] isKindOfClass:NSNumber.class]) return nil;
355357 if ([dict[@"eur_sources_grants"] doubleValue] != [dict[@"eur_sources_grants"] longLongValue]) return nil;
@@ -367,7 +369,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
367369 if (!dict[@"public_financing_national"]) return nil;
368370 if (!dict[@"public_financing_total"]) return nil;
369371 if (![dict[@"representative"] isKindOfClass:NSString.class]) return nil;
370- if (dict[@"start_date"] && [dict[@"start_date"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
372+ if (dict[@"start_date"] && [dict[@"start_date"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
373+ if (dict[@"start_date"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"start_date"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"start_date"] substringToIndex:10]]) return nil;
371374 if (![dict[@"start_date"] isKindOfClass:NSString.class]) return nil;
372375 if (![dict[@"status"] isKindOfClass:NSString.class]) return nil;
373376 if (!dict[@"new_organisation"]) return nil;
@@ -376,7 +379,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
376379 if (!dict[@"turnover_max"]) return nil;
377380 if (!dict[@"turnover_min"]) return nil;
378381 if (![dict[@"type"] isKindOfClass:NSString.class]) return nil;
379- if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
382+ if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
383+ if (dict[@"updated_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"updated_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"updated_at"] substringToIndex:10]]) return nil;
380384 if (![dict[@"updated_at"] isKindOfClass:NSString.class]) return nil;
381385 if (![dict[@"uri"] isKindOfClass:NSString.class]) return nil;
382386 [self setValuesForKeysWithDictionary:dict];
@@ -447,13 +451,15 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
447451 if (self = [super init]) {
448452 if (![dict[@"amount"] isKindOfClass:NSNumber.class]) return nil;
449453 if ([dict[@"amount"] doubleValue] != [dict[@"amount"] longLongValue]) return nil;
450- if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
454+ if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
455+ if (dict[@"created_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created_at"] substringToIndex:10]]) return nil;
451456 if (![dict[@"created_at"] isKindOfClass:NSString.class]) return nil;
452457 if (![dict[@"id"] isKindOfClass:NSString.class]) return nil;
453458 if (![dict[@"name"] isKindOfClass:NSString.class]) return nil;
454459 if (![dict[@"status"] isKindOfClass:NSString.class]) return nil;
455460 if (![dict[@"type"] isKindOfClass:NSString.class]) return nil;
456- if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
461+ if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
462+ if (dict[@"updated_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"updated_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"updated_at"] substringToIndex:10]]) return nil;
457463 if (![dict[@"updated_at"] isKindOfClass:NSString.class]) return nil;
458464 if (![dict[@"uri"] isKindOfClass:NSString.class]) return nil;
459465 [self setValuesForKeysWithDictionary:dict];
Mphpdefault / TopLevel.php+24 −0
@@ -785,6 +785,10 @@ class Result {
785785 */
786786 public static function fromCreatedAt(string $value): DateTime {
787787 $tmp = new DateTime($value);
788+ $errors = DateTime::getLastErrors();
789+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
790+ throw new Exception('Invalid date-time');
791+ }
788792 if (!is_a($tmp, 'DateTime')) {
789793 throw new Exception('Attribute Error:Result::');
790794 }
@@ -998,6 +1002,10 @@ class Result {
9981002 */
9991003 public static function fromEndDate(string $value): DateTime {
10001004 $tmp = new DateTime($value);
1005+ $errors = DateTime::getLastErrors();
1006+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
1007+ throw new Exception('Invalid date-time');
1008+ }
10011009 if (!is_a($tmp, 'DateTime')) {
10021010 throw new Exception('Attribute Error:Result::');
10031011 }
@@ -1860,6 +1868,10 @@ class Result {
18601868 */
18611869 public static function fromStartDate(string $value): DateTime {
18621870 $tmp = new DateTime($value);
1871+ $errors = DateTime::getLastErrors();
1872+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
1873+ throw new Exception('Invalid date-time');
1874+ }
18631875 if (!is_a($tmp, 'DateTime')) {
18641876 throw new Exception('Attribute Error:Result::');
18651877 }
@@ -2238,6 +2250,10 @@ class Result {
22382250 */
22392251 public static function fromUpdatedAt(string $value): DateTime {
22402252 $tmp = new DateTime($value);
2253+ $errors = DateTime::getLastErrors();
2254+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
2255+ throw new Exception('Invalid date-time');
2256+ }
22412257 if (!is_a($tmp, 'DateTime')) {
22422258 throw new Exception('Attribute Error:Result::');
22432259 }
@@ -2678,6 +2694,10 @@ class CustomIncome {
26782694 */
26792695 public static function fromCreatedAt(string $value): DateTime {
26802696 $tmp = new DateTime($value);
2697+ $errors = DateTime::getLastErrors();
2698+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
2699+ throw new Exception('Invalid date-time');
2700+ }
26812701 if (!is_a($tmp, 'DateTime')) {
26822702 throw new Exception('Attribute Error:CustomIncome::');
26832703 }
@@ -2922,6 +2942,10 @@ class CustomIncome {
29222942 */
29232943 public static function fromUpdatedAt(string $value): DateTime {
29242944 $tmp = new DateTime($value);
2945+ $errors = DateTime::getLastErrors();
2946+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
2947+ throw new Exception('Invalid date-time');
2948+ }
29252949 if (!is_a($tmp, 'DateTime')) {
29262950 throw new Exception('Attribute Error:CustomIncome::');
29272951 }
Test case

test/inputs/json/misc/3f1ce.json

3 generated files · +7 −2
Mcplusplusdefault / quicktype.hpp+1 −1
@@ -716,7 +716,7 @@ namespace quicktype {
716716 if (!j.is_object()) throw std::runtime_error("Expected object");
717717 if (j.find("count") != j.end() && !j.at("count").is_number_integer()) throw std::runtime_error("Expected integer");
718718 x.set_count(j.at("count").get<int64_t>());
719- if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
719+ if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
720720 x.set_created(j.at("created").get<std::string>());
721721 x.set_lang(j.at("lang").get<std::string>());
722722 x.set_results(j.at("results").get<Results>());
Mobjective-cdefault / QTTopLevel.m+2 −1
@@ -242,7 +242,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
242242 if (self = [super init]) {
243243 if (![dict[@"count"] isKindOfClass:NSNumber.class]) return nil;
244244 if ([dict[@"count"] doubleValue] != [dict[@"count"] longLongValue]) return nil;
245- if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
245+ if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
246+ if (dict[@"created"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created"] substringToIndex:10]]) return nil;
246247 if (![dict[@"created"] isKindOfClass:NSString.class]) return nil;
247248 if (![dict[@"lang"] isKindOfClass:NSString.class]) return nil;
248249 if (![dict[@"results"] isKindOfClass:NSDictionary.class]) return nil;
Mphpdefault / TopLevel.php+4 −0
@@ -178,6 +178,10 @@ class Query {
178178 */
179179 public static function fromCreated(string $value): DateTime {
180180 $tmp = new DateTime($value);
181+ $errors = DateTime::getLastErrors();
182+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
183+ throw new Exception('Invalid date-time');
184+ }
181185 if (!is_a($tmp, 'DateTime')) {
182186 throw new Exception('Attribute Error:Query::');
183187 }
Test case

test/inputs/json/misc/4c547.json

3 generated files · +7 −2
Mcplusplusdefault / quicktype.hpp+1 −1
@@ -711,7 +711,7 @@ namespace quicktype {
711711 if (!j.is_object()) throw std::runtime_error("Expected object");
712712 if (j.find("count") != j.end() && !j.at("count").is_number_integer()) throw std::runtime_error("Expected integer");
713713 x.set_count(j.at("count").get<int64_t>());
714- if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
714+ if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
715715 x.set_created(j.at("created").get<std::string>());
716716 x.set_lang(j.at("lang").get<std::string>());
717717 x.set_results(j.at("results").get<Results>());
Mobjective-cdefault / QTTopLevel.m+2 −1
@@ -217,7 +217,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
217217 if (self = [super init]) {
218218 if (![dict[@"count"] isKindOfClass:NSNumber.class]) return nil;
219219 if ([dict[@"count"] doubleValue] != [dict[@"count"] longLongValue]) return nil;
220- if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
220+ if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
221+ if (dict[@"created"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created"] substringToIndex:10]]) return nil;
221222 if (![dict[@"created"] isKindOfClass:NSString.class]) return nil;
222223 if (![dict[@"lang"] isKindOfClass:NSString.class]) return nil;
223224 if (![dict[@"results"] isKindOfClass:NSDictionary.class]) return nil;
Mphpdefault / TopLevel.php+4 −0
@@ -178,6 +178,10 @@ class Query {
178178 */
179179 public static function fromCreated(string $value): DateTime {
180180 $tmp = new DateTime($value);
181+ $errors = DateTime::getLastErrors();
182+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
183+ throw new Exception('Invalid date-time');
184+ }
181185 if (!is_a($tmp, 'DateTime')) {
182186 throw new Exception('Attribute Error:Query::');
183187 }
Test case

test/inputs/json/misc/54d32.json

3 generated files · +14 −4
Mcplusplusdefault / quicktype.hpp+2 −2
@@ -153,13 +153,13 @@ namespace quicktype {
153153
154154 inline void from_json(const json & j, Result& x) {
155155 if (!j.is_object()) throw std::runtime_error("Expected object");
156- if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
156+ if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
157157 x.set_created_at(j.at("created_at").get<std::string>());
158158 x.set_id(j.at("id").get<std::string>());
159159 x.set_person_id(j.at("person_id").get<std::string>());
160160 x.set_representative_id(j.at("representative_id").get<std::string>());
161161 x.set_status(j.at("status").get<Status>());
162- if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
162+ if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
163163 x.set_updated_at(j.at("updated_at").get<std::string>());
164164 }
Mobjective-cdefault / QTTopLevel.m+4 −2
@@ -254,13 +254,15 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
254254 - (instancetype)initWithJSONDictionary:(NSDictionary *)dict
255255 {
256256 if (self = [super init]) {
257- if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
257+ if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
258+ if (dict[@"created_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created_at"] substringToIndex:10]]) return nil;
258259 if (![dict[@"created_at"] isKindOfClass:NSString.class]) return nil;
259260 if (![dict[@"id"] isKindOfClass:NSString.class]) return nil;
260261 if (![dict[@"person_id"] isKindOfClass:NSString.class]) return nil;
261262 if (![dict[@"representative_id"] isKindOfClass:NSString.class]) return nil;
262263 if (![dict[@"status"] isKindOfClass:NSString.class]) return nil;
263- if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
264+ if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
265+ if (dict[@"updated_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"updated_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"updated_at"] substringToIndex:10]]) return nil;
264266 if (![dict[@"updated_at"] isKindOfClass:NSString.class]) return nil;
265267 [self setValuesForKeysWithDictionary:dict];
266268 _status = [QTStatus withValue:(id)_status];
Mphpdefault / TopLevel.php+8 −0
@@ -536,6 +536,10 @@ class Result {
536536 */
537537 public static function fromCreatedAt(string $value): DateTime {
538538 $tmp = new DateTime($value);
539+ $errors = DateTime::getLastErrors();
540+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
541+ throw new Exception('Invalid date-time');
542+ }
539543 if (!is_a($tmp, 'DateTime')) {
540544 throw new Exception('Attribute Error:Result::');
541545 }
@@ -779,6 +783,10 @@ class Result {
779783 */
780784 public static function fromUpdatedAt(string $value): DateTime {
781785 $tmp = new DateTime($value);
786+ $errors = DateTime::getLastErrors();
787+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
788+ throw new Exception('Invalid date-time');
789+ }
782790 if (!is_a($tmp, 'DateTime')) {
783791 throw new Exception('Attribute Error:Result::');
784792 }
Test case

test/inputs/json/misc/5eae5.json

3 generated files · +7 −2
Mcplusplusdefault / quicktype.hpp+1 −1
@@ -69,7 +69,7 @@ namespace quicktype {
6969
7070 inline void from_json(const json & j, TopLevelElement& x) {
7171 if (!j.is_object()) throw std::runtime_error("Expected object");
72- if (j.find("Date") != j.end() && !std::regex_match(j.at("Date").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
72+ if (j.find("Date") != j.end() && !std::regex_match(j.at("Date").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
7373 x.set_date(j.at("Date").get<std::string>());
7474 if (j.find("ID") != j.end() && !j.at("ID").is_number_integer()) throw std::runtime_error("Expected integer");
7575 x.set_id(j.at("ID").get<int64_t>());
Mobjective-cdefault / QTTopLevel.m+2 −1
@@ -82,7 +82,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
8282 - (instancetype)initWithJSONDictionary:(NSDictionary *)dict
8383 {
8484 if (self = [super init]) {
85- if (dict[@"Date"] && [dict[@"Date"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
85+ if (dict[@"Date"] && [dict[@"Date"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
86+ if (dict[@"Date"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"Date"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"Date"] substringToIndex:10]]) return nil;
8687 if (![dict[@"Date"] isKindOfClass:NSString.class]) return nil;
8788 if (![dict[@"ID"] isKindOfClass:NSNumber.class]) return nil;
8889 if ([dict[@"ID"] doubleValue] != [dict[@"ID"] longLongValue]) return nil;
Mphpdefault / TopLevel.php+4 −0
@@ -29,6 +29,10 @@ class TopLevel {
2929 */
3030 public static function fromDate(string $value): DateTime {
3131 $tmp = new DateTime($value);
32+ $errors = DateTime::getLastErrors();
33+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
34+ throw new Exception('Invalid date-time');
35+ }
3236 if (!is_a($tmp, 'DateTime')) {
3337 throw new Exception('Attribute Error:TopLevel::');
3438 }
Test case

test/inputs/json/misc/6dec6.json

3 generated files · +7 −2
Mcplusplusdefault / quicktype.hpp+1 −1
@@ -716,7 +716,7 @@ namespace quicktype {
716716 if (!j.is_object()) throw std::runtime_error("Expected object");
717717 if (j.find("count") != j.end() && !j.at("count").is_number_integer()) throw std::runtime_error("Expected integer");
718718 x.set_count(j.at("count").get<int64_t>());
719- if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
719+ if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
720720 x.set_created(j.at("created").get<std::string>());
721721 x.set_lang(j.at("lang").get<std::string>());
722722 x.set_results(j.at("results").get<Results>());
Mobjective-cdefault / QTTopLevel.m+2 −1
@@ -246,7 +246,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
246246 if (self = [super init]) {
247247 if (![dict[@"count"] isKindOfClass:NSNumber.class]) return nil;
248248 if ([dict[@"count"] doubleValue] != [dict[@"count"] longLongValue]) return nil;
249- if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
249+ if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
250+ if (dict[@"created"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created"] substringToIndex:10]]) return nil;
250251 if (![dict[@"created"] isKindOfClass:NSString.class]) return nil;
251252 if (![dict[@"lang"] isKindOfClass:NSString.class]) return nil;
252253 if (![dict[@"results"] isKindOfClass:NSDictionary.class]) return nil;
Mphpdefault / TopLevel.php+4 −0
@@ -178,6 +178,10 @@ class Query {
178178 */
179179 public static function fromCreated(string $value): DateTime {
180180 $tmp = new DateTime($value);
181+ $errors = DateTime::getLastErrors();
182+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
183+ throw new Exception('Invalid date-time');
184+ }
181185 if (!is_a($tmp, 'DateTime')) {
182186 throw new Exception('Attribute Error:Query::');
183187 }
Test case

test/inputs/json/misc/734ad.json

3 generated files · +28 −8
Mcplusplusdefault / quicktype.hpp+4 −4
@@ -478,7 +478,7 @@ namespace quicktype {
478478 x.set_code_of_conduct(j.at("code_of_conduct").get<std::string>());
479479 if (j.find("contact_country") != j.end() && !j.at("contact_country").is_number_integer()) throw std::runtime_error("Expected integer");
480480 x.set_contact_country(j.at("contact_country").get<int64_t>());
481- if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
481+ if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
482482 x.set_created_at(j.at("created_at").get<std::string>());
483483 x.set_entity(j.at("entity").get<std::string>());
484484 x.set_goals(j.at("goals").get<std::string>());
@@ -498,7 +498,7 @@ namespace quicktype {
498498 x.set_id(j.at("id").get<std::string>());
499499 x.set_identification_code(j.at("identification_code").get<std::string>());
500500 x.set_info_members(j.at("info_members").get<std::string>());
501- if (j.find("last_update_date") != j.end() && !std::regex_match(j.at("last_update_date").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
501+ if (j.find("last_update_date") != j.end() && !std::regex_match(j.at("last_update_date").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
502502 x.set_last_update_date(j.at("last_update_date").get<std::string>());
503503 x.set_legal(j.at("legal").get<std::string>());
504504 x.set_legal_status(j.at("legal_status").get<std::string>());
@@ -524,14 +524,14 @@ namespace quicktype {
524524 x.set_number_of_natural_persons(get_stack_optional<int64_t>(j, "number_of_natural_persons"));
525525 j.at("other_code_of_conduct");
526526 x.set_other_code_of_conduct(get_stack_optional<std::string>(j, "other_code_of_conduct"));
527- if (j.find("registration_date") != j.end() && !std::regex_match(j.at("registration_date").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
527+ if (j.find("registration_date") != j.end() && !std::regex_match(j.at("registration_date").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
528528 x.set_registration_date(j.at("registration_date").get<std::string>());
529529 x.set_status(j.at("status").get<Status>());
530530 x.set_structure_members(j.at("structure_members").get<std::string>());
531531 if (j.find("sub_category") != j.end() && !j.at("sub_category").is_number_integer()) throw std::runtime_error("Expected integer");
532532 x.set_sub_category(j.at("sub_category").get<int64_t>());
533533 x.set_sub_category_title(j.at("sub_category_title").get<std::string>());
534- if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
534+ if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
535535 x.set_updated_at(j.at("updated_at").get<std::string>());
536536 x.set_uri(j.at("uri").get<std::string>());
537537 j.at("web_site_url");
Mobjective-cdefault / QTTopLevel.m+8 −4
@@ -318,7 +318,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
318318 if (![dict[@"code_of_conduct"] isKindOfClass:NSString.class]) return nil;
319319 if (![dict[@"contact_country"] isKindOfClass:NSNumber.class]) return nil;
320320 if ([dict[@"contact_country"] doubleValue] != [dict[@"contact_country"] longLongValue]) return nil;
321- if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
321+ if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
322+ if (dict[@"created_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created_at"] substringToIndex:10]]) return nil;
322323 if (![dict[@"created_at"] isKindOfClass:NSString.class]) return nil;
323324 if (![dict[@"entity"] isKindOfClass:NSString.class]) return nil;
324325 if (![dict[@"goals"] isKindOfClass:NSString.class]) return nil;
@@ -334,7 +335,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
334335 if (![dict[@"identification_code"] isKindOfClass:NSString.class]) return nil;
335336 if (![dict[@"id"] isKindOfClass:NSString.class]) return nil;
336337 if (![dict[@"info_members"] isKindOfClass:NSString.class]) return nil;
337- if (dict[@"last_update_date"] && [dict[@"last_update_date"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
338+ if (dict[@"last_update_date"] && [dict[@"last_update_date"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
339+ if (dict[@"last_update_date"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"last_update_date"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"last_update_date"] substringToIndex:10]]) return nil;
338340 if (![dict[@"last_update_date"] isKindOfClass:NSString.class]) return nil;
339341 if (![dict[@"legal"] isKindOfClass:NSString.class]) return nil;
340342 if (![dict[@"legal_status"] isKindOfClass:NSString.class]) return nil;
@@ -353,14 +355,16 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
353355 if (!dict[@"networking"]) return nil;
354356 if (!dict[@"number_of_natural_persons"]) return nil;
355357 if (!dict[@"other_code_of_conduct"]) return nil;
356- if (dict[@"registration_date"] && [dict[@"registration_date"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
358+ if (dict[@"registration_date"] && [dict[@"registration_date"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
359+ if (dict[@"registration_date"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"registration_date"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"registration_date"] substringToIndex:10]]) return nil;
357360 if (![dict[@"registration_date"] isKindOfClass:NSString.class]) return nil;
358361 if (![dict[@"status"] isKindOfClass:NSString.class]) return nil;
359362 if (![dict[@"structure_members"] isKindOfClass:NSString.class]) return nil;
360363 if (![dict[@"sub_category"] isKindOfClass:NSNumber.class]) return nil;
361364 if ([dict[@"sub_category"] doubleValue] != [dict[@"sub_category"] longLongValue]) return nil;
362365 if (![dict[@"sub_category_title"] isKindOfClass:NSString.class]) return nil;
363- if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
366+ if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
367+ if (dict[@"updated_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"updated_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"updated_at"] substringToIndex:10]]) return nil;
364368 if (![dict[@"updated_at"] isKindOfClass:NSString.class]) return nil;
365369 if (![dict[@"uri"] isKindOfClass:NSString.class]) return nil;
366370 if (!dict[@"web_site_url"]) return nil;
Mphpdefault / TopLevel.php+16 −0
@@ -1685,6 +1685,10 @@ class Result {
16851685 */
16861686 public static function fromCreatedAt(string $value): DateTime {
16871687 $tmp = new DateTime($value);
1688+ $errors = DateTime::getLastErrors();
1689+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
1690+ throw new Exception('Invalid date-time');
1691+ }
16881692 if (!is_a($tmp, 'DateTime')) {
16891693 throw new Exception('Attribute Error:Result::');
16901694 }
@@ -2437,6 +2441,10 @@ class Result {
24372441 */
24382442 public static function fromLastUpdateDate(string $value): DateTime {
24392443 $tmp = new DateTime($value);
2444+ $errors = DateTime::getLastErrors();
2445+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
2446+ throw new Exception('Invalid date-time');
2447+ }
24402448 if (!is_a($tmp, 'DateTime')) {
24412449 throw new Exception('Attribute Error:Result::');
24422450 }
@@ -3269,6 +3277,10 @@ class Result {
32693277 */
32703278 public static function fromRegistrationDate(string $value): DateTime {
32713279 $tmp = new DateTime($value);
3280+ $errors = DateTime::getLastErrors();
3281+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
3282+ throw new Exception('Invalid date-time');
3283+ }
32723284 if (!is_a($tmp, 'DateTime')) {
32733285 throw new Exception('Attribute Error:Result::');
32743286 }
@@ -3512,6 +3524,10 @@ class Result {
35123524 */
35133525 public static function fromUpdatedAt(string $value): DateTime {
35143526 $tmp = new DateTime($value);
3527+ $errors = DateTime::getLastErrors();
3528+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
3529+ throw new Exception('Invalid date-time');
3530+ }
35153531 if (!is_a($tmp, 'DateTime')) {
35163532 throw new Exception('Attribute Error:Result::');
35173533 }
Test case

test/inputs/json/misc/77392.json

3 generated files · +7 −2
Mcplusplusdefault / quicktype.hpp+1 −1
@@ -167,7 +167,7 @@ namespace quicktype {
167167 inline void from_json(const json & j, TopLevelElement& x) {
168168 if (!j.is_object()) throw std::runtime_error("Expected object");
169169 x.set_designation(j.at("designation").get<std::string>());
170- if (j.find("discovery_date") != j.end() && !std::regex_match(j.at("discovery_date").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
170+ if (j.find("discovery_date") != j.end() && !std::regex_match(j.at("discovery_date").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
171171 x.set_discovery_date(j.at("discovery_date").get<std::string>());
172172 if (j.find("h_mag") != j.end() && j.at("h_mag").is_null()) throw std::runtime_error("Unexpected null");
173173 x.set_h_mag(get_stack_optional<std::string>(j, "h_mag"));
Mobjective-cdefault / QTTopLevel.m+2 −1
@@ -159,7 +159,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
159159 {
160160 if (self = [super init]) {
161161 if (![dict[@"designation"] isKindOfClass:NSString.class]) return nil;
162- if (dict[@"discovery_date"] && [dict[@"discovery_date"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
162+ if (dict[@"discovery_date"] && [dict[@"discovery_date"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
163+ if (dict[@"discovery_date"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"discovery_date"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"discovery_date"] substringToIndex:10]]) return nil;
163164 if (![dict[@"discovery_date"] isKindOfClass:NSString.class]) return nil;
164165 if (![dict[@"i_deg"] isKindOfClass:NSString.class]) return nil;
165166 if (![dict[@"moid_au"] isKindOfClass:NSString.class]) return nil;
Mphpdefault / TopLevel.php+4 −0
@@ -94,6 +94,10 @@ class TopLevel {
9494 */
9595 public static function fromDiscoveryDate(string $value): DateTime {
9696 $tmp = new DateTime($value);
97+ $errors = DateTime::getLastErrors();
98+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
99+ throw new Exception('Invalid date-time');
100+ }
97101 if (!is_a($tmp, 'DateTime')) {
98102 throw new Exception('Attribute Error:TopLevel::');
99103 }
Test case

test/inputs/json/misc/7f568.json

3 generated files · +14 −4
Mcplusplusdefault / quicktype.hpp+2 −2
@@ -254,7 +254,7 @@ namespace quicktype {
254254 x.set_comments(j.at("comments").get<int64_t>());
255255 x.set_comments_url(j.at("comments_url").get<std::string>());
256256 x.set_commits_url(j.at("commits_url").get<std::string>());
257- if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
257+ if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
258258 x.set_created_at(j.at("created_at").get<std::string>());
259259 j.at("description");
260260 x.set_description(get_stack_optional<std::string>(j, "description"));
@@ -266,7 +266,7 @@ namespace quicktype {
266266 x.set_id(j.at("id").get<std::string>());
267267 x.set_top_level_public(j.at("public").get<bool>());
268268 x.set_truncated(j.at("truncated").get<bool>());
269- if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
269+ if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
270270 x.set_updated_at(j.at("updated_at").get<std::string>());
271271 x.set_url(j.at("url").get<std::string>());
272272 x.set_user(get_untyped(j, "user"));
Mobjective-cdefault / QTTopLevel.m+4 −2
@@ -153,7 +153,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
153153 if ([dict[@"comments"] doubleValue] != [dict[@"comments"] longLongValue]) return nil;
154154 if (![dict[@"comments_url"] isKindOfClass:NSString.class]) return nil;
155155 if (![dict[@"commits_url"] isKindOfClass:NSString.class]) return nil;
156- if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
156+ if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
157+ if (dict[@"created_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created_at"] substringToIndex:10]]) return nil;
157158 if (![dict[@"created_at"] isKindOfClass:NSString.class]) return nil;
158159 if (![dict[@"files"] isKindOfClass:NSDictionary.class]) return nil;
159160 if (![dict[@"forks_url"] isKindOfClass:NSString.class]) return nil;
@@ -164,7 +165,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
164165 if (![dict[@"public"] isKindOfClass:NSNumber.class]) return nil;
165166 if (![dict[@"truncated"] isKindOfClass:NSNumber.class]) return nil;
166167 if (!dict[@"description"]) return nil;
167- if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
168+ if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
169+ if (dict[@"updated_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"updated_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"updated_at"] substringToIndex:10]]) return nil;
168170 if (![dict[@"updated_at"] isKindOfClass:NSString.class]) return nil;
169171 if (![dict[@"url"] isKindOfClass:NSString.class]) return nil;
170172 if (!dict[@"user"]) return nil;
Mphpdefault / TopLevel.php+8 −0
@@ -206,6 +206,10 @@ class TopLevel {
206206 */
207207 public static function fromCreatedAt(string $value): DateTime {
208208 $tmp = new DateTime($value);
209+ $errors = DateTime::getLastErrors();
210+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
211+ throw new Exception('Invalid date-time');
212+ }
209213 if (!is_a($tmp, 'DateTime')) {
210214 throw new Exception('Attribute Error:TopLevel::');
211215 }
@@ -708,6 +712,10 @@ class TopLevel {
708712 */
709713 public static function fromUpdatedAt(string $value): DateTime {
710714 $tmp = new DateTime($value);
715+ $errors = DateTime::getLastErrors();
716+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
717+ throw new Exception('Invalid date-time');
718+ }
711719 if (!is_a($tmp, 'DateTime')) {
712720 throw new Exception('Attribute Error:TopLevel::');
713721 }
Test case

test/inputs/json/misc/80aff.json

3 generated files · +14 −4
Mcplusplusdefault / quicktype.hpp+2 −2
@@ -208,7 +208,7 @@ namespace quicktype {
208208
209209 inline void from_json(const json & j, Result& x) {
210210 if (!j.is_object()) throw std::runtime_error("Expected object");
211- if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
211+ if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
212212 x.set_created_at(j.at("created_at").get<std::string>());
213213 if (j.find("id") != j.end() && !j.at("id").is_number_integer()) throw std::runtime_error("Expected integer");
214214 x.set_id(j.at("id").get<int64_t>());
@@ -217,7 +217,7 @@ namespace quicktype {
217217 x.set_name(j.at("name").get<std::string>());
218218 j.at("parent");
219219 x.set_parent(get_stack_optional<int64_t>(j, "parent"));
220- if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
220+ if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
221221 x.set_updated_at(j.at("updated_at").get<std::string>());
222222 x.set_uri(j.at("uri").get<std::string>());
223223 }
Mobjective-cdefault / QTTopLevel.m+4 −2
@@ -229,7 +229,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
229229 - (instancetype)initWithJSONDictionary:(NSDictionary *)dict
230230 {
231231 if (self = [super init]) {
232- if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
232+ if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
233+ if (dict[@"created_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created_at"] substringToIndex:10]]) return nil;
233234 if (![dict[@"created_at"] isKindOfClass:NSString.class]) return nil;
234235 if (![dict[@"id"] isKindOfClass:NSNumber.class]) return nil;
235236 if ([dict[@"id"] doubleValue] != [dict[@"id"] longLongValue]) return nil;
@@ -237,7 +238,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
237238 if ([dict[@"items"] doubleValue] != [dict[@"items"] longLongValue]) return nil;
238239 if (![dict[@"name"] isKindOfClass:NSString.class]) return nil;
239240 if (!dict[@"parent"]) return nil;
240- if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
241+ if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
242+ if (dict[@"updated_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"updated_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"updated_at"] substringToIndex:10]]) return nil;
241243 if (![dict[@"updated_at"] isKindOfClass:NSString.class]) return nil;
242244 if (![dict[@"uri"] isKindOfClass:NSString.class]) return nil;
243245 [self setValuesForKeysWithDictionary:dict];
Mphpdefault / TopLevel.php+8 −0
@@ -539,6 +539,10 @@ class Result {
539539 */
540540 public static function fromCreatedAt(string $value): DateTime {
541541 $tmp = new DateTime($value);
542+ $errors = DateTime::getLastErrors();
543+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
544+ throw new Exception('Invalid date-time');
545+ }
542546 if (!is_a($tmp, 'DateTime')) {
543547 throw new Exception('Attribute Error:Result::');
544548 }
@@ -791,6 +795,10 @@ class Result {
791795 */
792796 public static function fromUpdatedAt(string $value): DateTime {
793797 $tmp = new DateTime($value);
798+ $errors = DateTime::getLastErrors();
799+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
800+ throw new Exception('Invalid date-time');
801+ }
794802 if (!is_a($tmp, 'DateTime')) {
795803 throw new Exception('Attribute Error:Result::');
796804 }
Test case

test/inputs/json/misc/88130.json

3 generated files · +7 −2
Mcplusplusdefault / quicktype.hpp+1 −1
@@ -711,7 +711,7 @@ namespace quicktype {
711711 if (!j.is_object()) throw std::runtime_error("Expected object");
712712 if (j.find("count") != j.end() && !j.at("count").is_number_integer()) throw std::runtime_error("Expected integer");
713713 x.set_count(j.at("count").get<int64_t>());
714- if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
714+ if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
715715 x.set_created(j.at("created").get<std::string>());
716716 x.set_lang(j.at("lang").get<std::string>());
717717 x.set_results(j.at("results").get<Results>());
Mobjective-cdefault / QTTopLevel.m+2 −1
@@ -217,7 +217,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
217217 if (self = [super init]) {
218218 if (![dict[@"count"] isKindOfClass:NSNumber.class]) return nil;
219219 if ([dict[@"count"] doubleValue] != [dict[@"count"] longLongValue]) return nil;
220- if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
220+ if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
221+ if (dict[@"created"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created"] substringToIndex:10]]) return nil;
221222 if (![dict[@"created"] isKindOfClass:NSString.class]) return nil;
222223 if (![dict[@"lang"] isKindOfClass:NSString.class]) return nil;
223224 if (![dict[@"results"] isKindOfClass:NSDictionary.class]) return nil;
Mphpdefault / TopLevel.php+4 −0
@@ -178,6 +178,10 @@ class Query {
178178 */
179179 public static function fromCreated(string $value): DateTime {
180180 $tmp = new DateTime($value);
181+ $errors = DateTime::getLastErrors();
182+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
183+ throw new Exception('Invalid date-time');
184+ }
181185 if (!is_a($tmp, 'DateTime')) {
182186 throw new Exception('Attribute Error:Query::');
183187 }
Test case

test/inputs/json/misc/9929c.json

3 generated files · +7 −2
Mcplusplusdefault / quicktype.hpp+1 −1
@@ -711,7 +711,7 @@ namespace quicktype {
711711 if (!j.is_object()) throw std::runtime_error("Expected object");
712712 if (j.find("count") != j.end() && !j.at("count").is_number_integer()) throw std::runtime_error("Expected integer");
713713 x.set_count(j.at("count").get<int64_t>());
714- if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
714+ if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
715715 x.set_created(j.at("created").get<std::string>());
716716 x.set_lang(j.at("lang").get<std::string>());
717717 x.set_results(j.at("results").get<Results>());
Mobjective-cdefault / QTTopLevel.m+2 −1
@@ -217,7 +217,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
217217 if (self = [super init]) {
218218 if (![dict[@"count"] isKindOfClass:NSNumber.class]) return nil;
219219 if ([dict[@"count"] doubleValue] != [dict[@"count"] longLongValue]) return nil;
220- if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
220+ if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
221+ if (dict[@"created"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created"] substringToIndex:10]]) return nil;
221222 if (![dict[@"created"] isKindOfClass:NSString.class]) return nil;
222223 if (![dict[@"lang"] isKindOfClass:NSString.class]) return nil;
223224 if (![dict[@"results"] isKindOfClass:NSDictionary.class]) return nil;
Mphpdefault / TopLevel.php+4 −0
@@ -178,6 +178,10 @@ class Query {
178178 */
179179 public static function fromCreated(string $value): DateTime {
180180 $tmp = new DateTime($value);
181+ $errors = DateTime::getLastErrors();
182+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
183+ throw new Exception('Invalid date-time');
184+ }
181185 if (!is_a($tmp, 'DateTime')) {
182186 throw new Exception('Attribute Error:Query::');
183187 }
Test case

test/inputs/json/misc/9ac3b.json

3 generated files · +14 −4
Mcplusplusdefault / quicktype.hpp+2 −2
@@ -237,7 +237,7 @@ namespace quicktype {
237237
238238 inline void from_json(const json & j, Result& x) {
239239 if (!j.is_object()) throw std::runtime_error("Expected object");
240- if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
240+ if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
241241 x.set_created_at(j.at("created_at").get<std::string>());
242242 x.set_entity(j.at("entity").get<std::string>());
243243 x.set_first_name(j.at("first_name").get<std::string>());
@@ -249,7 +249,7 @@ namespace quicktype {
249249 x.set_status(j.at("status").get<Status>());
250250 j.at("title");
251251 x.set_title(get_stack_optional<Title>(j, "title"));
252- if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
252+ if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
253253 x.set_updated_at(j.at("updated_at").get<std::string>());
254254 x.set_uri(j.at("uri").get<std::string>());
255255 }
Mobjective-cdefault / QTTopLevel.m+4 −2
@@ -286,7 +286,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
286286 - (instancetype)initWithJSONDictionary:(NSDictionary *)dict
287287 {
288288 if (self = [super init]) {
289- if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
289+ if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
290+ if (dict[@"created_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created_at"] substringToIndex:10]]) return nil;
290291 if (![dict[@"created_at"] isKindOfClass:NSString.class]) return nil;
291292 if (![dict[@"entity"] isKindOfClass:NSString.class]) return nil;
292293 if (![dict[@"first_name"] isKindOfClass:NSString.class]) return nil;
@@ -296,7 +297,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
296297 if (!dict[@"position"]) return nil;
297298 if (![dict[@"status"] isKindOfClass:NSString.class]) return nil;
298299 if (!dict[@"title"]) return nil;
299- if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
300+ if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
301+ if (dict[@"updated_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"updated_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"updated_at"] substringToIndex:10]]) return nil;
300302 if (![dict[@"updated_at"] isKindOfClass:NSString.class]) return nil;
301303 if (![dict[@"uri"] isKindOfClass:NSString.class]) return nil;
302304 [self setValuesForKeysWithDictionary:dict];
Mphpdefault / TopLevel.php+8 −0
@@ -551,6 +551,10 @@ class Result {
551551 */
552552 public static function fromCreatedAt(string $value): DateTime {
553553 $tmp = new DateTime($value);
554+ $errors = DateTime::getLastErrors();
555+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
556+ throw new Exception('Invalid date-time');
557+ }
554558 if (!is_a($tmp, 'DateTime')) {
555559 throw new Exception('Attribute Error:Result::');
556560 }
@@ -1003,6 +1007,10 @@ class Result {
10031007 */
10041008 public static function fromUpdatedAt(string $value): DateTime {
10051009 $tmp = new DateTime($value);
1010+ $errors = DateTime::getLastErrors();
1011+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
1012+ throw new Exception('Invalid date-time');
1013+ }
10061014 if (!is_a($tmp, 'DateTime')) {
10071015 throw new Exception('Attribute Error:Result::');
10081016 }
Test case

test/inputs/json/misc/a0496.json

3 generated files · +7 −2
Mcplusplusdefault / quicktype.hpp+1 −1
@@ -239,7 +239,7 @@ namespace quicktype {
239239 x.set_source_name(j.at("source_name").get<std::string>());
240240 x.set_to_date(j.at("to_date").get<std::string>());
241241 x.set_type(j.at("type").get<std::string>());
242- if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
242+ if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
243243 x.set_updated_at(j.at("updated_at").get<std::string>());
244244 x.set_urlize_name(j.at("urlize_name").get<std::string>());
245245 }
Mobjective-cdefault / QTTopLevel.m+2 −1
@@ -125,7 +125,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
125125 if (![dict[@"description"] isKindOfClass:NSString.class]) return nil;
126126 if (![dict[@"to_date"] isKindOfClass:NSString.class]) return nil;
127127 if (![dict[@"type"] isKindOfClass:NSString.class]) return nil;
128- if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
128+ if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
129+ if (dict[@"updated_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"updated_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"updated_at"] substringToIndex:10]]) return nil;
129130 if (![dict[@"updated_at"] isKindOfClass:NSString.class]) return nil;
130131 if (![dict[@"urlize_name"] isKindOfClass:NSString.class]) return nil;
131132 [self setValuesForKeysWithDictionary:dict];
Mphpdefault / TopLevel.php+4 −0
@@ -841,6 +841,10 @@ class TopLevel {
841841 */
842842 public static function fromUpdatedAt(string $value): DateTime {
843843 $tmp = new DateTime($value);
844+ $errors = DateTime::getLastErrors();
845+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
846+ throw new Exception('Invalid date-time');
847+ }
844848 if (!is_a($tmp, 'DateTime')) {
845849 throw new Exception('Attribute Error:TopLevel::');
846850 }
Test case

test/inputs/json/misc/a1eca.json

3 generated files · +7 −2
Mcplusplusdefault / quicktype.hpp+1 −1
@@ -711,7 +711,7 @@ namespace quicktype {
711711 if (!j.is_object()) throw std::runtime_error("Expected object");
712712 if (j.find("count") != j.end() && !j.at("count").is_number_integer()) throw std::runtime_error("Expected integer");
713713 x.set_count(j.at("count").get<int64_t>());
714- if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
714+ if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
715715 x.set_created(j.at("created").get<std::string>());
716716 x.set_lang(j.at("lang").get<std::string>());
717717 x.set_results(j.at("results").get<Results>());
Mobjective-cdefault / QTTopLevel.m+2 −1
@@ -217,7 +217,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
217217 if (self = [super init]) {
218218 if (![dict[@"count"] isKindOfClass:NSNumber.class]) return nil;
219219 if ([dict[@"count"] doubleValue] != [dict[@"count"] longLongValue]) return nil;
220- if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
220+ if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
221+ if (dict[@"created"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created"] substringToIndex:10]]) return nil;
221222 if (![dict[@"created"] isKindOfClass:NSString.class]) return nil;
222223 if (![dict[@"lang"] isKindOfClass:NSString.class]) return nil;
223224 if (![dict[@"results"] isKindOfClass:NSDictionary.class]) return nil;
Mphpdefault / TopLevel.php+4 −0
@@ -178,6 +178,10 @@ class Query {
178178 */
179179 public static function fromCreated(string $value): DateTime {
180180 $tmp = new DateTime($value);
181+ $errors = DateTime::getLastErrors();
182+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
183+ throw new Exception('Invalid date-time');
184+ }
181185 if (!is_a($tmp, 'DateTime')) {
182186 throw new Exception('Attribute Error:Query::');
183187 }
Test case

test/inputs/json/misc/b4865.json

2 generated files · +5 −1
Mcplusplusdefault / quicktype.hpp+1 −1
@@ -232,7 +232,7 @@ namespace quicktype {
232232 x.set_reclat(get_stack_optional<std::string>(j, "reclat"));
233233 if (j.find("reclong") != j.end() && j.at("reclong").is_null()) throw std::runtime_error("Unexpected null");
234234 x.set_reclong(get_stack_optional<std::string>(j, "reclong"));
235- if (j.find("year") != j.end() && !std::regex_match(j.at("year").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
235+ if (j.find("year") != j.end() && !std::regex_match(j.at("year").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
236236 if (j.find("year") != j.end() && j.at("year").is_null()) throw std::runtime_error("Unexpected null");
237237 x.set_year(get_stack_optional<std::string>(j, "year"));
238238 }
Mphpdefault / TopLevel.php+4 −0
@@ -634,6 +634,10 @@ class TopLevel {
634634 public static function fromYear(?string $value): ?DateTime {
635635 if (!is_null($value)) {
636636 $tmp = new DateTime($value);
637+ $errors = DateTime::getLastErrors();
638+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
639+ throw new Exception('Invalid date-time');
640+ }
637641 if (!is_a($tmp, 'DateTime')) {
638642 throw new Exception('Attribute Error:TopLevel::');
639643 }
Test case

test/inputs/json/misc/cf0d8.json

3 generated files · +7 −2
Mcplusplusdefault / quicktype.hpp+1 −1
@@ -711,7 +711,7 @@ namespace quicktype {
711711 if (!j.is_object()) throw std::runtime_error("Expected object");
712712 if (j.find("count") != j.end() && !j.at("count").is_number_integer()) throw std::runtime_error("Expected integer");
713713 x.set_count(j.at("count").get<int64_t>());
714- if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
714+ if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
715715 x.set_created(j.at("created").get<std::string>());
716716 x.set_lang(j.at("lang").get<std::string>());
717717 x.set_results(j.at("results").get<Results>());
Mobjective-cdefault / QTTopLevel.m+2 −1
@@ -217,7 +217,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
217217 if (self = [super init]) {
218218 if (![dict[@"count"] isKindOfClass:NSNumber.class]) return nil;
219219 if ([dict[@"count"] doubleValue] != [dict[@"count"] longLongValue]) return nil;
220- if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
220+ if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
221+ if (dict[@"created"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created"] substringToIndex:10]]) return nil;
221222 if (![dict[@"created"] isKindOfClass:NSString.class]) return nil;
222223 if (![dict[@"lang"] isKindOfClass:NSString.class]) return nil;
223224 if (![dict[@"results"] isKindOfClass:NSDictionary.class]) return nil;
Mphpdefault / TopLevel.php+4 −0
@@ -178,6 +178,10 @@ class Query {
178178 */
179179 public static function fromCreated(string $value): DateTime {
180180 $tmp = new DateTime($value);
181+ $errors = DateTime::getLastErrors();
182+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
183+ throw new Exception('Invalid date-time');
184+ }
181185 if (!is_a($tmp, 'DateTime')) {
182186 throw new Exception('Attribute Error:Query::');
183187 }
Test case

test/inputs/json/misc/d23d5.json

3 generated files · +14 −4
Mcplusplusdefault / quicktype.hpp+2 −2
@@ -205,11 +205,11 @@ namespace quicktype {
205205 if (!j.is_object()) throw std::runtime_error("Expected object");
206206 j.at("acronym");
207207 x.set_acronym(get_stack_optional<std::string>(j, "acronym"));
208- if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
208+ if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
209209 x.set_created_at(j.at("created_at").get<std::string>());
210210 x.set_id(j.at("id").get<std::string>());
211211 x.set_name(j.at("name").get<std::string>());
212- if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
212+ if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
213213 x.set_updated_at(j.at("updated_at").get<std::string>());
214214 x.set_uri(j.at("uri").get<std::string>());
215215 }
Mobjective-cdefault / QTTopLevel.m+4 −2
@@ -228,11 +228,13 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
228228 {
229229 if (self = [super init]) {
230230 if (!dict[@"acronym"]) return nil;
231- if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
231+ if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
232+ if (dict[@"created_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created_at"] substringToIndex:10]]) return nil;
232233 if (![dict[@"created_at"] isKindOfClass:NSString.class]) return nil;
233234 if (![dict[@"id"] isKindOfClass:NSString.class]) return nil;
234235 if (![dict[@"name"] isKindOfClass:NSString.class]) return nil;
235- if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
236+ if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
237+ if (dict[@"updated_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"updated_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"updated_at"] substringToIndex:10]]) return nil;
236238 if (![dict[@"updated_at"] isKindOfClass:NSString.class]) return nil;
237239 if (![dict[@"uri"] isKindOfClass:NSString.class]) return nil;
238240 [self setValuesForKeysWithDictionary:dict];
Mphpdefault / TopLevel.php+8 −0
@@ -593,6 +593,10 @@ class Result {
593593 */
594594 public static function fromCreatedAt(string $value): DateTime {
595595 $tmp = new DateTime($value);
596+ $errors = DateTime::getLastErrors();
597+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
598+ throw new Exception('Invalid date-time');
599+ }
596600 if (!is_a($tmp, 'DateTime')) {
597601 throw new Exception('Attribute Error:Result::');
598602 }
@@ -741,6 +745,10 @@ class Result {
741745 */
742746 public static function fromUpdatedAt(string $value): DateTime {
743747 $tmp = new DateTime($value);
748+ $errors = DateTime::getLastErrors();
749+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
750+ throw new Exception('Invalid date-time');
751+ }
744752 if (!is_a($tmp, 'DateTime')) {
745753 throw new Exception('Attribute Error:Result::');
746754 }
Test case

test/inputs/json/misc/dbfb3.json

3 generated files · +7 −2
Mcplusplusdefault / quicktype.hpp+1 −1
@@ -716,7 +716,7 @@ namespace quicktype {
716716 if (!j.is_object()) throw std::runtime_error("Expected object");
717717 if (j.find("count") != j.end() && !j.at("count").is_number_integer()) throw std::runtime_error("Expected integer");
718718 x.set_count(j.at("count").get<int64_t>());
719- if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
719+ if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
720720 x.set_created(j.at("created").get<std::string>());
721721 x.set_lang(j.at("lang").get<std::string>());
722722 x.set_results(j.at("results").get<Results>());
Mobjective-cdefault / QTTopLevel.m+2 −1
@@ -244,7 +244,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
244244 if (self = [super init]) {
245245 if (![dict[@"count"] isKindOfClass:NSNumber.class]) return nil;
246246 if ([dict[@"count"] doubleValue] != [dict[@"count"] longLongValue]) return nil;
247- if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
247+ if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
248+ if (dict[@"created"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created"] substringToIndex:10]]) return nil;
248249 if (![dict[@"created"] isKindOfClass:NSString.class]) return nil;
249250 if (![dict[@"lang"] isKindOfClass:NSString.class]) return nil;
250251 if (![dict[@"results"] isKindOfClass:NSDictionary.class]) return nil;
Mphpdefault / TopLevel.php+4 −0
@@ -178,6 +178,10 @@ class Query {
178178 */
179179 public static function fromCreated(string $value): DateTime {
180180 $tmp = new DateTime($value);
181+ $errors = DateTime::getLastErrors();
182+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
183+ throw new Exception('Invalid date-time');
184+ }
181185 if (!is_a($tmp, 'DateTime')) {
182186 throw new Exception('Attribute Error:Query::');
183187 }
Test case

test/inputs/json/misc/df957.json

3 generated files · +7 −2
Mcplusplusdefault / quicktype.hpp+1 −1
@@ -711,7 +711,7 @@ namespace quicktype {
711711 if (!j.is_object()) throw std::runtime_error("Expected object");
712712 if (j.find("count") != j.end() && !j.at("count").is_number_integer()) throw std::runtime_error("Expected integer");
713713 x.set_count(j.at("count").get<int64_t>());
714- if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
714+ if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
715715 x.set_created(j.at("created").get<std::string>());
716716 x.set_lang(j.at("lang").get<std::string>());
717717 x.set_results(j.at("results").get<Results>());
Mobjective-cdefault / QTTopLevel.m+2 −1
@@ -217,7 +217,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
217217 if (self = [super init]) {
218218 if (![dict[@"count"] isKindOfClass:NSNumber.class]) return nil;
219219 if ([dict[@"count"] doubleValue] != [dict[@"count"] longLongValue]) return nil;
220- if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
220+ if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
221+ if (dict[@"created"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created"] substringToIndex:10]]) return nil;
221222 if (![dict[@"created"] isKindOfClass:NSString.class]) return nil;
222223 if (![dict[@"lang"] isKindOfClass:NSString.class]) return nil;
223224 if (![dict[@"results"] isKindOfClass:NSDictionary.class]) return nil;
Mphpdefault / TopLevel.php+4 −0
@@ -178,6 +178,10 @@ class Query {
178178 */
179179 public static function fromCreated(string $value): DateTime {
180180 $tmp = new DateTime($value);
181+ $errors = DateTime::getLastErrors();
182+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
183+ throw new Exception('Invalid date-time');
184+ }
181185 if (!is_a($tmp, 'DateTime')) {
182186 throw new Exception('Attribute Error:Query::');
183187 }
Test case

test/inputs/json/misc/e2915.json

3 generated files · +7 −2
Mcplusplusdefault / quicktype.hpp+1 −1
@@ -716,7 +716,7 @@ namespace quicktype {
716716 if (!j.is_object()) throw std::runtime_error("Expected object");
717717 if (j.find("count") != j.end() && !j.at("count").is_number_integer()) throw std::runtime_error("Expected integer");
718718 x.set_count(j.at("count").get<int64_t>());
719- if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
719+ if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
720720 x.set_created(j.at("created").get<std::string>());
721721 x.set_lang(j.at("lang").get<std::string>());
722722 x.set_results(j.at("results").get<Results>());
Mobjective-cdefault / QTTopLevel.m+2 −1
@@ -242,7 +242,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
242242 if (self = [super init]) {
243243 if (![dict[@"count"] isKindOfClass:NSNumber.class]) return nil;
244244 if ([dict[@"count"] doubleValue] != [dict[@"count"] longLongValue]) return nil;
245- if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
245+ if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
246+ if (dict[@"created"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created"] substringToIndex:10]]) return nil;
246247 if (![dict[@"created"] isKindOfClass:NSString.class]) return nil;
247248 if (![dict[@"lang"] isKindOfClass:NSString.class]) return nil;
248249 if (![dict[@"results"] isKindOfClass:NSDictionary.class]) return nil;
Mphpdefault / TopLevel.php+4 −0
@@ -178,6 +178,10 @@ class Query {
178178 */
179179 public static function fromCreated(string $value): DateTime {
180180 $tmp = new DateTime($value);
181+ $errors = DateTime::getLastErrors();
182+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
183+ throw new Exception('Invalid date-time');
184+ }
181185 if (!is_a($tmp, 'DateTime')) {
182186 throw new Exception('Attribute Error:Query::');
183187 }
Test case

test/inputs/json/priority/bug2590.json

1 generated file · +4 −0
Mphpdefault / TopLevel.php+4 −0
@@ -140,6 +140,10 @@ class Invoice {
140140 public static function fromCreatedAt(?string $value): ?DateTime {
141141 if (!is_null($value)) {
142142 $tmp = new DateTime($value);
143+ $errors = DateTime::getLastErrors();
144+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
145+ throw new Exception('Invalid date-time');
146+ }
143147 if (!is_a($tmp, 'DateTime')) {
144148 throw new Exception('Attribute Error:Invoice::');
145149 }
Test case

test/inputs/json/priority/bug2663.json

3 generated files · +7 −2
Mcplusplusdefault / quicktype.hpp+1 −1
@@ -63,7 +63,7 @@ namespace quicktype {
6363 inline void from_json(const json & j, TopLevel& x) {
6464 if (!j.is_object()) throw std::runtime_error("Expected object");
6565 x.set_birthday(j.at("birthday").get<std::string>());
66- if (j.find("lastSeen") != j.end() && !std::regex_match(j.at("lastSeen").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
66+ if (j.find("lastSeen") != j.end() && !std::regex_match(j.at("lastSeen").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
6767 x.set_last_seen(j.at("lastSeen").get<std::string>());
6868 x.set_name(j.at("name").get<std::string>());
6969 }
Mobjective-cdefault / QTTopLevel.m+2 −1
@@ -79,7 +79,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
7979 {
8080 if (self = [super init]) {
8181 if (![dict[@"birthday"] isKindOfClass:NSString.class]) return nil;
82- if (dict[@"lastSeen"] && [dict[@"lastSeen"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
82+ if (dict[@"lastSeen"] && [dict[@"lastSeen"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
83+ if (dict[@"lastSeen"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"lastSeen"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"lastSeen"] substringToIndex:10]]) return nil;
8384 if (![dict[@"lastSeen"] isKindOfClass:NSString.class]) return nil;
8485 if (![dict[@"name"] isKindOfClass:NSString.class]) return nil;
8586 [self setValuesForKeysWithDictionary:dict];
Mphpdefault / TopLevel.php+4 −0
@@ -73,6 +73,10 @@ class TopLevel {
7373 */
7474 public static function fromLastSeen(string $value): DateTime {
7575 $tmp = new DateTime($value);
76+ $errors = DateTime::getLastErrors();
77+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
78+ throw new Exception('Invalid date-time');
79+ }
7680 if (!is_a($tmp, 'DateTime')) {
7781 throw new Exception('Attribute Error:TopLevel::');
7882 }
Test case

test/inputs/json/priority/keywords.json

3 generated files · +7 −2
Mcplusplusdefault / quicktype.hpp+1 −1
@@ -8380,7 +8380,7 @@ namespace quicktype {
83808380
83818381 inline void from_json(const json & j, DateTime& x) {
83828382 if (!j.is_object()) throw std::runtime_error("Expected object");
8383- if (j.find("DateTime") != j.end() && !std::regex_match(j.at("DateTime").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
8383+ if (j.find("DateTime") != j.end() && !std::regex_match(j.at("DateTime").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
83848384 x.set_date_time(j.at("DateTime").get<std::string>());
83858385 }
Mobjective-cdefault / QTTopLevel.m+2 −1
@@ -5848,7 +5848,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
58485848 - (instancetype)initWithJSONDictionary:(NSDictionary *)dict
58495849 {
58505850 if (self = [super init]) {
5851- if (dict[@"DateTime"] && [dict[@"DateTime"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
5851+ if (dict[@"DateTime"] && [dict[@"DateTime"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
5852+ if (dict[@"DateTime"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"DateTime"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"DateTime"] substringToIndex:10]]) return nil;
58525853 if (![dict[@"DateTime"] isKindOfClass:NSString.class]) return nil;
58535854 [self setValuesForKeysWithDictionary:dict];
58545855 }
Mphpdefault / TopLevel.php+4 −0
@@ -14963,6 +14963,10 @@ class DateTimeClass {
1496314963 */
1496414964 public static function fromDateTime(string $value): DateTime {
1496514965 $tmp = new DateTime($value);
14966+ $errors = DateTime::getLastErrors();
14967+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
14968+ throw new Exception('Invalid date-time');
14969+ }
1496614970 if (!is_a($tmp, 'DateTime')) {
1496714971 throw new Exception('Attribute Error:DateTimeClass::');
1496814972 }
Test case

test/inputs/json/samples/github-events.json

3 generated files · +106 −28
Mcplusplusdefault / quicktype.hpp+14 −14
@@ -1541,13 +1541,13 @@ namespace quicktype {
15411541 inline void from_json(const json & j, Comment& x) {
15421542 if (!j.is_object()) throw std::runtime_error("Expected object");
15431543 x.set_body(j.at("body").get<std::string>());
1544- if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
1544+ if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
15451545 x.set_created_at(j.at("created_at").get<std::string>());
15461546 x.set_html_url(j.at("html_url").get<std::string>());
15471547 if (j.find("id") != j.end() && !j.at("id").is_number_integer()) throw std::runtime_error("Expected integer");
15481548 x.set_id(j.at("id").get<int64_t>());
15491549 x.set_issue_url(j.at("issue_url").get<std::string>());
1550- if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
1550+ if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
15511551 x.set_updated_at(j.at("updated_at").get<std::string>());
15521552 x.set_url(j.at("url").get<std::string>());
15531553 x.set_user(j.at("user").get<User>());
@@ -1619,7 +1619,7 @@ namespace quicktype {
16191619 x.set_closed_at(get_untyped(j, "closed_at"));
16201620 if (j.find("closed_issues") != j.end() && !j.at("closed_issues").is_number_integer()) throw std::runtime_error("Expected integer");
16211621 x.set_closed_issues(j.at("closed_issues").get<int64_t>());
1622- if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
1622+ if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
16231623 x.set_created_at(j.at("created_at").get<std::string>());
16241624 x.set_creator(j.at("creator").get<User>());
16251625 x.set_description(j.at("description").get<std::string>());
@@ -1635,7 +1635,7 @@ namespace quicktype {
16351635 x.set_open_issues(j.at("open_issues").get<int64_t>());
16361636 x.set_state(j.at("state").get<std::string>());
16371637 x.set_title(j.at("title").get<std::string>());
1638- if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
1638+ if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
16391639 x.set_updated_at(j.at("updated_at").get<std::string>());
16401640 x.set_url(j.at("url").get<std::string>());
16411641 }
@@ -1685,7 +1685,7 @@ namespace quicktype {
16851685 if (j.find("comments") != j.end() && !j.at("comments").is_number_integer()) throw std::runtime_error("Expected integer");
16861686 x.set_comments(j.at("comments").get<int64_t>());
16871687 x.set_comments_url(j.at("comments_url").get<std::string>());
1688- if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
1688+ if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
16891689 x.set_created_at(j.at("created_at").get<std::string>());
16901690 x.set_events_url(j.at("events_url").get<std::string>());
16911691 x.set_html_url(j.at("html_url").get<std::string>());
@@ -1703,7 +1703,7 @@ namespace quicktype {
17031703 x.set_repository_url(j.at("repository_url").get<std::string>());
17041704 x.set_state(j.at("state").get<std::string>());
17051705 x.set_title(j.at("title").get<std::string>());
1706- if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
1706+ if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
17071707 x.set_updated_at(j.at("updated_at").get<std::string>());
17081708 x.set_url(j.at("url").get<std::string>());
17091709 x.set_user(j.at("user").get<User>());
@@ -1748,7 +1748,7 @@ namespace quicktype {
17481748 x.set_compare_url(j.at("compare_url").get<std::string>());
17491749 x.set_contents_url(j.at("contents_url").get<std::string>());
17501750 x.set_contributors_url(j.at("contributors_url").get<std::string>());
1751- if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
1751+ if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
17521752 x.set_created_at(j.at("created_at").get<std::string>());
17531753 x.set_default_branch(j.at("default_branch").get<std::string>());
17541754 x.set_deployments_url(j.at("deployments_url").get<std::string>());
@@ -1794,7 +1794,7 @@ namespace quicktype {
17941794 x.set_open_issues_count(j.at("open_issues_count").get<int64_t>());
17951795 x.set_owner(j.at("owner").get<User>());
17961796 x.set_pulls_url(j.at("pulls_url").get<std::string>());
1797- if (j.find("pushed_at") != j.end() && !std::regex_match(j.at("pushed_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
1797+ if (j.find("pushed_at") != j.end() && !std::regex_match(j.at("pushed_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
17981798 x.set_pushed_at(j.at("pushed_at").get<std::string>());
17991799 x.set_releases_url(j.at("releases_url").get<std::string>());
18001800 x.set_repo_private(j.at("private").get<bool>());
@@ -1811,7 +1811,7 @@ namespace quicktype {
18111811 x.set_tags_url(j.at("tags_url").get<std::string>());
18121812 x.set_teams_url(j.at("teams_url").get<std::string>());
18131813 x.set_trees_url(j.at("trees_url").get<std::string>());
1814- if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
1814+ if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
18151815 x.set_updated_at(j.at("updated_at").get<std::string>());
18161816 x.set_url(j.at("url").get<std::string>());
18171817 if (j.find("watchers") != j.end() && !j.at("watchers").is_number_integer()) throw std::runtime_error("Expected integer");
@@ -1955,7 +1955,7 @@ namespace quicktype {
19551955 x.set_body(j.at("body").get<std::string>());
19561956 if (j.find("changed_files") != j.end() && !j.at("changed_files").is_number_integer()) throw std::runtime_error("Expected integer");
19571957 x.set_changed_files(j.at("changed_files").get<int64_t>());
1958- if (j.find("closed_at") != j.end() && !std::regex_match(j.at("closed_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
1958+ if (j.find("closed_at") != j.end() && !std::regex_match(j.at("closed_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
19591959 x.set_closed_at(j.at("closed_at").get<std::string>());
19601960 if (j.find("comments") != j.end() && !j.at("comments").is_number_integer()) throw std::runtime_error("Expected integer");
19611961 x.set_comments(j.at("comments").get<int64_t>());
@@ -1963,7 +1963,7 @@ namespace quicktype {
19631963 if (j.find("commits") != j.end() && !j.at("commits").is_number_integer()) throw std::runtime_error("Expected integer");
19641964 x.set_commits(j.at("commits").get<int64_t>());
19651965 x.set_commits_url(j.at("commits_url").get<std::string>());
1966- if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
1966+ if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
19671967 x.set_created_at(j.at("created_at").get<std::string>());
19681968 if (j.find("deletions") != j.end() && !j.at("deletions").is_number_integer()) throw std::runtime_error("Expected integer");
19691969 x.set_deletions(j.at("deletions").get<int64_t>());
@@ -1980,7 +1980,7 @@ namespace quicktype {
19801980 x.set_mergeable(get_untyped(j, "mergeable"));
19811981 x.set_mergeable_state(j.at("mergeable_state").get<std::string>());
19821982 x.set_merged(j.at("merged").get<bool>());
1983- if (j.find("merged_at") != j.end() && !std::regex_match(j.at("merged_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
1983+ if (j.find("merged_at") != j.end() && !std::regex_match(j.at("merged_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
19841984 x.set_merged_at(j.at("merged_at").get<std::string>());
19851985 x.set_merged_by(j.at("merged_by").get<User>());
19861986 x.set_milestone(get_untyped(j, "milestone"));
@@ -1996,7 +1996,7 @@ namespace quicktype {
19961996 x.set_state(j.at("state").get<std::string>());
19971997 x.set_statuses_url(j.at("statuses_url").get<std::string>());
19981998 x.set_title(j.at("title").get<std::string>());
1999- if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
1999+ if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
20002000 x.set_updated_at(j.at("updated_at").get<std::string>());
20012001 x.set_url(j.at("url").get<std::string>());
20022002 x.set_user(j.at("user").get<User>());
@@ -2125,7 +2125,7 @@ namespace quicktype {
21252125 inline void from_json(const json & j, TopLevelElement& x) {
21262126 if (!j.is_object()) throw std::runtime_error("Expected object");
21272127 x.set_actor(j.at("actor").get<Actor>());
2128- if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
2128+ if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
21292129 x.set_created_at(j.at("created_at").get<std::string>());
21302130 x.set_id(j.at("id").get<std::string>());
21312131 if (j.find("org") != j.end() && j.at("org").is_null()) throw std::runtime_error("Unexpected null");
Mobjective-cdefault / QTTopLevel.m+28 −14
@@ -194,7 +194,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
194194 {
195195 if (self = [super init]) {
196196 if (![dict[@"actor"] isKindOfClass:NSDictionary.class]) return nil;
197- if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
197+ if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
198+ if (dict[@"created_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created_at"] substringToIndex:10]]) return nil;
198199 if (![dict[@"created_at"] isKindOfClass:NSString.class]) return nil;
199200 if (![dict[@"id"] isKindOfClass:NSString.class]) return nil;
200201 if (![dict[@"public"] isKindOfClass:NSNumber.class]) return nil;
@@ -415,13 +416,15 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
415416 {
416417 if (self = [super init]) {
417418 if (![dict[@"body"] isKindOfClass:NSString.class]) return nil;
418- if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
419+ if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
420+ if (dict[@"created_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created_at"] substringToIndex:10]]) return nil;
419421 if (![dict[@"created_at"] isKindOfClass:NSString.class]) return nil;
420422 if (![dict[@"html_url"] isKindOfClass:NSString.class]) return nil;
421423 if (![dict[@"id"] isKindOfClass:NSNumber.class]) return nil;
422424 if ([dict[@"id"] doubleValue] != [dict[@"id"] longLongValue]) return nil;
423425 if (![dict[@"issue_url"] isKindOfClass:NSString.class]) return nil;
424- if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
426+ if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
427+ if (dict[@"updated_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"updated_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"updated_at"] substringToIndex:10]]) return nil;
425428 if (![dict[@"updated_at"] isKindOfClass:NSString.class]) return nil;
426429 if (![dict[@"url"] isKindOfClass:NSString.class]) return nil;
427430 if (![dict[@"user"] isKindOfClass:NSDictionary.class]) return nil;
@@ -708,7 +711,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
708711 if (![dict[@"comments"] isKindOfClass:NSNumber.class]) return nil;
709712 if ([dict[@"comments"] doubleValue] != [dict[@"comments"] longLongValue]) return nil;
710713 if (![dict[@"comments_url"] isKindOfClass:NSString.class]) return nil;
711- if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
714+ if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
715+ if (dict[@"created_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created_at"] substringToIndex:10]]) return nil;
712716 if (![dict[@"created_at"] isKindOfClass:NSString.class]) return nil;
713717 if (![dict[@"events_url"] isKindOfClass:NSString.class]) return nil;
714718 if (![dict[@"html_url"] isKindOfClass:NSString.class]) return nil;
@@ -723,7 +727,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
723727 if (![dict[@"repository_url"] isKindOfClass:NSString.class]) return nil;
724728 if (![dict[@"state"] isKindOfClass:NSString.class]) return nil;
725729 if (![dict[@"title"] isKindOfClass:NSString.class]) return nil;
726- if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
730+ if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
731+ if (dict[@"updated_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"updated_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"updated_at"] substringToIndex:10]]) return nil;
727732 if (![dict[@"updated_at"] isKindOfClass:NSString.class]) return nil;
728733 if (![dict[@"url"] isKindOfClass:NSString.class]) return nil;
729734 if (![dict[@"user"] isKindOfClass:NSDictionary.class]) return nil;
@@ -873,7 +878,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
873878 if (!dict[@"closed_at"]) return nil;
874879 if (![dict[@"closed_issues"] isKindOfClass:NSNumber.class]) return nil;
875880 if ([dict[@"closed_issues"] doubleValue] != [dict[@"closed_issues"] longLongValue]) return nil;
876- if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
881+ if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
882+ if (dict[@"created_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created_at"] substringToIndex:10]]) return nil;
877883 if (![dict[@"created_at"] isKindOfClass:NSString.class]) return nil;
878884 if (![dict[@"creator"] isKindOfClass:NSDictionary.class]) return nil;
879885 if (!dict[@"due_on"]) return nil;
@@ -888,7 +894,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
888894 if (![dict[@"state"] isKindOfClass:NSString.class]) return nil;
889895 if (![dict[@"description"] isKindOfClass:NSString.class]) return nil;
890896 if (![dict[@"title"] isKindOfClass:NSString.class]) return nil;
891- if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
897+ if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
898+ if (dict[@"updated_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"updated_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"updated_at"] substringToIndex:10]]) return nil;
892899 if (![dict[@"updated_at"] isKindOfClass:NSString.class]) return nil;
893900 if (![dict[@"url"] isKindOfClass:NSString.class]) return nil;
894901 [self setValuesForKeysWithDictionary:dict];
@@ -1052,7 +1059,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
10521059 if (![dict[@"body"] isKindOfClass:NSString.class]) return nil;
10531060 if (![dict[@"changed_files"] isKindOfClass:NSNumber.class]) return nil;
10541061 if ([dict[@"changed_files"] doubleValue] != [dict[@"changed_files"] longLongValue]) return nil;
1055- if (dict[@"closed_at"] && [dict[@"closed_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
1062+ if (dict[@"closed_at"] && [dict[@"closed_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
1063+ if (dict[@"closed_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"closed_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"closed_at"] substringToIndex:10]]) return nil;
10561064 if (![dict[@"closed_at"] isKindOfClass:NSString.class]) return nil;
10571065 if (![dict[@"comments"] isKindOfClass:NSNumber.class]) return nil;
10581066 if ([dict[@"comments"] doubleValue] != [dict[@"comments"] longLongValue]) return nil;
@@ -1060,7 +1068,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
10601068 if (![dict[@"commits"] isKindOfClass:NSNumber.class]) return nil;
10611069 if ([dict[@"commits"] doubleValue] != [dict[@"commits"] longLongValue]) return nil;
10621070 if (![dict[@"commits_url"] isKindOfClass:NSString.class]) return nil;
1063- if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
1071+ if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
1072+ if (dict[@"created_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created_at"] substringToIndex:10]]) return nil;
10641073 if (![dict[@"created_at"] isKindOfClass:NSString.class]) return nil;
10651074 if (![dict[@"deletions"] isKindOfClass:NSNumber.class]) return nil;
10661075 if ([dict[@"deletions"] doubleValue] != [dict[@"deletions"] longLongValue]) return nil;
@@ -1077,7 +1086,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
10771086 if (![dict[@"merge_commit_sha"] isKindOfClass:NSString.class]) return nil;
10781087 if (!dict[@"mergeable"]) return nil;
10791088 if (![dict[@"mergeable_state"] isKindOfClass:NSString.class]) return nil;
1080- if (dict[@"merged_at"] && [dict[@"merged_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
1089+ if (dict[@"merged_at"] && [dict[@"merged_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
1090+ if (dict[@"merged_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"merged_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"merged_at"] substringToIndex:10]]) return nil;
10811091 if (![dict[@"merged_at"] isKindOfClass:NSString.class]) return nil;
10821092 if (![dict[@"merged_by"] isKindOfClass:NSDictionary.class]) return nil;
10831093 if (!dict[@"milestone"]) return nil;
@@ -1093,7 +1103,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
10931103 if (![dict[@"state"] isKindOfClass:NSString.class]) return nil;
10941104 if (![dict[@"statuses_url"] isKindOfClass:NSString.class]) return nil;
10951105 if (![dict[@"title"] isKindOfClass:NSString.class]) return nil;
1096- if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
1106+ if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
1107+ if (dict[@"updated_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"updated_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"updated_at"] substringToIndex:10]]) return nil;
10971108 if (![dict[@"updated_at"] isKindOfClass:NSString.class]) return nil;
10981109 if (![dict[@"url"] isKindOfClass:NSString.class]) return nil;
10991110 if (![dict[@"user"] isKindOfClass:NSDictionary.class]) return nil;
@@ -1307,7 +1318,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
13071318 if (![dict[@"compare_url"] isKindOfClass:NSString.class]) return nil;
13081319 if (![dict[@"contents_url"] isKindOfClass:NSString.class]) return nil;
13091320 if (![dict[@"contributors_url"] isKindOfClass:NSString.class]) return nil;
1310- if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
1321+ if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
1322+ if (dict[@"created_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created_at"] substringToIndex:10]]) return nil;
13111323 if (![dict[@"created_at"] isKindOfClass:NSString.class]) return nil;
13121324 if (![dict[@"default_branch"] isKindOfClass:NSString.class]) return nil;
13131325 if (![dict[@"deployments_url"] isKindOfClass:NSString.class]) return nil;
@@ -1353,7 +1365,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
13531365 if ([dict[@"open_issues_count"] doubleValue] != [dict[@"open_issues_count"] longLongValue]) return nil;
13541366 if (![dict[@"owner"] isKindOfClass:NSDictionary.class]) return nil;
13551367 if (![dict[@"pulls_url"] isKindOfClass:NSString.class]) return nil;
1356- if (dict[@"pushed_at"] && [dict[@"pushed_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
1368+ if (dict[@"pushed_at"] && [dict[@"pushed_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
1369+ if (dict[@"pushed_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"pushed_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"pushed_at"] substringToIndex:10]]) return nil;
13571370 if (![dict[@"pushed_at"] isKindOfClass:NSString.class]) return nil;
13581371 if (![dict[@"releases_url"] isKindOfClass:NSString.class]) return nil;
13591372 if (![dict[@"size"] isKindOfClass:NSNumber.class]) return nil;
@@ -1370,7 +1383,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
13701383 if (![dict[@"teams_url"] isKindOfClass:NSString.class]) return nil;
13711384 if (![dict[@"description"] isKindOfClass:NSString.class]) return nil;
13721385 if (![dict[@"trees_url"] isKindOfClass:NSString.class]) return nil;
1373- if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
1386+ if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
1387+ if (dict[@"updated_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"updated_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"updated_at"] substringToIndex:10]]) return nil;
13741388 if (![dict[@"updated_at"] isKindOfClass:NSString.class]) return nil;
13751389 if (![dict[@"url"] isKindOfClass:NSString.class]) return nil;
13761390 if (![dict[@"watchers"] isKindOfClass:NSNumber.class]) return nil;
Mphpdefault / TopLevel.php+64 −0
@@ -89,6 +89,10 @@ class TopLevel {
8989 */
9090 public static function fromCreatedAt(string $value): DateTime {
9191 $tmp = new DateTime($value);
92+ $errors = DateTime::getLastErrors();
93+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
94+ throw new Exception('Invalid date-time');
95+ }
9296 if (!is_a($tmp, 'DateTime')) {
9397 throw new Exception('Attribute Error:TopLevel::');
9498 }
@@ -2082,6 +2086,10 @@ class Comment {
20822086 */
20832087 public static function fromCreatedAt(string $value): DateTime {
20842088 $tmp = new DateTime($value);
2089+ $errors = DateTime::getLastErrors();
2090+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
2091+ throw new Exception('Invalid date-time');
2092+ }
20852093 if (!is_a($tmp, 'DateTime')) {
20862094 throw new Exception('Attribute Error:Comment::');
20872095 }
@@ -2277,6 +2285,10 @@ class Comment {
22772285 */
22782286 public static function fromUpdatedAt(string $value): DateTime {
22792287 $tmp = new DateTime($value);
2288+ $errors = DateTime::getLastErrors();
2289+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
2290+ throw new Exception('Invalid date-time');
2291+ }
22802292 if (!is_a($tmp, 'DateTime')) {
22812293 throw new Exception('Attribute Error:Comment::');
22822294 }
@@ -4299,6 +4311,10 @@ class Issue {
42994311 public static function fromClosedAt(?string $value): ?DateTime {
43004312 if (!is_null($value)) {
43014313 $tmp = new DateTime($value);
4314+ $errors = DateTime::getLastErrors();
4315+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
4316+ throw new Exception('Invalid date-time');
4317+ }
43024318 if (!is_a($tmp, 'DateTime')) {
43034319 throw new Exception('Attribute Error:Issue::');
43044320 }
@@ -4456,6 +4472,10 @@ class Issue {
44564472 */
44574473 public static function fromCreatedAt(string $value): DateTime {
44584474 $tmp = new DateTime($value);
4475+ $errors = DateTime::getLastErrors();
4476+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
4477+ throw new Exception('Invalid date-time');
4478+ }
44594479 if (!is_a($tmp, 'DateTime')) {
44604480 throw new Exception('Attribute Error:Issue::');
44614481 }
@@ -5108,6 +5128,10 @@ class Issue {
51085128 */
51095129 public static function fromUpdatedAt(string $value): DateTime {
51105130 $tmp = new DateTime($value);
5131+ $errors = DateTime::getLastErrors();
5132+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
5133+ throw new Exception('Invalid date-time');
5134+ }
51115135 if (!is_a($tmp, 'DateTime')) {
51125136 throw new Exception('Attribute Error:Issue::');
51135137 }
@@ -5923,6 +5947,10 @@ class Milestone {
59235947 */
59245948 public static function fromCreatedAt(string $value): DateTime {
59255949 $tmp = new DateTime($value);
5950+ $errors = DateTime::getLastErrors();
5951+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
5952+ throw new Exception('Invalid date-time');
5953+ }
59265954 if (!is_a($tmp, 'DateTime')) {
59275955 throw new Exception('Attribute Error:Milestone::');
59285956 }
@@ -6073,6 +6101,10 @@ class Milestone {
60736101 public static function fromDueOn(?string $value): ?DateTime {
60746102 if (!is_null($value)) {
60756103 $tmp = new DateTime($value);
6104+ $errors = DateTime::getLastErrors();
6105+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
6106+ throw new Exception('Invalid date-time');
6107+ }
60766108 if (!is_a($tmp, 'DateTime')) {
60776109 throw new Exception('Attribute Error:Milestone::');
60786110 }
@@ -6465,6 +6497,10 @@ class Milestone {
64656497 */
64666498 public static function fromUpdatedAt(string $value): DateTime {
64676499 $tmp = new DateTime($value);
6500+ $errors = DateTime::getLastErrors();
6501+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
6502+ throw new Exception('Invalid date-time');
6503+ }
64686504 if (!is_a($tmp, 'DateTime')) {
64696505 throw new Exception('Attribute Error:Milestone::');
64706506 }
@@ -7407,6 +7443,10 @@ class PayloadPullRequest {
74077443 */
74087444 public static function fromClosedAt(string $value): DateTime {
74097445 $tmp = new DateTime($value);
7446+ $errors = DateTime::getLastErrors();
7447+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
7448+ throw new Exception('Invalid date-time');
7449+ }
74107450 if (!is_a($tmp, 'DateTime')) {
74117451 throw new Exception('Attribute Error:PayloadPullRequest::');
74127452 }
@@ -7649,6 +7689,10 @@ class PayloadPullRequest {
76497689 */
76507690 public static function fromCreatedAt(string $value): DateTime {
76517691 $tmp = new DateTime($value);
7692+ $errors = DateTime::getLastErrors();
7693+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
7694+ throw new Exception('Invalid date-time');
7695+ }
76527696 if (!is_a($tmp, 'DateTime')) {
76537697 throw new Exception('Attribute Error:PayloadPullRequest::');
76547698 }
@@ -8319,6 +8363,10 @@ class PayloadPullRequest {
83198363 */
83208364 public static function fromMergedAt(string $value): DateTime {
83218365 $tmp = new DateTime($value);
8366+ $errors = DateTime::getLastErrors();
8367+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
8368+ throw new Exception('Invalid date-time');
8369+ }
83228370 if (!is_a($tmp, 'DateTime')) {
83238371 throw new Exception('Attribute Error:PayloadPullRequest::');
83248372 }
@@ -8955,6 +9003,10 @@ class PayloadPullRequest {
89559003 */
89569004 public static function fromUpdatedAt(string $value): DateTime {
89579005 $tmp = new DateTime($value);
9006+ $errors = DateTime::getLastErrors();
9007+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
9008+ throw new Exception('Invalid date-time');
9009+ }
89589010 if (!is_a($tmp, 'DateTime')) {
89599011 throw new Exception('Attribute Error:PayloadPullRequest::');
89609012 }
@@ -10490,6 +10542,10 @@ class BaseRepo {
1049010542 */
1049110543 public static function fromCreatedAt(string $value): DateTime {
1049210544 $tmp = new DateTime($value);
10545+ $errors = DateTime::getLastErrors();
10546+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
10547+ throw new Exception('Invalid date-time');
10548+ }
1049310549 if (!is_a($tmp, 'DateTime')) {
1049410550 throw new Exception('Attribute Error:BaseRepo::');
1049510551 }
@@ -12428,6 +12484,10 @@ class BaseRepo {
1242812484 */
1242912485 public static function fromPushedAt(string $value): DateTime {
1243012486 $tmp = new DateTime($value);
12487+ $errors = DateTime::getLastErrors();
12488+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
12489+ throw new Exception('Invalid date-time');
12490+ }
1243112491 if (!is_a($tmp, 'DateTime')) {
1243212492 throw new Exception('Attribute Error:BaseRepo::');
1243312493 }
@@ -13046,6 +13106,10 @@ class BaseRepo {
1304613106 */
1304713107 public static function fromUpdatedAt(string $value): DateTime {
1304813108 $tmp = new DateTime($value);
13109+ $errors = DateTime::getLastErrors();
13110+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
13111+ throw new Exception('Invalid date-time');
13112+ }
1304913113 if (!is_a($tmp, 'DateTime')) {
1305013114 throw new Exception('Attribute Error:BaseRepo::');
1305113115 }
Test case

test/inputs/json/samples/null-safe.json

2 generated files · +5 −1
Mcplusplusdefault / quicktype.hpp+1 −1
@@ -183,7 +183,7 @@ namespace quicktype {
183183 if (!j.is_object()) throw std::runtime_error("Expected object");
184184 if (j.find("address") != j.end() && j.at("address").is_null()) throw std::runtime_error("Unexpected null");
185185 x.set_address(get_stack_optional<Address>(j, "address"));
186- if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
186+ if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
187187 if (j.find("created_at") != j.end() && j.at("created_at").is_null()) throw std::runtime_error("Unexpected null");
188188 x.set_created_at(get_stack_optional<std::string>(j, "created_at"));
189189 x.set_name(j.at("name").get<std::string>());
Mphpdefault / TopLevel.php+4 −0
@@ -201,6 +201,10 @@ class Item {
201201 public static function fromCreatedAt(?string $value): ?DateTime {
202202 if (!is_null($value)) {
203203 $tmp = new DateTime($value);
204+ $errors = DateTime::getLastErrors();
205+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
206+ throw new Exception('Invalid date-time');
207+ }
204208 if (!is_a($tmp, 'DateTime')) {
205209 throw new Exception('Attribute Error:Item::');
206210 }
Test case

test/inputs/schema/date-time-or-string.schema

1 generated file · +4 −0
Mschema-phpdefault / TopLevel.php+4 −0
@@ -26,6 +26,10 @@ class TopLevel {
2626 return Bar::from($value); /*enum*/
2727 } elseif (is_string($value)) {
2828 $tmp = new DateTime($value);
29+ $errors = DateTime::getLastErrors();
30+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
31+ throw new Exception('Invalid date-time');
32+ }
2933 if (!is_a($tmp, 'DateTime')) {
3034 throw new Exception('Attribute Error:TopLevel::');
3135 }
Test case

test/inputs/schema/date-time.schema

3 generated files · +11 −2
Mschema-cplusplusdefault / quicktype.hpp+1 −1
@@ -146,7 +146,7 @@ namespace quicktype {
146146 if (!j.is_object()) throw std::runtime_error("Expected object");
147147 x.set_complex_union_array(j.at("complex-union-array").get<std::vector<ComplexUnionArrayElement>>());
148148 x.set_date(j.at("date").get<std::string>());
149- if (j.find("date-time") != j.end() && !std::regex_match(j.at("date-time").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
149+ if (j.find("date-time") != j.end() && !std::regex_match(j.at("date-time").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
150150 x.set_date_time(j.at("date-time").get<std::string>());
151151 x.set_time(j.at("time").get<std::string>());
152152 x.set_union_array(j.at("union-array").get<std::vector<std::string>>());
Mschema-objective-cdefault / QTTopLevel.m+2 −1
@@ -121,7 +121,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
121121 if (self = [super init]) {
122122 if (![dict[@"complex-union-array"] isKindOfClass:NSArray.class]) return nil;
123123 if (![dict[@"date"] isKindOfClass:NSString.class]) return nil;
124- if (dict[@"date-time"] && [dict[@"date-time"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
124+ if (dict[@"date-time"] && [dict[@"date-time"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
125+ if (dict[@"date-time"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"date-time"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"date-time"] substringToIndex:10]]) return nil;
125126 if (![dict[@"date-time"] isKindOfClass:NSString.class]) return nil;
126127 if (![dict[@"time"] isKindOfClass:NSString.class]) return nil;
127128 if (![dict[@"union-array"] isKindOfClass:NSArray.class]) return nil;
Mschema-phpdefault / TopLevel.php+8 −0
@@ -36,6 +36,10 @@ class TopLevel {
3636 return ComplexUnionArray::from($value); /*enum*/
3737 } elseif (is_string($value)) {
3838 $tmp = new DateTime($value);
39+ $errors = DateTime::getLastErrors();
40+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
41+ throw new Exception('Invalid date-time');
42+ }
3943 if (!is_a($tmp, 'DateTime')) {
4044 throw new Exception('Attribute Error:TopLevel::');
4145 }
@@ -170,6 +174,10 @@ class TopLevel {
170174 */
171175 public static function fromDateTime(string $value): DateTime {
172176 $tmp = new DateTime($value);
177+ $errors = DateTime::getLastErrors();
178+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
179+ throw new Exception('Invalid date-time');
180+ }
173181 if (!is_a($tmp, 'DateTime')) {
174182 throw new Exception('Attribute Error:TopLevel::');
175183 }
Test case

test/inputs/schema/optional-date-time.schema

3 generated files · +12 −3
Mschema-cplusplusdefault / quicktype.hpp+2 −2
@@ -136,13 +136,13 @@ namespace quicktype {
136136 if (!j.is_object()) throw std::runtime_error("Expected object");
137137 if (j.find("optional-date") != j.end() && j.at("optional-date").is_null()) throw std::runtime_error("Unexpected null");
138138 x.set_optional_date(get_stack_optional<std::string>(j, "optional-date"));
139- if (j.find("optional-date-time") != j.end() && !std::regex_match(j.at("optional-date-time").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
139+ if (j.find("optional-date-time") != j.end() && !std::regex_match(j.at("optional-date-time").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
140140 if (j.find("optional-date-time") != j.end() && j.at("optional-date-time").is_null()) throw std::runtime_error("Unexpected null");
141141 x.set_optional_date_time(get_stack_optional<std::string>(j, "optional-date-time"));
142142 if (j.find("optional-time") != j.end() && j.at("optional-time").is_null()) throw std::runtime_error("Unexpected null");
143143 x.set_optional_time(get_stack_optional<std::string>(j, "optional-time"));
144144 x.set_required_date(j.at("required-date").get<std::string>());
145- if (j.find("required-date-time") != j.end() && !std::regex_match(j.at("required-date-time").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
145+ if (j.find("required-date-time") != j.end() && !std::regex_match(j.at("required-date-time").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
146146 x.set_required_date_time(j.at("required-date-time").get<std::string>());
147147 x.set_required_time(j.at("required-time").get<std::string>());
148148 }
Mschema-objective-cdefault / QTTopLevel.m+2 −1
@@ -82,7 +82,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
8282 {
8383 if (self = [super init]) {
8484 if (![dict[@"required-date"] isKindOfClass:NSString.class]) return nil;
85- if (dict[@"required-date-time"] && [dict[@"required-date-time"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
85+ if (dict[@"required-date-time"] && [dict[@"required-date-time"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
86+ if (dict[@"required-date-time"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"required-date-time"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"required-date-time"] substringToIndex:10]]) return nil;
8687 if (![dict[@"required-date-time"] isKindOfClass:NSString.class]) return nil;
8788 if (![dict[@"required-time"] isKindOfClass:NSString.class]) return nil;
8889 [self setValuesForKeysWithDictionary:dict];
Mschema-phpdefault / TopLevel.php+8 −0
@@ -93,6 +93,10 @@ class TopLevel {
9393 public static function fromOptionalDateTime(?string $value): ?DateTime {
9494 if (!is_null($value)) {
9595 $tmp = new DateTime($value);
96+ $errors = DateTime::getLastErrors();
97+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
98+ throw new Exception('Invalid date-time');
99+ }
96100 if (!is_a($tmp, 'DateTime')) {
97101 throw new Exception('Attribute Error:TopLevel::');
98102 }
@@ -260,6 +264,10 @@ class TopLevel {
260264 */
261265 public static function fromRequiredDateTime(string $value): DateTime {
262266 $tmp = new DateTime($value);
267+ $errors = DateTime::getLastErrors();
268+ if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
269+ throw new Exception('Invalid date-time');
270+ }
263271 if (!is_a($tmp, 'DateTime')) {
264272 throw new Exception('Attribute Error:TopLevel::');
265273 }
No generated files match these filters.