feature. See also
. The project being documented here (as the example) is the Zig library itself.
Maker.loadManifest
fn loadManifest(
gpa: Allocator,
arena: Allocator,
io: Io,
options: LoadManifestOptions,
) !struct
File
Code
fn loadManifest(
gpa: Allocator,
arena: Allocator,
io: Io,
options: LoadManifestOptions,
) !struct { Package.Manifest, std.zig.Ast } {
const rng: std.Random.IoSource = .{ .io = io };
const manifest_bytes = while (true) {
break options.dir.readFileAllocOptions(
io,
Package.Manifest.basename,
arena,
.limited(Package.Manifest.max_bytes),
.@"1",
0,
) catch |err| switch (err) {
error.FileNotFound => {
Templates.writeSimpleFile(io, Package.Manifest.basename,
\\.{{
\\ .name = .{s},
\\ .version = "{s}",
\\ .paths = .{{""}},
\\ .fingerprint = 0x{x},
\\}}
\\
, .{
options.root_name,
builtin.zig_version_string,
Package.Fingerprint.generate(rng.interface(), options.root_name).int(),
}) catch |e| {
fatal("unable to write {s}: {t}", .{ Package.Manifest.basename, e });
};
continue;
},
else => |e| fatal("unable to load {s}: {t}", .{ Package.Manifest.basename, e }),
};
};
var ast = try std.zig.Ast.parse(gpa, manifest_bytes, .{ .mode = .zon });
errdefer ast.deinit(gpa);
if (ast.errors.len > 0) {
try std.zig.printAstErrorsToStderr(gpa, io, ast, Package.Manifest.basename, options.color);
process.exit(2);
}
var manifest = try Package.Manifest.parse(gpa, &ast, rng.interface(), .{});
errdefer manifest.deinit(gpa);
if (manifest.errors.len > 0) {
var wip_errors: std.zig.ErrorBundle.Wip = undefined;
try wip_errors.init(gpa);
defer wip_errors.deinit();
const src_path = try wip_errors.addString(Package.Manifest.basename);
try manifest.copyErrorsIntoBundle(ast, src_path, &wip_errors);
var error_bundle = try wip_errors.toOwnedBundle("");
defer error_bundle.deinit(gpa);
error_bundle.renderToStderr(io, .{}, options.color) catch {};
process.exit(2);
}
return .{ manifest, ast };
}