Zig field-level input validation errors
Zig
const std = @import("std");
const Input = struct { name: []const u8, email: []const u8, age: ?u32 };
const FieldError = struct { field: []const u8, message: []const u8 };
fn validate(in: Input, errs: *std.ArrayList(FieldError)) !void {
if (std.mem.trim(u8, in.name, " ").len == 0) try errs.append(.{ .field = "name", .message = "required" });
if (std.mem.indexOfScalar(u8, in.email, '@') == null) try errs.append(.{ .field = "email", .message = "invalid" });
if (in.age) |a| { if (a < 18) try errs.append(.{ .field = "age", .message = "must be 18+" }); }
}
pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
var errs = std.ArrayList(FieldError).init(gpa.allocator());
defer errs.deinit();
try validate(.{ .name = "", .email = "nope", .age = 15 }, &errs);
for (errs.items) |e| std.debug.print("{s}: {s}\n", .{ e.field, e.message });
}