feature. See also
. The project being documented here (as the example) is the Zig library itself.
Maker.printErrorMessages
pub fn printErrorMessages(
maker: *Maker,
failing_step_index: Configuration.Step.Index,
options: std.zig.ErrorBundle.RenderOptions,
stderr: Io.Terminal,
error_style: ErrorStyle,
multiline_errors: MultilineErrors,
) !void
File
Code
pub fn printErrorMessages(
maker: *Maker,
failing_step_index: Configuration.Step.Index,
options: std.zig.ErrorBundle.RenderOptions,
stderr: Io.Terminal,
error_style: ErrorStyle,
multiline_errors: MultilineErrors,
) !void {
const c = &maker.scanned_config.configuration;
const gpa = maker.gpa;
const writer = stderr.writer;
if (error_style.verboseContext()) {
// printing the corresponding Step subtree.
var step_stack: std.ArrayList(Configuration.Step.Index) = .empty;
defer step_stack.deinit(gpa);
try step_stack.append(gpa, failing_step_index);
while (true) {
const last_step = maker.stepByIndex(step_stack.items[step_stack.items.len - 1]);
if (last_step.dependants.items.len == 0) break;
try step_stack.append(gpa, last_step.dependants.items[0]);
}
try stderr.setColor(.dim);
var indent: usize = 0;
while (step_stack.pop()) |step_index| : (indent += 1) {
if (indent > 0) {
try writer.splatByteAll(' ', (indent - 1) * 3);
try printChildNodePrefix(stderr);
}
try writer.writeAll(step_index.ptr(c).name.slice(c));
if (step_index == failing_step_index) {
try printStepFailure(maker, step_index, stderr, true);
} else {
try writer.writeAll("\n");
}
}
try stderr.setColor(.reset);
} else {
try stderr.setColor(.dim);
try writer.writeAll(failing_step_index.ptr(c).name.slice(c));
try printStepFailure(maker, failing_step_index, stderr, true);
try stderr.setColor(.reset);
}
const failing_step = maker.stepByIndex(failing_step_index);
if (failing_step.result_stderr.len > 0) {
try writer.writeAll(failing_step.result_stderr);
if (!mem.endsWith(u8, failing_step.result_stderr, "\n")) {
try writer.writeAll("\n");
}
}
try failing_step.result_error_bundle.renderToTerminal(options, stderr);
for (failing_step.result_error_msgs.items) |msg| {
try stderr.setColor(.red);
try writer.writeAll("error:");
try stderr.setColor(.reset);
if (std.mem.indexOfScalar(u8, msg, '\n') == null) {
try writer.print(" {s}\n", .{msg});
} else switch (multiline_errors) {
.indent => {
var it = std.mem.splitScalar(u8, msg, '\n');
try writer.print(" {s}\n", .{it.first()});
while (it.next()) |line| {
try writer.print(" {s}\n", .{line});
}
},
.newline => try writer.print("\n{s}\n", .{msg}),
.none => try writer.print(" {s}\n", .{msg}),
}
}
if (error_style.verboseContext()) {
if (failing_step.result_failed_command) |cmd_str| {
try stderr.setColor(.red);
try writer.writeAll("failed command: ");
try stderr.setColor(.reset);
try writer.writeAll(cmd_str);
try writer.writeByte('\n');
}
}
if (failing_step.result_oom) {
try stderr.setColor(.red);
try writer.writeAll("error information missing due to allocation failure");
try stderr.setColor(.reset);
try writer.writeByte('\n');
}
try writer.writeByte('\n');
}