Separate parsed registries into core and non-core

This commit is contained in:
Robin Voetter
2020-08-12 02:35:05 +02:00
parent c761d8e635
commit 443d180f1e
2 changed files with 26 additions and 6 deletions

View File

@@ -6,9 +6,30 @@ pub fn generate(allocator: *Allocator, spec_jsons: []const []const u8, writer: a
var arena = std.heap.ArenaAllocator.init(allocator);
defer arena.deinit();
const registries = try arena.allocator.alloc(reg.Registry, spec_jsons.len);
for (registries) |*registry, i| {
var tokens = std.json.TokenStream.init(spec_jsons[i]);
registry.* = try std.json.parse(reg.Registry, &tokens, .{.allocator = &arena.allocator});
// Only one of the passed specs may be core (and one of them _must_ be core) -
// the others must be exensions.
var core_registry: reg.CoreRegistry = undefined;
const num_ext_registries = spec_jsons.len - 1;
const ext_registries = try arena.allocator.alloc(reg.ExtensionRegistry, num_ext_registries);
var ext_registry_i: usize = 0;
for (spec_jsons) |spec_json| {
var tokens = std.json.TokenStream.init(spec_json);
const registry = try std.json.parse(reg.Registry, &tokens, .{.allocator = &arena.allocator});
switch (registry) {
.core => |parsed_core_registry| core_registry = parsed_core_registry,
.extension => |parsed_ext_registry| {
if (ext_registry_i == num_ext_registries) {
return error.NoCoreRegistry;
}
ext_registries[ext_registry_i] = parsed_ext_registry;
ext_registry_i += 1;
},
}
}
if (ext_registry_i != num_ext_registries) {
return error.MultipleCoreRegistries;
}
}