aboutsummaryrefslogtreecommitdiff
path: root/lib/std/json.zig
diff options
context:
space:
mode:
authorr00ster91 <r00ster91@proton.me>2023-03-08 19:25:53 +0100
committerr00ster91 <r00ster91@proton.me>2023-03-08 19:25:53 +0100
commit7e3591bedd41bde8bcca892885376e2f4a8163a3 (patch)
tree40a84c8ad65de1247bb36566fc21f1dfb56581fe /lib/std/json.zig
parentecc0108cea97772b6e921b36d8fdc8f90d5fc6cb (diff)
downloadzig-7e3591bedd41bde8bcca892885376e2f4a8163a3.tar.gz
zig-7e3591bedd41bde8bcca892885376e2f4a8163a3.zip
std.json.parseInternal: use switches instead of ifs
Diffstat (limited to 'lib/std/json.zig')
-rw-r--r--lib/std/json.zig41
1 files changed, 18 insertions, 23 deletions
diff --git a/lib/std/json.zig b/lib/std/json.zig
index 0cce71b1e6..9d24ebaff4 100644
--- a/lib/std/json.zig
+++ b/lib/std/json.zig
@@ -1534,30 +1534,25 @@ fn parseInternal(
child_options.allow_trailing_data = true;
var found = false;
inline for (structInfo.fields, 0..) |field, i| {
- // TODO: using switches here segfault the compiler (#2727?)
- if ((stringToken.escapes == .None and mem.eql(u8, field.name, key_source_slice)) or (stringToken.escapes == .Some and (field.name.len == stringToken.decodedLength() and encodesTo(field.name, key_source_slice)))) {
- // if (switch (stringToken.escapes) {
- // .None => mem.eql(u8, field.name, key_source_slice),
- // .Some => (field.name.len == stringToken.decodedLength() and encodesTo(field.name, key_source_slice)),
- // }) {
+ if (switch (stringToken.escapes) {
+ .None => mem.eql(u8, field.name, key_source_slice),
+ .Some => (field.name.len == stringToken.decodedLength() and encodesTo(field.name, key_source_slice)),
+ }) {
if (fields_seen[i]) {
- // switch (options.duplicate_field_behavior) {
- // .UseFirst => {},
- // .Error => {},
- // .UseLast => {},
- // }
- if (options.duplicate_field_behavior == .UseFirst) {
- // unconditonally ignore value. for comptime fields, this skips check against default_value
- parseFree(field.type, try parse(field.type, tokens, child_options), child_options);
- found = true;
- break;
- } else if (options.duplicate_field_behavior == .Error) {
- return error.DuplicateJSONField;
- } else if (options.duplicate_field_behavior == .UseLast) {
- if (!field.is_comptime) {
- parseFree(field.type, @field(r, field.name), child_options);
- }
- fields_seen[i] = false;
+ switch (options.duplicate_field_behavior) {
+ .UseFirst => {
+ // unconditonally ignore value. for comptime fields, this skips check against default_value
+ parseFree(field.type, try parse(field.type, tokens, child_options), child_options);
+ found = true;
+ break;
+ },
+ .Error => return error.DuplicateJSONField,
+ .UseLast => {
+ if (!field.is_comptime) {
+ parseFree(field.type, @field(r, field.name), child_options);
+ }
+ fields_seen[i] = false;
+ },
}
}
if (field.is_comptime) {