aboutsummaryrefslogtreecommitdiff
path: root/lib/std/Build/CheckFileStep.zig
blob: 5b2e5b4e5b9de58af2a95512225f9bb0e0810dba (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
const std = @import("../std.zig");
const Step = std.Build.Step;
const fs = std.fs;
const mem = std.mem;

const CheckFileStep = @This();

pub const base_id = .check_file;

step: Step,
builder: *std.Build,
expected_matches: []const []const u8,
source: std.Build.FileSource,
max_bytes: usize = 20 * 1024 * 1024,

pub fn create(
    builder: *std.Build,
    source: std.Build.FileSource,
    expected_matches: []const []const u8,
) *CheckFileStep {
    const self = builder.allocator.create(CheckFileStep) catch @panic("OOM");
    self.* = CheckFileStep{
        .builder = builder,
        .step = Step.init(builder.allocator, .{
            .id = .check_file,
            .name = "CheckFile",
            .makeFn = make,
        }),
        .source = source.dupe(builder),
        .expected_matches = builder.dupeStrings(expected_matches),
    };
    self.source.addStepDependencies(&self.step);
    return self;
}

fn make(step: *Step) !void {
    const self = @fieldParentPtr(CheckFileStep, "step", step);

    const src_path = self.source.getPath(self.builder);
    const contents = try fs.cwd().readFileAlloc(self.builder.allocator, src_path, self.max_bytes);

    for (self.expected_matches) |expected_match| {
        if (mem.indexOf(u8, contents, expected_match) == null) {
            std.debug.print(
                \\
                \\========= Expected to find: ===================
                \\{s}
                \\========= But file does not contain it: =======
                \\{s}
                \\
            , .{ expected_match, contents });
            return error.TestFailed;
        }
    }
}