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 }