Zig 0.17.0-dev (Split by item)

This is an example of documentation generated by ZigDoc, an alternative to Zig's built-in Auto Doc feature. See also examples in other modes/formats. The project being documented here (as the example) is the Zig library itself.

renderErrorMessage

cli.renderErrorMessage
pub fn renderErrorMessage(t: Io.Terminal, err_details: Diagnostics.ErrorDetails, args: []const []const u8) !void

File

Code

pub fn renderErrorMessage(t: Io.Terminal, err_details: Diagnostics.ErrorDetails, args: []const []const u8) !void {
    const writer = t.writer;
    try t.setColor(.dim);
    try writer.writeAll("<cli>");
    try t.setColor(.reset);
    try t.setColor(.bold);
    try writer.writeAll(": ");
    switch (err_details.type) {
        .err => {
            try t.setColor(.red);
            try writer.writeAll("error: ");
        },
        .warning => {
            try t.setColor(.yellow);
            try writer.writeAll("warning: ");
        },
        .note => {
            try t.setColor(.cyan);
            try writer.writeAll("note: ");
        },
    }
    try t.setColor(.reset);
    try t.setColor(.bold);
    try writer.writeAll(err_details.msg.items);
    try writer.writeByte('\n');
    try t.setColor(.reset);

    if (!err_details.print_args) {
        try writer.writeByte('\n');
        return;
    }

    try t.setColor(.dim);
    const prefix = " ... ";
    try writer.writeAll(prefix);
    try t.setColor(.reset);

    const arg_with_name = args[err_details.arg_index];
    const prefix_slice = arg_with_name[0..err_details.arg_span.prefix_len];
    const before_name_slice = arg_with_name[err_details.arg_span.prefix_len..err_details.arg_span.name_offset];
    var name_slice = arg_with_name[err_details.arg_span.name_offset..];
    if (err_details.arg_span.name_len > 0) name_slice.len = err_details.arg_span.name_len;
    const after_name_slice = arg_with_name[err_details.arg_span.name_offset + name_slice.len ..];

    try writer.writeAll(prefix_slice);
    if (before_name_slice.len > 0) {
        try t.setColor(.dim);
        try writer.writeAll(before_name_slice);
        try t.setColor(.reset);
    }
    try writer.writeAll(name_slice);
    if (after_name_slice.len > 0) {
        try t.setColor(.dim);
        try writer.writeAll(after_name_slice);
        try t.setColor(.reset);
    }

    var next_arg_len: usize = 0;
    if (err_details.arg_span.point_at_next_arg and err_details.arg_index + 1 < args.len) {
        const next_arg = args[err_details.arg_index + 1];
        try writer.writeByte(' ');
        try writer.writeAll(next_arg);
        next_arg_len = next_arg.len;
    }

    const last_shown_arg_index = if (err_details.arg_span.point_at_next_arg) err_details.arg_index + 1 else err_details.arg_index;
    if (last_shown_arg_index + 1 < args.len) {
        // special case for when pointing to a missing value within the same arg
        // as the name
        if (err_details.arg_span.value_offset >= arg_with_name.len) {
            try writer.writeByte(' ');
        }
        try t.setColor(.dim);
        try writer.writeAll(" ...");
        try t.setColor(.reset);
    }
    try writer.writeByte('\n');

    try t.setColor(.green);
    try writer.splatByteAll(' ', prefix.len);
    // Special case for when the option is *only* a prefix (e.g. invalid option: -)
    if (err_details.arg_span.prefix_len == arg_with_name.len) {
        try writer.splatByteAll('^', err_details.arg_span.prefix_len);
    } else {
        try writer.splatByteAll('~', err_details.arg_span.prefix_len);
        try writer.splatByteAll(' ', err_details.arg_span.name_offset - err_details.arg_span.prefix_len);
        if (!err_details.arg_span.point_at_next_arg and err_details.arg_span.value_offset == 0) {
            try writer.writeByte('^');
            try writer.splatByteAll('~', name_slice.len - 1);
        } else if (err_details.arg_span.value_offset > 0) {
            try writer.splatByteAll('~', err_details.arg_span.value_offset - err_details.arg_span.name_offset);
            try writer.writeByte('^');
            if (err_details.arg_span.value_offset < arg_with_name.len) {
                try writer.splatByteAll('~', arg_with_name.len - err_details.arg_span.value_offset - 1);
            }
        } else if (err_details.arg_span.point_at_next_arg) {
            try writer.splatByteAll('~', arg_with_name.len - err_details.arg_span.name_offset + 1);
            try writer.writeByte('^');
            if (next_arg_len > 0) {
                try writer.splatByteAll('~', next_arg_len - 1);
            }
        }
    }
    try writer.writeByte('\n');
    try t.setColor(.reset);
}