lib/chant/src/preprocess/run.zig

daab053ee43316e1809a84551d573ddd1e5bf3d2

 1 const std = @import("std");
 2 const sys = @import("sys");
 3 const embed = @import("embed.zig");
 4 const system = @import("system.zig");
 5 const types = @import("types.zig");
 6 
 7 const Error = types.Error;
 8 const Options = types.Options;
 9 const max_source_bytes = 16 * 1024 * 1024;
10 
11 pub fn run(
12     arena: std.mem.Allocator,
13     environ: std.process.Environ,
14     source_path: []const u8,
15     options: Options,
16     diagnostic: ?*types.Diagnostic,
17 ) Error![]const u8 {
18     var expander = try embed.Expander.init(arena, source_path, options);
19     const source = sys.fs.readFileAlloc(arena, source_path, max_source_bytes) catch |err| switch (err) {
20         error.OutOfMemory => return error.OutOfMemory,
21         else => return error.PreprocessFailed,
22     };
23     const prepared_source = try expander.prepare(source);
24     const prepared = if (expander.changed) try system.writeTemporary(arena, prepared_source) else types.Prepared{
25         .path = source_path,
26         .temporary = false,
27     };
28     defer if (prepared.temporary) sys.fs.cwd().deleteFile(sys.fs.debugIo(), prepared.path) catch {};
29     const preprocessed = try system.run(arena, environ, prepared.path, expander.source_dir, prepared.temporary, options, diagnostic);
30     return expander.expandOutput(preprocessed);
31 }