master
 1const std = @import("std");
 2const expect = std.testing.expect;
 3const expectError = std.testing.expectError;
 4
 5fn isFieldOptional(comptime T: type, field_index: usize) !bool {
 6    const fields = @typeInfo(T).@"struct".fields;
 7    return switch (field_index) {
 8        // This prong is analyzed twice with `idx` being a
 9        // comptime-known value each time.
10        inline 0, 1 => |idx| @typeInfo(fields[idx].type) == .optional,
11        else => return error.IndexOutOfBounds,
12    };
13}
14
15const Struct1 = struct { a: u32, b: ?u32 };
16
17test "using @typeInfo with runtime values" {
18    var index: usize = 0;
19    try expect(!try isFieldOptional(Struct1, index));
20    index += 1;
21    try expect(try isFieldOptional(Struct1, index));
22    index += 1;
23    try expectError(error.IndexOutOfBounds, isFieldOptional(Struct1, index));
24}
25
26// Calls to `isFieldOptional` on `Struct1` get unrolled to an equivalent
27// of this function:
28fn isFieldOptionalUnrolled(field_index: usize) !bool {
29    return switch (field_index) {
30        0 => false,
31        1 => true,
32        else => return error.IndexOutOfBounds,
33    };
34}
35
36// test